Btrfs: Don't substract too much from the allocation target (avoid wrapping)
authorChris Mason <chris.mason@oracle.com>
Mon, 10 Nov 2008 12:26:33 +0000 (07:26 -0500)
committerChris Mason <chris.mason@oracle.com>
Mon, 10 Nov 2008 12:26:33 +0000 (07:26 -0500)
When metadata allocation clustering has to fall back to unclustered
allocs because large free areas could not be found, it was sometimes
substracting too much from the total bytes to allocate.  This would
make it wrap below zero.

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

index b92e92c29e3b6c66205208e5d42d54dfbc4b3324..2451717d36deef1399c33f68dfbeb0c0c14eb378 100644 (file)
@@ -2255,9 +2255,9 @@ new_group:
                mutex_unlock(&block_group->alloc_mutex);
 new_group_no_lock:
                last_wanted = 0;
-               if (!allowed_chunk_alloc && loop > 0) {
-                       total_needed -= empty_cluster;
-                       empty_cluster = 0;
+               if (!allowed_chunk_alloc) {
+                       total_needed -= empty_size;
+                       empty_size = 0;
                }
                /*
                 * Here's how this works.
@@ -2277,8 +2277,8 @@ new_group_no_lock:
                        loop++;
                } else if (loop == 1 && cur == head) {
 
-                       total_needed -= empty_cluster;
-                       empty_cluster = 0;
+                       total_needed -= empty_size;
+                       empty_size = 0;
 
                        if (allowed_chunk_alloc && !chunk_alloc_done) {
                                up_read(&space_info->groups_sem);