Message ID | c30d22dcf2f6418a803ea2e0066545566829afa1.1713550368.git.josef@toxicpanda.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | btrfs: snapshot delete cleanups | expand |
在 2024/4/20 03:46, Josef Bacik 写道: > We do find_extent_buffer(), and then if we don't find the eb in cache we > call btrfs_find_create_tree_block(), which calls find_extent_buffer() > first and then allocates the extent buffer. > > The reason we're doing this is because if we don't find the extent > buffer in cache we set reada = 1. However this doesn't matter, because > lower down we only trigger reada if !btrfs_buffer_uptodate(eb), which is > what the case would be if we didn't find the extent buffer in cache and > had to allocate it. > > Clean this up to simply call btrfs_find_create_tree_block(), and then > use the fact that we're having to read the extent buffer off of disk to > go ahead and kick off readahead. > > Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: Qu Wenruo <wqu@suse.com> Thanks, Qu > --- > fs/btrfs/extent-tree.c | 16 ++++++---------- > 1 file changed, 6 insertions(+), 10 deletions(-) > > diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c > index 023920d0d971..64bb8c69e57a 100644 > --- a/fs/btrfs/extent-tree.c > +++ b/fs/btrfs/extent-tree.c > @@ -5434,7 +5434,6 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, > struct btrfs_key key; > struct extent_buffer *next; > int level = wc->level; > - int reada = 0; > int ret = 0; > bool need_account = false; > > @@ -5460,14 +5459,11 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, > btrfs_node_key_to_cpu(path->nodes[level], &check.first_key, > path->slots[level]); > > - next = find_extent_buffer(fs_info, bytenr); > - if (!next) { > - next = btrfs_find_create_tree_block(fs_info, bytenr, > - btrfs_root_id(root), level - 1); > - if (IS_ERR(next)) > - return PTR_ERR(next); > - reada = 1; > - } > + next = btrfs_find_create_tree_block(fs_info, bytenr, > + btrfs_root_id(root), level - 1); > + if (IS_ERR(next)) > + return PTR_ERR(next); > + > btrfs_tree_lock(next); > > ret = btrfs_lookup_extent_info(trans, fs_info, bytenr, level - 1, 1, > @@ -5518,7 +5514,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, > } > > if (!next) { > - if (reada && level == 1) > + if (level == 1) > reada_walk_down(trans, root, wc, path); > next = read_tree_block(fs_info, bytenr, &check); > if (IS_ERR(next)) {
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c index 023920d0d971..64bb8c69e57a 100644 --- a/fs/btrfs/extent-tree.c +++ b/fs/btrfs/extent-tree.c @@ -5434,7 +5434,6 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, struct btrfs_key key; struct extent_buffer *next; int level = wc->level; - int reada = 0; int ret = 0; bool need_account = false; @@ -5460,14 +5459,11 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, btrfs_node_key_to_cpu(path->nodes[level], &check.first_key, path->slots[level]); - next = find_extent_buffer(fs_info, bytenr); - if (!next) { - next = btrfs_find_create_tree_block(fs_info, bytenr, - btrfs_root_id(root), level - 1); - if (IS_ERR(next)) - return PTR_ERR(next); - reada = 1; - } + next = btrfs_find_create_tree_block(fs_info, bytenr, + btrfs_root_id(root), level - 1); + if (IS_ERR(next)) + return PTR_ERR(next); + btrfs_tree_lock(next); ret = btrfs_lookup_extent_info(trans, fs_info, bytenr, level - 1, 1, @@ -5518,7 +5514,7 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans, } if (!next) { - if (reada && level == 1) + if (level == 1) reada_walk_down(trans, root, wc, path); next = read_tree_block(fs_info, bytenr, &check); if (IS_ERR(next)) {
We do find_extent_buffer(), and then if we don't find the eb in cache we call btrfs_find_create_tree_block(), which calls find_extent_buffer() first and then allocates the extent buffer. The reason we're doing this is because if we don't find the extent buffer in cache we set reada = 1. However this doesn't matter, because lower down we only trigger reada if !btrfs_buffer_uptodate(eb), which is what the case would be if we didn't find the extent buffer in cache and had to allocate it. Clean this up to simply call btrfs_find_create_tree_block(), and then use the fact that we're having to read the extent buffer off of disk to go ahead and kick off readahead. Signed-off-by: Josef Bacik <josef@toxicpanda.com> --- fs/btrfs/extent-tree.c | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-)