btrfs: add cached_state to read_extent_buffer_subpage
authorJosef Bacik <josef@toxicpanda.com>
Fri, 30 Sep 2022 20:45:13 +0000 (16:45 -0400)
committerDavid Sterba <dsterba@suse.com>
Mon, 5 Dec 2022 17:00:36 +0000 (18:00 +0100)
We don't use a cached state here at all, which generally makes sense as
async reads are going to unlock at endio time.  However for blocking
reads we will call wait_extent_bit() for our range.  Since the
lock_extent() stuff will return the cached_state for the start of the
range this is a helpful optimization to have for this case, we'll have
the exact state we want to wait on.  Add a cached state here and simply
throw it away if we're a non-blocking read, otherwise we'll get a small
improvement by eliminating some tree searches.

Reviewed-by: Filipe Manana <fdmanana@suse.com>
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_io.c

index 8368512..7891d37 100644 (file)
@@ -4949,6 +4949,7 @@ static int read_extent_buffer_subpage(struct extent_buffer *eb, int wait,
        struct btrfs_fs_info *fs_info = eb->fs_info;
        struct extent_io_tree *io_tree;
        struct page *page = eb->pages[0];
+       struct extent_state *cached_state = NULL;
        struct btrfs_bio_ctrl bio_ctrl = {
                .mirror_num = mirror_num,
        };
@@ -4960,10 +4961,11 @@ static int read_extent_buffer_subpage(struct extent_buffer *eb, int wait,
 
        if (wait == WAIT_NONE) {
                if (!try_lock_extent(io_tree, eb->start, eb->start + eb->len - 1,
-                                    NULL))
+                                    &cached_state))
                        return -EAGAIN;
        } else {
-               ret = lock_extent(io_tree, eb->start, eb->start + eb->len - 1, NULL);
+               ret = lock_extent(io_tree, eb->start, eb->start + eb->len - 1,
+                                 &cached_state);
                if (ret < 0)
                        return ret;
        }
@@ -4973,7 +4975,8 @@ static int read_extent_buffer_subpage(struct extent_buffer *eb, int wait,
            PageUptodate(page) ||
            btrfs_subpage_test_uptodate(fs_info, page, eb->start, eb->len)) {
                set_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags);
-               unlock_extent(io_tree, eb->start, eb->start + eb->len - 1, NULL);
+               unlock_extent(io_tree, eb->start, eb->start + eb->len - 1,
+                             &cached_state);
                return ret;
        }
 
@@ -4998,11 +5001,13 @@ static int read_extent_buffer_subpage(struct extent_buffer *eb, int wait,
                atomic_dec(&eb->io_pages);
        }
        submit_one_bio(&bio_ctrl);
-       if (ret || wait != WAIT_COMPLETE)
+       if (ret || wait != WAIT_COMPLETE) {
+               free_extent_state(cached_state);
                return ret;
+       }
 
        wait_extent_bit(io_tree, eb->start, eb->start + eb->len - 1,
-                       EXTENT_LOCKED, NULL);
+                       EXTENT_LOCKED, &cached_state);
        if (!test_bit(EXTENT_BUFFER_UPTODATE, &eb->bflags))
                ret = -EIO;
        return ret;