Btrfs: Properly update free space cache in __free_extent
authorYan <yanzheng@21cn.com>
Tue, 6 Nov 2007 15:25:25 +0000 (10:25 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:57 +0000 (11:03 -0400)
When pin_down_bytes decides not to pin a block because it was from the
current transaction, make sure the in memory cache of free extents is updated

Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c

index e7192ea8f96c55649b34cf9a8816fd47022dfe6b..9eb2ee02f6433c82f8b4f2b68d4dae76d94fe9be 100644 (file)
@@ -714,7 +714,7 @@ static int pin_down_bytes(struct btrfs_root *root, u64 bytenr, u32 num_bytes,
                                    root->fs_info->running_transaction->transid;
                                if (btrfs_header_generation(buf) == transid) {
                                        free_extent_buffer(buf);
-                                       return 0;
+                                       return 1;
                                }
                        }
                        free_extent_buffer(buf);
@@ -774,7 +774,9 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
 
                if (pin) {
                        ret = pin_down_bytes(root, bytenr, num_bytes, 0);
-                       BUG_ON(ret);
+                       if (ret > 0)
+                               mark_free = 1;
+                       BUG_ON(ret < 0);
                }
 
                /* block accounting for super block */