diff options
-rw-r--r-- | fs/btrfs/extent-tree.c | 48 |
1 files changed, 25 insertions, 23 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 0d0a3fe77bb7..b42efc2ded51 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c | |||
@@ -5218,9 +5218,7 @@ loop: | |||
5218 | * LOOP_NO_EMPTY_SIZE, set empty_size and empty_cluster to 0 and try | 5218 | * LOOP_NO_EMPTY_SIZE, set empty_size and empty_cluster to 0 and try |
5219 | * again | 5219 | * again |
5220 | */ | 5220 | */ |
5221 | if (!ins->objectid && loop < LOOP_NO_EMPTY_SIZE && | 5221 | if (!ins->objectid && loop < LOOP_NO_EMPTY_SIZE) { |
5222 | (found_uncached_bg || empty_size || empty_cluster || | ||
5223 | allowed_chunk_alloc)) { | ||
5224 | index = 0; | 5222 | index = 0; |
5225 | if (loop == LOOP_FIND_IDEAL && found_uncached_bg) { | 5223 | if (loop == LOOP_FIND_IDEAL && found_uncached_bg) { |
5226 | found_uncached_bg = false; | 5224 | found_uncached_bg = false; |
@@ -5260,32 +5258,36 @@ loop: | |||
5260 | goto search; | 5258 | goto search; |
5261 | } | 5259 | } |
5262 | 5260 | ||
5263 | if (loop < LOOP_CACHING_WAIT) { | 5261 | loop++; |
5264 | loop++; | ||
5265 | goto search; | ||
5266 | } | ||
5267 | 5262 | ||
5268 | if (loop == LOOP_ALLOC_CHUNK) { | 5263 | if (loop == LOOP_ALLOC_CHUNK) { |
5269 | empty_size = 0; | 5264 | if (allowed_chunk_alloc) { |
5270 | empty_cluster = 0; | 5265 | ret = do_chunk_alloc(trans, root, num_bytes + |
5271 | } | 5266 | 2 * 1024 * 1024, data, |
5267 | CHUNK_ALLOC_LIMITED); | ||
5268 | allowed_chunk_alloc = 0; | ||
5269 | if (ret == 1) | ||
5270 | done_chunk_alloc = 1; | ||
5271 | } else if (!done_chunk_alloc && | ||
5272 | space_info->force_alloc == | ||
5273 | CHUNK_ALLOC_NO_FORCE) { | ||
5274 | space_info->force_alloc = CHUNK_ALLOC_LIMITED; | ||
5275 | } | ||
5272 | 5276 | ||
5273 | if (allowed_chunk_alloc) { | 5277 | /* |
5274 | ret = do_chunk_alloc(trans, root, num_bytes + | 5278 | * We didn't allocate a chunk, go ahead and drop the |
5275 | 2 * 1024 * 1024, data, | 5279 | * empty size and loop again. |
5276 | CHUNK_ALLOC_LIMITED); | 5280 | */ |
5277 | allowed_chunk_alloc = 0; | 5281 | if (!done_chunk_alloc) |
5278 | done_chunk_alloc = 1; | 5282 | loop = LOOP_NO_EMPTY_SIZE; |
5279 | } else if (!done_chunk_alloc && | ||
5280 | space_info->force_alloc == CHUNK_ALLOC_NO_FORCE) { | ||
5281 | space_info->force_alloc = CHUNK_ALLOC_LIMITED; | ||
5282 | } | 5283 | } |
5283 | 5284 | ||
5284 | if (loop < LOOP_NO_EMPTY_SIZE) { | 5285 | if (loop == LOOP_NO_EMPTY_SIZE) { |
5285 | loop++; | 5286 | empty_size = 0; |
5286 | goto search; | 5287 | empty_cluster = 0; |
5287 | } | 5288 | } |
5288 | ret = -ENOSPC; | 5289 | |
5290 | goto search; | ||
5289 | } else if (!ins->objectid) { | 5291 | } else if (!ins->objectid) { |
5290 | ret = -ENOSPC; | 5292 | ret = -ENOSPC; |
5291 | } else if (ins->objectid) { | 5293 | } else if (ins->objectid) { |