]> www.infradead.org Git - users/willy/linux.git/commitdiff
iomap: Pass the iomap_page into iomap_set_range_uptodate
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Wed, 28 Apr 2021 12:16:50 +0000 (08:16 -0400)
committerMatthew Wilcox (Oracle) <willy@infradead.org>
Thu, 16 Dec 2021 20:49:52 +0000 (15:49 -0500)
All but one caller already has the iomap_page, so we can avoid getting
it again.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/iomap/buffered-io.c

index de7ce190952791b457f4283d1e21ff9c93258ec9..856ef62b319e21995f52bba2b246ffa6bae20aeb 100644 (file)
@@ -134,11 +134,9 @@ iomap_adjust_read_range(struct inode *inode, struct iomap_page *iop,
        *lenp = plen;
 }
 
-static void
-iomap_iop_set_range_uptodate(struct page *page, unsigned off, unsigned len)
+static void iomap_iop_set_range_uptodate(struct page *page,
+               struct iomap_page *iop, unsigned off, unsigned len)
 {
-       struct folio *folio = page_folio(page);
-       struct iomap_page *iop = to_iomap_page(folio);
        struct inode *inode = page->mapping->host;
        unsigned first = off >> inode->i_blkbits;
        unsigned last = (off + len - 1) >> inode->i_blkbits;
@@ -151,14 +149,14 @@ iomap_iop_set_range_uptodate(struct page *page, unsigned off, unsigned len)
        spin_unlock_irqrestore(&iop->uptodate_lock, flags);
 }
 
-static void
-iomap_set_range_uptodate(struct page *page, unsigned off, unsigned len)
+static void iomap_set_range_uptodate(struct page *page,
+               struct iomap_page *iop, unsigned off, unsigned len)
 {
        if (PageError(page))
                return;
 
-       if (page_has_private(page))
-               iomap_iop_set_range_uptodate(page, off, len);
+       if (iop)
+               iomap_iop_set_range_uptodate(page, iop, off, len);
        else
                SetPageUptodate(page);
 }
@@ -174,7 +172,8 @@ iomap_read_page_end_io(struct bio_vec *bvec, int error)
                ClearPageUptodate(page);
                SetPageError(page);
        } else {
-               iomap_set_range_uptodate(page, bvec->bv_offset, bvec->bv_len);
+               iomap_set_range_uptodate(page, iop, bvec->bv_offset,
+                                               bvec->bv_len);
        }
 
        if (!iop || atomic_sub_and_test(bvec->bv_len, &iop->read_bytes_pending))
@@ -213,6 +212,7 @@ static int iomap_read_inline_data(const struct iomap_iter *iter,
                struct page *page)
 {
        struct folio *folio = page_folio(page);
+       struct iomap_page *iop;
        const struct iomap *iomap = iomap_iter_srcmap(iter);
        size_t size = i_size_read(iter->inode) - iomap->offset;
        size_t poff = offset_in_page(iomap->offset);
@@ -229,13 +229,15 @@ static int iomap_read_inline_data(const struct iomap_iter *iter,
        if (WARN_ON_ONCE(size > iomap->length))
                return -EIO;
        if (poff > 0)
-               iomap_page_create(iter->inode, folio);
+               iop = iomap_page_create(iter->inode, folio);
+       else
+               iop = to_iomap_page(folio);
 
        addr = kmap_local_page(page) + poff;
        memcpy(addr, iomap->inline_data, size);
        memset(addr + size, 0, PAGE_SIZE - poff - size);
        kunmap_local(addr);
-       iomap_set_range_uptodate(page, poff, PAGE_SIZE - poff);
+       iomap_set_range_uptodate(page, iop, poff, PAGE_SIZE - poff);
        return 0;
 }
 
@@ -273,7 +275,7 @@ static loff_t iomap_readpage_iter(const struct iomap_iter *iter,
 
        if (iomap_block_needs_zeroing(iter, pos)) {
                zero_user(page, poff, plen);
-               iomap_set_range_uptodate(page, poff, plen);
+               iomap_set_range_uptodate(page, iop, poff, plen);
                goto done;
        }
 
@@ -589,7 +591,7 @@ static int __iomap_write_begin(const struct iomap_iter *iter, loff_t pos,
                        if (status)
                                return status;
                }
-               iomap_set_range_uptodate(page, poff, plen);
+               iomap_set_range_uptodate(page, iop, poff, plen);
        } while ((block_start += plen) < block_end);
 
        return 0;
@@ -661,6 +663,8 @@ out_no_page:
 static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
                size_t copied, struct page *page)
 {
+       struct folio *folio = page_folio(page);
+       struct iomap_page *iop = to_iomap_page(folio);
        flush_dcache_page(page);
 
        /*
@@ -676,7 +680,7 @@ static size_t __iomap_write_end(struct inode *inode, loff_t pos, size_t len,
         */
        if (unlikely(copied < len && !PageUptodate(page)))
                return 0;
-       iomap_set_range_uptodate(page, offset_in_page(pos), len);
+       iomap_set_range_uptodate(page, iop, offset_in_page(pos), len);
        __set_page_dirty_nobuffers(page);
        return copied;
 }