aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/btrfs/volumes.c17
1 files changed, 13 insertions, 4 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index a595f8775c37..46f9a208723d 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -863,6 +863,7 @@ int find_free_dev_extent(struct btrfs_trans_handle *trans,
863 863
864 max_hole_start = search_start; 864 max_hole_start = search_start;
865 max_hole_size = 0; 865 max_hole_size = 0;
866 hole_size = 0;
866 867
867 if (search_start >= search_end) { 868 if (search_start >= search_end) {
868 ret = -ENOSPC; 869 ret = -ENOSPC;
@@ -945,7 +946,14 @@ next:
945 cond_resched(); 946 cond_resched();
946 } 947 }
947 948
948 hole_size = search_end- search_start; 949 /*
950 * At this point, search_start should be the end of
951 * allocated dev extents, and when shrinking the device,
952 * search_end may be smaller than search_start.
953 */
954 if (search_end > search_start)
955 hole_size = search_end - search_start;
956
949 if (hole_size > max_hole_size) { 957 if (hole_size > max_hole_size) {
950 max_hole_start = search_start; 958 max_hole_start = search_start;
951 max_hole_size = hole_size; 959 max_hole_size = hole_size;
@@ -2447,9 +2455,10 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
2447 total_avail = device->total_bytes - device->bytes_used; 2455 total_avail = device->total_bytes - device->bytes_used;
2448 else 2456 else
2449 total_avail = 0; 2457 total_avail = 0;
2450 /* avail is off by max(alloc_start, 1MB), but that is the same 2458
2451 * for all devices, so it doesn't hurt the sorting later on 2459 /* If there is no space on this device, skip it. */
2452 */ 2460 if (total_avail == 0)
2461 continue;
2453 2462
2454 ret = find_free_dev_extent(trans, device, 2463 ret = find_free_dev_extent(trans, device,
2455 max_stripe_size * dev_stripes, 2464 max_stripe_size * dev_stripes,