]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
btrfs: use btrfs_read_extent_buffer() in do_walk_down()
authorJosef Bacik <josef@toxicpanda.com>
Tue, 7 May 2024 18:12:04 +0000 (14:12 -0400)
committerDavid Sterba <dsterba@suse.com>
Thu, 11 Jul 2024 13:33:24 +0000 (15:33 +0200)
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>
fs/btrfs/extent-tree.c

index 3e31dc7538779066c541a4d82c85cda3381ebaa4..cff46f04b32d262558eaa992c0fcd2ac6a130102 100644 (file)
@@ -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--;