@@ -5508,22 +5508,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--;
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(). Collapse 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> --- fs/btrfs/extent-tree.c | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-)