Btrfs: empty_size allocation fixes again
authorChris Mason <chris.mason@oracle.com>
Mon, 10 Nov 2008 21:13:54 +0000 (16:13 -0500)
committerChris Mason <chris.mason@oracle.com>
Mon, 10 Nov 2008 21:13:54 +0000 (16:13 -0500)
The allocator wasn't catching all of the cases where it needed to do
extra loops because the check to enforce them wasn't happening early
enough.

When the allocator decided to increase the size of the allocation
for metadata clustering, it wasn't always setting the empty_size to
include the extra (optional) bytes.  This also fixes the empty_size field
to be correct.

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

index 55d6a66c622d1ef7676ef02681d6131b976782be..b7530c3ac2063593c904ed52030ea9effd1e7d3f 100644 (file)
@@ -2174,6 +2174,9 @@ static int noinline find_free_extent(struct btrfs_trans_handle *trans,
                 * group thats not of the proper type, while looping this
                 * should never happen
                 */
+               if (empty_size)
+                       extra_loop = 1;
+
                if (!block_group)
                        goto new_group_no_lock;
 
@@ -2192,9 +2195,6 @@ static int noinline find_free_extent(struct btrfs_trans_handle *trans,
 
                free_space = btrfs_find_free_space(block_group, search_start,
                                                   total_needed);
-               if (empty_size)
-                       extra_loop = 1;
-
                if (free_space) {
                        u64 start = block_group->key.objectid;
                        u64 end = block_group->key.objectid +
@@ -2212,6 +2212,7 @@ static int noinline find_free_extent(struct btrfs_trans_handle *trans,
 
                        if (last_wanted && search_start != last_wanted) {
                                total_needed += empty_cluster;
+                               empty_size += empty_cluster;
                                last_wanted = 0;
                                /*
                                 * if search_start is still in this block group