Message ID | 20200206104214.400857-6-naohiro.aota@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: refactor and generalize chunk/dev_extent/extent allocation | expand |
Looks good,
Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
On 2/6/20 5:41 AM, Naohiro Aota wrote: > Factor out set_parameters() from __btrfs_alloc_chunk(). This function > initialises parameters of "struct alloc_chunk_ctl" for allocation. > set_parameters() handles a common part of the initialisation to load the > RAID parameters from btrfs_raid_array. set_parameters_regular() decides > some parameters for its allocation. > > Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> > --- > fs/btrfs/volumes.c | 96 ++++++++++++++++++++++++++++------------------ > 1 file changed, 59 insertions(+), 37 deletions(-) > > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > index cfde302bf297..a5d6f0b5ca70 100644 > --- a/fs/btrfs/volumes.c > +++ b/fs/btrfs/volumes.c > @@ -4841,6 +4841,60 @@ struct alloc_chunk_ctl { > int ndevs; > }; > > +static void set_parameters_regular(struct btrfs_fs_devices *fs_devices, > + struct alloc_chunk_ctl *ctl) init_alloc_chunk_ctl_policy_regular() > +{ > + u64 type = ctl->type; > + > + if (type & BTRFS_BLOCK_GROUP_DATA) { > + ctl->max_stripe_size = SZ_1G; > + ctl->max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE; > + } else if (type & BTRFS_BLOCK_GROUP_METADATA) { > + /* for larger filesystems, use larger metadata chunks */ > + if (fs_devices->total_rw_bytes > 50ULL * SZ_1G) > + ctl->max_stripe_size = SZ_1G; > + else > + ctl->max_stripe_size = SZ_256M; > + ctl->max_chunk_size = ctl->max_stripe_size; > + } else if (type & BTRFS_BLOCK_GROUP_SYSTEM) { > + ctl->max_stripe_size = SZ_32M; > + ctl->max_chunk_size = 2 * ctl->max_stripe_size; > + ctl->devs_max = min_t(int, ctl->devs_max, > + BTRFS_MAX_DEVS_SYS_CHUNK); > + } else { > + BUG(); > + } > + > + /* 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); > +} > + > +static void set_parameters(struct btrfs_fs_devices *fs_devices, > + struct alloc_chunk_ctl *ctl) init_alloc_chunk_ctl(). These function names need to be more descriptive. Thanks, Josef
On Thu, Feb 06, 2020 at 11:40:37AM -0500, Josef Bacik wrote: >On 2/6/20 5:41 AM, Naohiro Aota wrote: >>Factor out set_parameters() from __btrfs_alloc_chunk(). This function >>initialises parameters of "struct alloc_chunk_ctl" for allocation. >>set_parameters() handles a common part of the initialisation to load the >>RAID parameters from btrfs_raid_array. set_parameters_regular() decides >>some parameters for its allocation. >> >>Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> >>--- >> fs/btrfs/volumes.c | 96 ++++++++++++++++++++++++++++------------------ >> 1 file changed, 59 insertions(+), 37 deletions(-) >> >>diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c >>index cfde302bf297..a5d6f0b5ca70 100644 >>--- a/fs/btrfs/volumes.c >>+++ b/fs/btrfs/volumes.c >>@@ -4841,6 +4841,60 @@ struct alloc_chunk_ctl { >> int ndevs; >> }; >>+static void set_parameters_regular(struct btrfs_fs_devices *fs_devices, >>+ struct alloc_chunk_ctl *ctl) > >init_alloc_chunk_ctl_policy_regular() > >>+{ >>+ u64 type = ctl->type; >>+ >>+ if (type & BTRFS_BLOCK_GROUP_DATA) { >>+ ctl->max_stripe_size = SZ_1G; >>+ ctl->max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE; >>+ } else if (type & BTRFS_BLOCK_GROUP_METADATA) { >>+ /* for larger filesystems, use larger metadata chunks */ >>+ if (fs_devices->total_rw_bytes > 50ULL * SZ_1G) >>+ ctl->max_stripe_size = SZ_1G; >>+ else >>+ ctl->max_stripe_size = SZ_256M; >>+ ctl->max_chunk_size = ctl->max_stripe_size; >>+ } else if (type & BTRFS_BLOCK_GROUP_SYSTEM) { >>+ ctl->max_stripe_size = SZ_32M; >>+ ctl->max_chunk_size = 2 * ctl->max_stripe_size; >>+ ctl->devs_max = min_t(int, ctl->devs_max, >>+ BTRFS_MAX_DEVS_SYS_CHUNK); >>+ } else { >>+ BUG(); >>+ } >>+ >>+ /* 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); >>+} >>+ >>+static void set_parameters(struct btrfs_fs_devices *fs_devices, >>+ struct alloc_chunk_ctl *ctl) > >init_alloc_chunk_ctl(). These function names need to be more descriptive. Thanks, I see. I renamed these two. Thanks,
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index cfde302bf297..a5d6f0b5ca70 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -4841,6 +4841,60 @@ struct alloc_chunk_ctl { int ndevs; }; +static void set_parameters_regular(struct btrfs_fs_devices *fs_devices, + struct alloc_chunk_ctl *ctl) +{ + u64 type = ctl->type; + + if (type & BTRFS_BLOCK_GROUP_DATA) { + ctl->max_stripe_size = SZ_1G; + ctl->max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE; + } else if (type & BTRFS_BLOCK_GROUP_METADATA) { + /* for larger filesystems, use larger metadata chunks */ + if (fs_devices->total_rw_bytes > 50ULL * SZ_1G) + ctl->max_stripe_size = SZ_1G; + else + ctl->max_stripe_size = SZ_256M; + ctl->max_chunk_size = ctl->max_stripe_size; + } else if (type & BTRFS_BLOCK_GROUP_SYSTEM) { + ctl->max_stripe_size = SZ_32M; + ctl->max_chunk_size = 2 * ctl->max_stripe_size; + ctl->devs_max = min_t(int, ctl->devs_max, + BTRFS_MAX_DEVS_SYS_CHUNK); + } else { + BUG(); + } + + /* 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); +} + +static void set_parameters(struct btrfs_fs_devices *fs_devices, + struct alloc_chunk_ctl *ctl) +{ + int index = btrfs_bg_flags_to_raid_index(ctl->type); + + ctl->sub_stripes = btrfs_raid_array[index].sub_stripes; + ctl->dev_stripes = btrfs_raid_array[index].dev_stripes; + ctl->devs_max = btrfs_raid_array[index].devs_max; + if (!ctl->devs_max) + ctl->devs_max = BTRFS_MAX_DEVS(fs_devices->fs_info); + ctl->devs_min = btrfs_raid_array[index].devs_min; + ctl->devs_increment = btrfs_raid_array[index].devs_increment; + ctl->ncopies = btrfs_raid_array[index].ncopies; + ctl->nparity = btrfs_raid_array[index].nparity; + ctl->ndevs = 0; + + switch (fs_devices->chunk_alloc_policy) { + case BTRFS_CHUNK_ALLOC_REGULAR: + set_parameters_regular(fs_devices, ctl); + break; + default: + BUG(); + } +} + static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, u64 start, u64 type) { @@ -4859,7 +4913,6 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, int ndevs; int i; int j; - int index; BUG_ON(!alloc_profile_is_valid(type, 0)); @@ -4869,45 +4922,14 @@ static int __btrfs_alloc_chunk(struct btrfs_trans_handle *trans, return -ENOSPC; } - ctl.start = start; - ctl.type = type; - - index = btrfs_bg_flags_to_raid_index(type); - - ctl.sub_stripes = btrfs_raid_array[index].sub_stripes; - ctl.dev_stripes = btrfs_raid_array[index].dev_stripes; - ctl.devs_max = btrfs_raid_array[index].devs_max; - if (!ctl.devs_max) - ctl.devs_max = BTRFS_MAX_DEVS(info); - ctl.devs_min = btrfs_raid_array[index].devs_min; - ctl.devs_increment = btrfs_raid_array[index].devs_increment; - ctl.ncopies = btrfs_raid_array[index].ncopies; - ctl.nparity = btrfs_raid_array[index].nparity; - - if (type & BTRFS_BLOCK_GROUP_DATA) { - ctl.max_stripe_size = SZ_1G; - ctl.max_chunk_size = BTRFS_MAX_DATA_CHUNK_SIZE; - } else if (type & BTRFS_BLOCK_GROUP_METADATA) { - /* for larger filesystems, use larger metadata chunks */ - if (fs_devices->total_rw_bytes > 50ULL * SZ_1G) - ctl.max_stripe_size = SZ_1G; - else - ctl.max_stripe_size = SZ_256M; - ctl.max_chunk_size = ctl.max_stripe_size; - } else if (type & BTRFS_BLOCK_GROUP_SYSTEM) { - ctl.max_stripe_size = SZ_32M; - ctl.max_chunk_size = 2 * ctl.max_stripe_size; - ctl.devs_max = min_t(int, ctl.devs_max, - BTRFS_MAX_DEVS_SYS_CHUNK); - } else { - btrfs_err(info, "invalid chunk type 0x%llx requested", - type); + if (!(type & BTRFS_BLOCK_GROUP_TYPE_MASK)) { + btrfs_err(info, "invalid chunk type 0x%llx requested", type); BUG(); } - /* 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); + ctl.start = start; + ctl.type = type; + set_parameters(fs_devices, &ctl); devices_info = kcalloc(fs_devices->rw_devices, sizeof(*devices_info), GFP_NOFS);
Factor out set_parameters() from __btrfs_alloc_chunk(). This function initialises parameters of "struct alloc_chunk_ctl" for allocation. set_parameters() handles a common part of the initialisation to load the RAID parameters from btrfs_raid_array. set_parameters_regular() decides some parameters for its allocation. Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> --- fs/btrfs/volumes.c | 96 ++++++++++++++++++++++++++++------------------ 1 file changed, 59 insertions(+), 37 deletions(-)