diff options
-rw-r--r-- | fs/btrfs/volumes.c | 17 |
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, |