Browse Source

Btrfs: Don't substract too much from the allocation target (avoid wrapping)

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>
Chris Mason 16 years ago
parent
commit
5b7c3fcc46
1 changed files with 5 additions and 5 deletions
  1. 5 5
      fs/btrfs/extent-tree.c

+ 5 - 5
fs/btrfs/extent-tree.c

@@ -2255,9 +2255,9 @@ new_group:
 		mutex_unlock(&block_group->alloc_mutex);
 		mutex_unlock(&block_group->alloc_mutex);
 new_group_no_lock:
 new_group_no_lock:
 		last_wanted = 0;
 		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.
 		 * Here's how this works.
@@ -2277,8 +2277,8 @@ new_group_no_lock:
 			loop++;
 			loop++;
 		} else if (loop == 1 && cur == head) {
 		} 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) {
 			if (allowed_chunk_alloc && !chunk_alloc_done) {
 				up_read(&space_info->groups_sem);
 				up_read(&space_info->groups_sem);