mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 04:28:10 -04:00
btrfs: use btrfs_read_extent_buffer() in do_walk_down()
Currently if our extent buffer isn't uptodate we will drop the lock, free it, and then call read_tree_block() for the bytenr. This is inefficient, we already have the extent buffer, we can simply call btrfs_read_extent_buffer(). Merge these two cases down into one if statement, if we are not uptodate we can drop the lock, trigger readahead, and do the read using btrfs_read_extent_buffer(), and carry on. Signed-off-by: Josef Bacik <josef@toxicpanda.com> Reviewed-by: David Sterba <dsterba@suse.com> Signed-off-by: David Sterba <dsterba@suse.com>
This commit is contained in:
committed by
David Sterba
parent
133b3da835
commit
3fdf5798fa
@@ -5507,22 +5507,15 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
|
||||
|
||||
if (!btrfs_buffer_uptodate(next, generation, 0)) {
|
||||
btrfs_tree_unlock(next);
|
||||
free_extent_buffer(next);
|
||||
next = NULL;
|
||||
*lookup_info = 1;
|
||||
}
|
||||
|
||||
if (!next) {
|
||||
if (level == 1)
|
||||
reada_walk_down(trans, root, wc, path);
|
||||
next = read_tree_block(fs_info, bytenr, &check);
|
||||
if (IS_ERR(next)) {
|
||||
return PTR_ERR(next);
|
||||
} else if (!extent_buffer_uptodate(next)) {
|
||||
ret = btrfs_read_extent_buffer(next, &check);
|
||||
if (ret) {
|
||||
free_extent_buffer(next);
|
||||
return -EIO;
|
||||
return ret;
|
||||
}
|
||||
btrfs_tree_lock(next);
|
||||
*lookup_info = 1;
|
||||
}
|
||||
|
||||
level--;
|
||||
|
||||
Reference in New Issue
Block a user