To handle subpage status update, add the following:

- Use btrfs_page_*() subpage-aware helpers to update page status
  Now we can handle both cases well.

- No page unlock for subpage metadata
  Since subpage metadata doesn't utilize page locking at all, skip it.
  For subpage data locking, it's handled in later commits.

Signed-off-by: Qu Wenruo <w...@suse.com>
Reviewed-by: David Sterba <dste...@suse.com>
Signed-off-by: David Sterba <dste...@suse.com>
---
 fs/btrfs/extent_io.c | 21 +++++++++++++++------
 1 file changed, 15 insertions(+), 6 deletions(-)

diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 5ac8faf0f8e5..139a8a77ed72 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -2839,15 +2839,24 @@ static void endio_readpage_release_extent(struct 
processed_extent *processed,
        processed->uptodate = uptodate;
 }
 
-static void endio_readpage_update_page_status(struct page *page, bool uptodate)
+static void endio_readpage_update_page_status(struct page *page, bool uptodate,
+                                             u64 start, u32 len)
 {
+       struct btrfs_fs_info *fs_info = btrfs_sb(page->mapping->host->i_sb);
+
+       ASSERT(page_offset(page) <= start &&
+               start + len <= page_offset(page) + PAGE_SIZE);
+
        if (uptodate) {
-               SetPageUptodate(page);
+               btrfs_page_set_uptodate(fs_info, page, start, len);
        } else {
-               ClearPageUptodate(page);
-               SetPageError(page);
+               btrfs_page_clear_uptodate(fs_info, page, start, len);
+               btrfs_page_set_error(fs_info, page, start, len);
        }
-       unlock_page(page);
+
+       if (fs_info->sectorsize == PAGE_SIZE)
+               unlock_page(page);
+       /* Subpage locking will be handled in later patches */
 }
 
 /*
@@ -2984,7 +2993,7 @@ static void end_bio_extent_readpage(struct bio *bio)
                bio_offset += len;
 
                /* Update page status and unlock */
-               endio_readpage_update_page_status(page, uptodate);
+               endio_readpage_update_page_status(page, uptodate, start, len);
                endio_readpage_release_extent(&processed, BTRFS_I(inode),
                                              start, end, uptodate);
        }
-- 
2.30.0

Reply via email to