|
@@ -721,7 +721,8 @@ error:
|
|
|
*/
|
|
|
static noinline int find_free_dev_extent(struct btrfs_trans_handle *trans,
|
|
|
struct btrfs_device *device,
|
|
|
- u64 num_bytes, u64 *start)
|
|
|
+ u64 num_bytes, u64 *start,
|
|
|
+ u64 *max_avail)
|
|
|
{
|
|
|
struct btrfs_key key;
|
|
|
struct btrfs_root *root = device->dev_root;
|
|
@@ -807,6 +808,10 @@ no_more_items:
|
|
|
if (last_byte < search_start)
|
|
|
last_byte = search_start;
|
|
|
hole_size = key.offset - last_byte;
|
|
|
+
|
|
|
+ if (hole_size > *max_avail)
|
|
|
+ *max_avail = hole_size;
|
|
|
+
|
|
|
if (key.offset > last_byte &&
|
|
|
hole_size >= num_bytes) {
|
|
|
*start = last_byte;
|
|
@@ -1625,6 +1630,7 @@ static int __btrfs_grow_device(struct btrfs_trans_handle *trans,
|
|
|
device->fs_devices->total_rw_bytes += diff;
|
|
|
|
|
|
device->total_bytes = new_size;
|
|
|
+ device->disk_total_bytes = new_size;
|
|
|
btrfs_clear_space_info_full(device->dev_root->fs_info);
|
|
|
|
|
|
return btrfs_update_device(trans, device);
|
|
@@ -2175,6 +2181,7 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
|
|
|
max_chunk_size);
|
|
|
|
|
|
again:
|
|
|
+ max_avail = 0;
|
|
|
if (!map || map->num_stripes != num_stripes) {
|
|
|
kfree(map);
|
|
|
map = kmalloc(map_lookup_size(num_stripes), GFP_NOFS);
|
|
@@ -2223,7 +2230,8 @@ again:
|
|
|
|
|
|
if (device->in_fs_metadata && avail >= min_free) {
|
|
|
ret = find_free_dev_extent(trans, device,
|
|
|
- min_free, &dev_offset);
|
|
|
+ min_free, &dev_offset,
|
|
|
+ &max_avail);
|
|
|
if (ret == 0) {
|
|
|
list_move_tail(&device->dev_alloc_list,
|
|
|
&private_devs);
|