diff mbox series

[v2,1/3] btrfs: make alloc_extent_buffer() handle previously uptodate range more efficient for subpage

Message ID dcacf1177cd31b969bb61910e49ed3397d796ee3.1685411033.git.wqu@suse.com (mailing list archive)
State New, archived
Headers show
Series btrfs: small cleanups mostly for subpage cases | expand

Commit Message

Qu Wenruo May 30, 2023, 1:45 a.m. UTC
Currently alloc_extent_buffer() would make the extent buffer uptodate if
the corresponding pages are also uptodate.

But this check is only checking PageUptodate, which is fine for regular
cases, but not for subpage cases, as we can have multiple extent buffers
in the same page.

So here we go btrfs_page_test_uptodate() instead.

The old code doesn't cause any problem, but not efficient, as it would
cause extra metadata read even if the range is already uptodate.

Signed-off-by: Qu Wenruo <wqu@suse.com>
---
 fs/btrfs/extent_io.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

Comments

Christoph Hellwig May 30, 2023, 5:41 a.m. UTC | #1
On Tue, May 30, 2023 at 09:45:27AM +0800, Qu Wenruo wrote:
> Currently alloc_extent_buffer() would make the extent buffer uptodate if
> the corresponding pages are also uptodate.
> 
> But this check is only checking PageUptodate, which is fine for regular
> cases, but not for subpage cases, as we can have multiple extent buffers
> in the same page.
> 
> So here we go btrfs_page_test_uptodate() instead.
> 
> The old code doesn't cause any problem, but not efficient, as it would
> cause extra metadata read even if the range is already uptodate.

Looks good:

Reviewed-by: Christoph Hellwig <hch@lst.de>
diff mbox series

Patch

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index bbf212c7a43f..9afdcf0c70dd 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -3708,7 +3708,7 @@  struct extent_buffer *alloc_extent_buffer(struct btrfs_fs_info *fs_info,
 
 		WARN_ON(btrfs_page_test_dirty(fs_info, p, eb->start, eb->len));
 		eb->pages[i] = p;
-		if (!PageUptodate(p))
+		if (!btrfs_page_test_uptodate(fs_info, p, eb->start, eb->len))
 			uptodate = 0;
 
 		/*