summaryrefslogtreecommitdiffstats
path: root/fs/btrfs/extent-tree.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2007-05-24 13:35:57 -0400
committerDavid Woodhouse <dwmw2@hera.kernel.org>2007-05-24 13:35:57 -0400
commit3a686375629da5d2e2ad019265b66ef113c87455 (patch)
tree1fbbedfcb92aeea38d90955ef11975187ddcc6f3 /fs/btrfs/extent-tree.c
parent2b8d99a723a3186a69b5bd941a272dbecae9205b (diff)
downloadlinux-stable-3a686375629da5d2e2ad019265b66ef113c87455.tar.gz
linux-stable-3a686375629da5d2e2ad019265b66ef113c87455.tar.bz2
linux-stable-3a686375629da5d2e2ad019265b66ef113c87455.zip
Btrfs: sparse files!
Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/extent-tree.c')
-rw-r--r--fs/btrfs/extent-tree.c14
1 files changed, 10 insertions, 4 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index e3c6bfea3751..a366415e03a6 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -443,6 +443,7 @@ int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
buf_leaf = btrfs_buffer_leaf(buf);
for (i = 0; i < btrfs_header_nritems(&buf_node->header); i++) {
if (leaf) {
+ u64 disk_blocknr;
key = &buf_leaf->items[i].key;
if (btrfs_disk_key_type(key) != BTRFS_EXTENT_DATA_KEY)
continue;
@@ -451,8 +452,10 @@ int btrfs_inc_ref(struct btrfs_trans_handle *trans, struct btrfs_root *root,
if (btrfs_file_extent_type(fi) ==
BTRFS_FILE_EXTENT_INLINE)
continue;
- ret = btrfs_inc_extent_ref(trans, root,
- btrfs_file_extent_disk_blocknr(fi),
+ disk_blocknr = btrfs_file_extent_disk_blocknr(fi);
+ if (disk_blocknr == 0)
+ continue;
+ ret = btrfs_inc_extent_ref(trans, root, disk_blocknr,
btrfs_file_extent_disk_num_blocks(fi));
BUG_ON(ret);
} else {
@@ -1248,6 +1251,7 @@ static int drop_leaf_ref(struct btrfs_trans_handle *trans,
leaf = btrfs_buffer_leaf(cur);
nritems = btrfs_header_nritems(&leaf->header);
for (i = 0; i < nritems; i++) {
+ u64 disk_blocknr;
key = &leaf->items[i].key;
if (btrfs_disk_key_type(key) != BTRFS_EXTENT_DATA_KEY)
continue;
@@ -1258,8 +1262,10 @@ static int drop_leaf_ref(struct btrfs_trans_handle *trans,
* FIXME make sure to insert a trans record that
* repeats the snapshot del on crash
*/
- ret = btrfs_free_extent(trans, root,
- btrfs_file_extent_disk_blocknr(fi),
+ disk_blocknr = btrfs_file_extent_disk_blocknr(fi);
+ if (disk_blocknr == 0)
+ continue;
+ ret = btrfs_free_extent(trans, root, disk_blocknr,
btrfs_file_extent_disk_num_blocks(fi),
0);
BUG_ON(ret);