mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-04 08:04:24 -04:00
btrfs: add cached_state to read_extent_buffer_subpage
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>
This commit is contained in:
committed by
David Sterba
parent
123a7f008c
commit
e5e886bad9
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user