Message ID | e9c33853d3095c61b982bfb23bd313d8641d6797.1744813603.git.naohiro.aota@wdc.com (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | btrfs: zoned: split out space_info for dedicated block groups | expand |
On Wed, Apr 16, 2025 at 11:28:12PM +0900, Naohiro Aota wrote: > Add btrfs_space_info parameter to btrfs_make_block_group(), its related > functions and related struct. Passed space_info will have a new block > group. If NULL is passed, it uses the default space_info. > > The parameter is used in a later commit and the behavior is unchanged now. > > Signed-off-by: Naohiro Aota <naohiro.aota@wdc.com> > Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> > --- > fs/btrfs/block-group.c | 18 ++++++++++-------- > fs/btrfs/block-group.h | 4 ++-- > fs/btrfs/volumes.c | 22 +++++++++++++++++----- > fs/btrfs/volumes.h | 3 ++- > 4 files changed, 31 insertions(+), 16 deletions(-) > > diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c > index 12cc9069d4bb..846c9737ff5a 100644 > --- a/fs/btrfs/block-group.c > +++ b/fs/btrfs/block-group.c > @@ -2866,8 +2866,8 @@ static u64 calculate_global_root_id(const struct btrfs_fs_info *fs_info, u64 off > } > > struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *trans, > - u64 type, > - u64 chunk_offset, u64 size) > + struct btrfs_space_info *space_info, > + u64 type, u64 chunk_offset, u64 size) > { > struct btrfs_fs_info *fs_info = trans->fs_info; > struct btrfs_block_group *cache; > @@ -2921,7 +2921,7 @@ struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *tran > * assigned to our block group. We want our bg to be added to the rbtree > * with its ->space_info set. > */ > - cache->space_info = btrfs_find_space_info(fs_info, cache->flags); > + cache->space_info = space_info; > ASSERT(cache->space_info); > > ret = btrfs_add_block_group_cache(cache); > @@ -3902,7 +3902,9 @@ int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans, u64 type) > return btrfs_chunk_alloc(trans, NULL, alloc_flags, CHUNK_ALLOC_FORCE); > } > > -static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans, u64 flags) > +static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans, > + struct btrfs_space_info *space_info, > + u64 flags) > { > struct btrfs_block_group *bg; > int ret; > @@ -3915,7 +3917,7 @@ static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans > */ > check_system_chunk(trans, flags); > > - bg = btrfs_create_chunk(trans, flags); > + bg = btrfs_create_chunk(trans, space_info, flags); > if (IS_ERR(bg)) { > ret = PTR_ERR(bg); > goto out; > @@ -3964,7 +3966,7 @@ static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans > const u64 sys_flags = btrfs_system_alloc_profile(trans->fs_info); > struct btrfs_block_group *sys_bg; > > - sys_bg = btrfs_create_chunk(trans, sys_flags); > + sys_bg = btrfs_create_chunk(trans, NULL, sys_flags); > if (IS_ERR(sys_bg)) { > ret = PTR_ERR(sys_bg); > btrfs_abort_transaction(trans, ret); > @@ -4214,7 +4216,7 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, > force_metadata_allocation(fs_info); > } > > - ret_bg = do_chunk_alloc(trans, flags); > + ret_bg = do_chunk_alloc(trans, space_info, flags); > trans->allocating_chunk = false; > > if (IS_ERR(ret_bg)) { > @@ -4297,7 +4299,7 @@ static void reserve_chunk_space(struct btrfs_trans_handle *trans, > * the paths we visit in the chunk tree (they were already COWed > * or created in the current transaction for example). > */ > - bg = btrfs_create_chunk(trans, flags); > + bg = btrfs_create_chunk(trans, NULL, flags); > if (IS_ERR(bg)) { > ret = PTR_ERR(bg); > } else { > diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h > index c01f3af726a1..35309b690d6f 100644 > --- a/fs/btrfs/block-group.h > +++ b/fs/btrfs/block-group.h > @@ -326,8 +326,8 @@ void btrfs_reclaim_bgs(struct btrfs_fs_info *fs_info); > void btrfs_mark_bg_to_reclaim(struct btrfs_block_group *bg); > int btrfs_read_block_groups(struct btrfs_fs_info *info); > struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *trans, > - u64 type, > - u64 chunk_offset, u64 size); > + struct btrfs_space_info *space_info, > + u64 type, u64 chunk_offset, u64 size); > void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans); > int btrfs_inc_block_group_ro(struct btrfs_block_group *cache, > bool do_chunk_alloc); > diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c > index 7509cbe3272c..5462c832ea19 100644 > --- a/fs/btrfs/volumes.c > +++ b/fs/btrfs/volumes.c > @@ -3420,7 +3420,7 @@ int btrfs_remove_chunk(struct btrfs_trans_handle *trans, u64 chunk_offset) > const u64 sys_flags = btrfs_system_alloc_profile(fs_info); > struct btrfs_block_group *sys_bg; > > - sys_bg = btrfs_create_chunk(trans, sys_flags); > + sys_bg = btrfs_create_chunk(trans, NULL, sys_flags); > if (IS_ERR(sys_bg)) { > ret = PTR_ERR(sys_bg); > btrfs_abort_transaction(trans, ret); > @@ -5216,6 +5216,8 @@ struct alloc_chunk_ctl { > u64 stripe_size; > u64 chunk_size; > int ndevs; > + /* Space_info the block group is going to belong. */ > + struct btrfs_space_info *space_info; > }; > > static void init_alloc_chunk_ctl_policy_regular( > @@ -5617,7 +5619,8 @@ static struct btrfs_block_group *create_chunk(struct btrfs_trans_handle *trans, > return ERR_PTR(ret); > } > > - block_group = btrfs_make_block_group(trans, type, start, ctl->chunk_size); > + block_group = btrfs_make_block_group(trans, ctl->space_info, type, start, > + ctl->chunk_size); > if (IS_ERR(block_group)) { > btrfs_remove_chunk_map(info, map); > return block_group; > @@ -5643,7 +5646,8 @@ static struct btrfs_block_group *create_chunk(struct btrfs_trans_handle *trans, > } > > struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans, > - u64 type) > + struct btrfs_space_info *space_info, > + u64 type) > { > struct btrfs_fs_info *info = trans->fs_info; > struct btrfs_fs_devices *fs_devices = info->fs_devices; > @@ -5671,8 +5675,16 @@ struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans, > return ERR_PTR(-EINVAL); > } > > + if (!space_info) { > + space_info = btrfs_find_space_info(info, type); > + if (!space_info) { > + ASSERT(0); > + return ERR_PTR(-EINVAL); > + } > + } Same comment here, make everybody send down the space_info instead of it being optional. Thanks, Josef
diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 12cc9069d4bb..846c9737ff5a 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -2866,8 +2866,8 @@ static u64 calculate_global_root_id(const struct btrfs_fs_info *fs_info, u64 off } struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *trans, - u64 type, - u64 chunk_offset, u64 size) + struct btrfs_space_info *space_info, + u64 type, u64 chunk_offset, u64 size) { struct btrfs_fs_info *fs_info = trans->fs_info; struct btrfs_block_group *cache; @@ -2921,7 +2921,7 @@ struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *tran * assigned to our block group. We want our bg to be added to the rbtree * with its ->space_info set. */ - cache->space_info = btrfs_find_space_info(fs_info, cache->flags); + cache->space_info = space_info; ASSERT(cache->space_info); ret = btrfs_add_block_group_cache(cache); @@ -3902,7 +3902,9 @@ int btrfs_force_chunk_alloc(struct btrfs_trans_handle *trans, u64 type) return btrfs_chunk_alloc(trans, NULL, alloc_flags, CHUNK_ALLOC_FORCE); } -static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans, u64 flags) +static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans, + struct btrfs_space_info *space_info, + u64 flags) { struct btrfs_block_group *bg; int ret; @@ -3915,7 +3917,7 @@ static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans */ check_system_chunk(trans, flags); - bg = btrfs_create_chunk(trans, flags); + bg = btrfs_create_chunk(trans, space_info, flags); if (IS_ERR(bg)) { ret = PTR_ERR(bg); goto out; @@ -3964,7 +3966,7 @@ static struct btrfs_block_group *do_chunk_alloc(struct btrfs_trans_handle *trans const u64 sys_flags = btrfs_system_alloc_profile(trans->fs_info); struct btrfs_block_group *sys_bg; - sys_bg = btrfs_create_chunk(trans, sys_flags); + sys_bg = btrfs_create_chunk(trans, NULL, sys_flags); if (IS_ERR(sys_bg)) { ret = PTR_ERR(sys_bg); btrfs_abort_transaction(trans, ret); @@ -4214,7 +4216,7 @@ int btrfs_chunk_alloc(struct btrfs_trans_handle *trans, force_metadata_allocation(fs_info); } - ret_bg = do_chunk_alloc(trans, flags); + ret_bg = do_chunk_alloc(trans, space_info, flags); trans->allocating_chunk = false; if (IS_ERR(ret_bg)) { @@ -4297,7 +4299,7 @@ static void reserve_chunk_space(struct btrfs_trans_handle *trans, * the paths we visit in the chunk tree (they were already COWed * or created in the current transaction for example). */ - bg = btrfs_create_chunk(trans, flags); + bg = btrfs_create_chunk(trans, NULL, flags); if (IS_ERR(bg)) { ret = PTR_ERR(bg); } else { diff --git a/fs/btrfs/block-group.h b/fs/btrfs/block-group.h index c01f3af726a1..35309b690d6f 100644 --- a/fs/btrfs/block-group.h +++ b/fs/btrfs/block-group.h @@ -326,8 +326,8 @@ void btrfs_reclaim_bgs(struct btrfs_fs_info *fs_info); void btrfs_mark_bg_to_reclaim(struct btrfs_block_group *bg); int btrfs_read_block_groups(struct btrfs_fs_info *info); struct btrfs_block_group *btrfs_make_block_group(struct btrfs_trans_handle *trans, - u64 type, - u64 chunk_offset, u64 size); + struct btrfs_space_info *space_info, + u64 type, u64 chunk_offset, u64 size); void btrfs_create_pending_block_groups(struct btrfs_trans_handle *trans); int btrfs_inc_block_group_ro(struct btrfs_block_group *cache, bool do_chunk_alloc); diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c index 7509cbe3272c..5462c832ea19 100644 --- a/fs/btrfs/volumes.c +++ b/fs/btrfs/volumes.c @@ -3420,7 +3420,7 @@ int btrfs_remove_chunk(struct btrfs_trans_handle *trans, u64 chunk_offset) const u64 sys_flags = btrfs_system_alloc_profile(fs_info); struct btrfs_block_group *sys_bg; - sys_bg = btrfs_create_chunk(trans, sys_flags); + sys_bg = btrfs_create_chunk(trans, NULL, sys_flags); if (IS_ERR(sys_bg)) { ret = PTR_ERR(sys_bg); btrfs_abort_transaction(trans, ret); @@ -5216,6 +5216,8 @@ struct alloc_chunk_ctl { u64 stripe_size; u64 chunk_size; int ndevs; + /* Space_info the block group is going to belong. */ + struct btrfs_space_info *space_info; }; static void init_alloc_chunk_ctl_policy_regular( @@ -5617,7 +5619,8 @@ static struct btrfs_block_group *create_chunk(struct btrfs_trans_handle *trans, return ERR_PTR(ret); } - block_group = btrfs_make_block_group(trans, type, start, ctl->chunk_size); + block_group = btrfs_make_block_group(trans, ctl->space_info, type, start, + ctl->chunk_size); if (IS_ERR(block_group)) { btrfs_remove_chunk_map(info, map); return block_group; @@ -5643,7 +5646,8 @@ static struct btrfs_block_group *create_chunk(struct btrfs_trans_handle *trans, } struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans, - u64 type) + struct btrfs_space_info *space_info, + u64 type) { struct btrfs_fs_info *info = trans->fs_info; struct btrfs_fs_devices *fs_devices = info->fs_devices; @@ -5671,8 +5675,16 @@ struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans, return ERR_PTR(-EINVAL); } + if (!space_info) { + space_info = btrfs_find_space_info(info, type); + if (!space_info) { + ASSERT(0); + return ERR_PTR(-EINVAL); + } + } ctl.start = find_next_chunk(info); ctl.type = type; + ctl.space_info = space_info; init_alloc_chunk_ctl(fs_devices, &ctl); devices_info = kcalloc(fs_devices->rw_devices, sizeof(*devices_info), @@ -5840,12 +5852,12 @@ static noinline int init_first_rw_device(struct btrfs_trans_handle *trans) */ alloc_profile = btrfs_metadata_alloc_profile(fs_info); - meta_bg = btrfs_create_chunk(trans, alloc_profile); + meta_bg = btrfs_create_chunk(trans, NULL, alloc_profile); if (IS_ERR(meta_bg)) return PTR_ERR(meta_bg); alloc_profile = btrfs_system_alloc_profile(fs_info); - sys_bg = btrfs_create_chunk(trans, alloc_profile); + sys_bg = btrfs_create_chunk(trans, NULL, alloc_profile); if (IS_ERR(sys_bg)) return PTR_ERR(sys_bg); diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h index e247d551da67..7f314a4487c4 100644 --- a/fs/btrfs/volumes.h +++ b/fs/btrfs/volumes.h @@ -715,7 +715,8 @@ struct btrfs_discard_stripe *btrfs_map_discard(struct btrfs_fs_info *fs_info, int btrfs_read_sys_array(struct btrfs_fs_info *fs_info); int btrfs_read_chunk_tree(struct btrfs_fs_info *fs_info); struct btrfs_block_group *btrfs_create_chunk(struct btrfs_trans_handle *trans, - u64 type); + struct btrfs_space_info *space_info, + u64 type); void btrfs_mapping_tree_free(struct btrfs_fs_info *fs_info); int btrfs_open_devices(struct btrfs_fs_devices *fs_devices, blk_mode_t flags, void *holder);