* [PATCH v3 0/2] small cleanups for find_first_block_group @ 2020-06-02 10:05 Johannes Thumshirn 2020-06-02 10:05 ` [PATCH v3 1/2] btrfs: get mapping tree directly from fsinfo in find_first_block_group Johannes Thumshirn ` (2 more replies) 0 siblings, 3 replies; 4+ messages in thread From: Johannes Thumshirn @ 2020-06-02 10:05 UTC (permalink / raw) To: David Sterba; +Cc: Nikolay Borisov, linux-btrfs, Johannes Thumshirn While trying to learn the Block Group code I've found some cleanup possibilities for find_first_block_group(). Here's a proposal to make $ffbg a bit more easier to read by untangling the gotos and if statements. The patch set is based on misc-next from May 26 morning with HEAD 3f4a266717ed ("btrfs: split btrfs_direct_IO to read and write part") and xfstests showed no regressions to the base misc-next in my test setup. Changes to v2: - Dropped label removal patch (David) - Don't return early inside the loop (David) Changes to v1: - Pass btrfs_path instead of leaf & slot to read_bg_from_eb (Nikolay) - Don't comment about the size change (Nikolay) - Add Nikolay's Reviewed-by's Johannes Thumshirn (2): btrfs: get mapping tree directly from fsinfo in find_first_block_group btrfs: factor out reading of bg from find_frist_block_group fs/btrfs/block-group.c | 102 ++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 46 deletions(-) -- 2.26.2 ^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v3 1/2] btrfs: get mapping tree directly from fsinfo in find_first_block_group 2020-06-02 10:05 [PATCH v3 0/2] small cleanups for find_first_block_group Johannes Thumshirn @ 2020-06-02 10:05 ` Johannes Thumshirn 2020-06-02 10:05 ` [PATCH v3 2/2] btrfs: factor out reading of bg from find_frist_block_group Johannes Thumshirn 2020-06-02 12:08 ` [PATCH v3 0/2] small cleanups for find_first_block_group David Sterba 2 siblings, 0 replies; 4+ messages in thread From: Johannes Thumshirn @ 2020-06-02 10:05 UTC (permalink / raw) To: David Sterba; +Cc: Nikolay Borisov, linux-btrfs, Johannes Thumshirn We already have an fs_info in our function parameters, there's no need to do the maths again and get fs_info from the extent_root just to get the mapping_tree. Instead directly grab the mapping_tree from fs_info. Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Reviewed-by: Nikolay Borisov <nborisov@suse.com> --- fs/btrfs/block-group.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index 176e8a292fd1..e5641b6a3097 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1556,7 +1556,7 @@ static int find_first_block_group(struct btrfs_fs_info *fs_info, struct extent_map_tree *em_tree; struct extent_map *em; - em_tree = &root->fs_info->mapping_tree; + em_tree = &fs_info->mapping_tree; read_lock(&em_tree->lock); em = lookup_extent_mapping(em_tree, found_key.objectid, found_key.offset); -- 2.26.2 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v3 2/2] btrfs: factor out reading of bg from find_frist_block_group 2020-06-02 10:05 [PATCH v3 0/2] small cleanups for find_first_block_group Johannes Thumshirn 2020-06-02 10:05 ` [PATCH v3 1/2] btrfs: get mapping tree directly from fsinfo in find_first_block_group Johannes Thumshirn @ 2020-06-02 10:05 ` Johannes Thumshirn 2020-06-02 12:08 ` [PATCH v3 0/2] small cleanups for find_first_block_group David Sterba 2 siblings, 0 replies; 4+ messages in thread From: Johannes Thumshirn @ 2020-06-02 10:05 UTC (permalink / raw) To: David Sterba; +Cc: Nikolay Borisov, linux-btrfs, Johannes Thumshirn When find_first_block_group() finds a block group item in the extent-tree, it does a lookup of the object in the extent mapping tree and does further checks on the item. Factor out this step from find_first_block_group() so we can further simplify the code. While we're at it, we can also just return early in find_first_block_group(), if the tree slot isn't found. Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> --- fs/btrfs/block-group.c | 102 ++++++++++++++++++++++------------------- 1 file changed, 56 insertions(+), 46 deletions(-) diff --git a/fs/btrfs/block-group.c b/fs/btrfs/block-group.c index e5641b6a3097..95b9b170b460 100644 --- a/fs/btrfs/block-group.c +++ b/fs/btrfs/block-group.c @@ -1522,21 +1522,70 @@ void btrfs_mark_bg_unused(struct btrfs_block_group *bg) spin_unlock(&fs_info->unused_bgs_lock); } +static int read_bg_from_eb(struct btrfs_fs_info *fs_info, struct btrfs_key *key, + struct btrfs_path *path) +{ + struct extent_map_tree *em_tree; + struct extent_map *em; + struct btrfs_block_group_item bg; + struct extent_buffer *leaf; + int slot; + u64 flags; + int ret = 0; + + slot = path->slots[0]; + leaf = path->nodes[0]; + + em_tree = &fs_info->mapping_tree; + read_lock(&em_tree->lock); + em = lookup_extent_mapping(em_tree, key->objectid, key->offset); + read_unlock(&em_tree->lock); + if (!em) { + btrfs_err(fs_info, + "logical %llu len %llu found bg but no related chunk", + key->objectid, key->offset); + return -ENOENT; + } + + if (em->start != key->objectid || em->len != key->offset) { + btrfs_err(fs_info, + "block group %llu len %llu mismatch with chunk %llu len %llu", + key->objectid, key->offset, em->start, em->len); + ret = -EUCLEAN; + goto out_free_em; + } + + read_extent_buffer(leaf, &bg, btrfs_item_ptr_offset(leaf, slot), + sizeof(bg)); + flags = btrfs_stack_block_group_flags(&bg) & + BTRFS_BLOCK_GROUP_TYPE_MASK; + + if (flags != (em->map_lookup->type & BTRFS_BLOCK_GROUP_TYPE_MASK)) { + btrfs_err(fs_info, + "block group %llu len %llu type flags 0x%llx mismatch with chunk type flags 0x%llx", + key->objectid, key->offset, flags, + (BTRFS_BLOCK_GROUP_TYPE_MASK & em->map_lookup->type)); + ret = -EUCLEAN; + } + +out_free_em: + free_extent_map(em); + return ret; +} + static int find_first_block_group(struct btrfs_fs_info *fs_info, struct btrfs_path *path, struct btrfs_key *key) { struct btrfs_root *root = fs_info->extent_root; - int ret = 0; + int ret; struct btrfs_key found_key; struct extent_buffer *leaf; - struct btrfs_block_group_item bg; - u64 flags; int slot; ret = btrfs_search_slot(NULL, root, key, path, 0, 0); if (ret < 0) - goto out; + return ret; while (1) { slot = path->slots[0]; @@ -1553,49 +1602,10 @@ static int find_first_block_group(struct btrfs_fs_info *fs_info, if (found_key.objectid >= key->objectid && found_key.type == BTRFS_BLOCK_GROUP_ITEM_KEY) { - struct extent_map_tree *em_tree; - struct extent_map *em; - - em_tree = &fs_info->mapping_tree; - read_lock(&em_tree->lock); - em = lookup_extent_mapping(em_tree, found_key.objectid, - found_key.offset); - read_unlock(&em_tree->lock); - if (!em) { - btrfs_err(fs_info, - "logical %llu len %llu found bg but no related chunk", - found_key.objectid, found_key.offset); - ret = -ENOENT; - } else if (em->start != found_key.objectid || - em->len != found_key.offset) { - btrfs_err(fs_info, - "block group %llu len %llu mismatch with chunk %llu len %llu", - found_key.objectid, found_key.offset, - em->start, em->len); - ret = -EUCLEAN; - } else { - read_extent_buffer(leaf, &bg, - btrfs_item_ptr_offset(leaf, slot), - sizeof(bg)); - flags = btrfs_stack_block_group_flags(&bg) & - BTRFS_BLOCK_GROUP_TYPE_MASK; - - if (flags != (em->map_lookup->type & - BTRFS_BLOCK_GROUP_TYPE_MASK)) { - btrfs_err(fs_info, -"block group %llu len %llu type flags 0x%llx mismatch with chunk type flags 0x%llx", - found_key.objectid, - found_key.offset, flags, - (BTRFS_BLOCK_GROUP_TYPE_MASK & - em->map_lookup->type)); - ret = -EUCLEAN; - } else { - ret = 0; - } - } - free_extent_map(em); - goto out; + ret = read_bg_from_eb(fs_info, &found_key, path); + break; } + path->slots[0]++; } out: -- 2.26.2 ^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v3 0/2] small cleanups for find_first_block_group 2020-06-02 10:05 [PATCH v3 0/2] small cleanups for find_first_block_group Johannes Thumshirn 2020-06-02 10:05 ` [PATCH v3 1/2] btrfs: get mapping tree directly from fsinfo in find_first_block_group Johannes Thumshirn 2020-06-02 10:05 ` [PATCH v3 2/2] btrfs: factor out reading of bg from find_frist_block_group Johannes Thumshirn @ 2020-06-02 12:08 ` David Sterba 2 siblings, 0 replies; 4+ messages in thread From: David Sterba @ 2020-06-02 12:08 UTC (permalink / raw) To: Johannes Thumshirn; +Cc: David Sterba, Nikolay Borisov, linux-btrfs On Tue, Jun 02, 2020 at 07:05:55PM +0900, Johannes Thumshirn wrote: > While trying to learn the Block Group code I've found some cleanup > possibilities for find_first_block_group(). > > Here's a proposal to make $ffbg a bit more easier to read by untangling the > gotos and if statements. > > The patch set is based on misc-next from May 26 morning with > HEAD 3f4a266717ed ("btrfs: split btrfs_direct_IO to read and write part") > and xfstests showed no regressions to the base misc-next in my test setup. > > Changes to v2: > - Dropped label removal patch (David) > - Don't return early inside the loop (David) Thanks, added to misc-next. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2020-06-02 12:08 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-06-02 10:05 [PATCH v3 0/2] small cleanups for find_first_block_group Johannes Thumshirn 2020-06-02 10:05 ` [PATCH v3 1/2] btrfs: get mapping tree directly from fsinfo in find_first_block_group Johannes Thumshirn 2020-06-02 10:05 ` [PATCH v3 2/2] btrfs: factor out reading of bg from find_frist_block_group Johannes Thumshirn 2020-06-02 12:08 ` [PATCH v3 0/2] small cleanups for find_first_block_group David Sterba
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.