Btrfs: sparse files!

Signed-off-by: Chris Mason <chris.mason@oracle.com>
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index e3c6bfe..a366415 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -443,6 +443,7 @@
 	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 @@
 			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 @@
 	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 @@
 		 * 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);