Get a folio from the page cache instead of a page, then use the
folio API throughout.  Removes a few calls to compound_head()
and may be needed to support block size > PAGE_SIZE.

Signed-off-by: Matthew Wilcox (Oracle) <wi...@infradead.org>
---
 fs/buffer.c | 34 +++++++++++++++-------------------
 1 file changed, 15 insertions(+), 19 deletions(-)

diff --git a/fs/buffer.c b/fs/buffer.c
index e4bd465ecee8..06d031e28bee 100644
--- a/fs/buffer.c
+++ b/fs/buffer.c
@@ -976,7 +976,7 @@ grow_dev_page(struct block_device *bdev, sector_t block,
              pgoff_t index, int size, int sizebits, gfp_t gfp)
 {
        struct inode *inode = bdev->bd_inode;
-       struct page *page;
+       struct folio *folio;
        struct buffer_head *bh;
        sector_t end_block;
        int ret = 0;
@@ -992,42 +992,38 @@ grow_dev_page(struct block_device *bdev, sector_t block,
         */
        gfp_mask |= __GFP_NOFAIL;
 
-       page = find_or_create_page(inode->i_mapping, index, gfp_mask);
-
-       BUG_ON(!PageLocked(page));
+       folio = __filemap_get_folio(inode->i_mapping, index,
+                       FGP_LOCK | FGP_ACCESSED | FGP_CREAT, gfp_mask);
 
-       if (page_has_buffers(page)) {
-               bh = page_buffers(page);
+       bh = folio_buffers(folio);
+       if (bh) {
                if (bh->b_size == size) {
-                       end_block = init_page_buffers(page, bdev,
+                       end_block = init_page_buffers(&folio->page, bdev,
                                                (sector_t)index << sizebits,
                                                size);
                        goto done;
                }
-               if (!try_to_free_buffers(page_folio(page)))
+               if (!try_to_free_buffers(folio))
                        goto failed;
        }
 
-       /*
-        * Allocate some buffers for this page
-        */
-       bh = alloc_page_buffers(page, size, true);
+       bh = folio_alloc_buffers(folio, size, true);
 
        /*
-        * Link the page to the buffers and initialise them.  Take the
+        * Link the folio to the buffers and initialise them.  Take the
         * lock to be atomic wrt __find_get_block(), which does not
-        * run under the page lock.
+        * run under the folio lock.
         */
        spin_lock(&inode->i_mapping->private_lock);
-       link_dev_buffers(page, bh);
-       end_block = init_page_buffers(page, bdev, (sector_t)index << sizebits,
-                       size);
+       link_dev_buffers(&folio->page, bh);
+       end_block = init_page_buffers(&folio->page, bdev,
+                       (sector_t)index << sizebits, size);
        spin_unlock(&inode->i_mapping->private_lock);
 done:
        ret = (block < end_block) ? 1 : -ENXIO;
 failed:
-       unlock_page(page);
-       put_page(page);
+       folio_unlock(folio);
+       folio_put(folio);
        return ret;
 }
 
-- 
2.39.2

Reply via email to