Commit 6aafb303 authored by Naohiro Aota's avatar Naohiro Aota Committed by David Sterba

btrfs: parameterize dev_extent_min for chunk allocation

Currently, we ignore a device whose available space is less than
"BTRFS_STRIPE_LEN * dev_stripes". This is a lower limit for current
allocation policy (to maximize the number of stripes). This commit
parameterizes dev_extent_min, so that other policies can set their own
lower limitat to ignore a device with insufficient space.
Reviewed-by: default avatarJosef Bacik <josef@toxicpanda.com>
Signed-off-by: default avatarNaohiro Aota <naohiro.aota@wdc.com>
Reviewed-by: default avatarDavid Sterba <dsterba@suse.com>
Signed-off-by: default avatarDavid Sterba <dsterba@suse.com>
parent dce580ca
...@@ -4805,6 +4805,7 @@ struct alloc_chunk_ctl { ...@@ -4805,6 +4805,7 @@ struct alloc_chunk_ctl {
int nparity; int nparity;
u64 max_stripe_size; u64 max_stripe_size;
u64 max_chunk_size; u64 max_chunk_size;
u64 dev_extent_min;
u64 stripe_size; u64 stripe_size;
u64 chunk_size; u64 chunk_size;
int ndevs; int ndevs;
...@@ -4838,6 +4839,7 @@ static void init_alloc_chunk_ctl_policy_regular( ...@@ -4838,6 +4839,7 @@ static void init_alloc_chunk_ctl_policy_regular(
/* We don't want a chunk larger than 10% of writable space */ /* We don't want a chunk larger than 10% of writable space */
ctl->max_chunk_size = min(div_factor(fs_devices->total_rw_bytes, 1), ctl->max_chunk_size = min(div_factor(fs_devices->total_rw_bytes, 1),
ctl->max_chunk_size); ctl->max_chunk_size);
ctl->dev_extent_min = BTRFS_STRIPE_LEN * ctl->dev_stripes;
} }
static void init_alloc_chunk_ctl(struct btrfs_fs_devices *fs_devices, static void init_alloc_chunk_ctl(struct btrfs_fs_devices *fs_devices,
...@@ -4873,7 +4875,6 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices, ...@@ -4873,7 +4875,6 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices,
struct btrfs_device *device; struct btrfs_device *device;
u64 total_avail; u64 total_avail;
u64 dev_extent_want = ctl->max_stripe_size * ctl->dev_stripes; u64 dev_extent_want = ctl->max_stripe_size * ctl->dev_stripes;
u64 dev_extent_min = BTRFS_STRIPE_LEN * ctl->dev_stripes;
int ret; int ret;
int ndevs = 0; int ndevs = 0;
u64 max_avail; u64 max_avail;
...@@ -4901,7 +4902,7 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices, ...@@ -4901,7 +4902,7 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices,
total_avail = 0; total_avail = 0;
/* If there is no space on this device, skip it. */ /* If there is no space on this device, skip it. */
if (total_avail == 0) if (total_avail < ctl->dev_extent_min)
continue; continue;
ret = find_free_dev_extent(device, dev_extent_want, &dev_offset, ret = find_free_dev_extent(device, dev_extent_want, &dev_offset,
...@@ -4912,12 +4913,12 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices, ...@@ -4912,12 +4913,12 @@ static int gather_device_info(struct btrfs_fs_devices *fs_devices,
if (ret == 0) if (ret == 0)
max_avail = dev_extent_want; max_avail = dev_extent_want;
if (max_avail < dev_extent_min) { if (max_avail < ctl->dev_extent_min) {
if (btrfs_test_opt(info, ENOSPC_DEBUG)) if (btrfs_test_opt(info, ENOSPC_DEBUG))
btrfs_debug(info, btrfs_debug(info,
"%s: devid %llu has no free space, have=%llu want=%llu", "%s: devid %llu has no free space, have=%llu want=%llu",
__func__, device->devid, max_avail, __func__, device->devid, max_avail,
dev_extent_min); ctl->dev_extent_min);
continue; continue;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment