gfs2: convert gfs2_getbuf() to folios
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Mon, 16 Oct 2023 20:10:54 +0000 (21:10 +0100)
committerAndrew Morton <akpm@linux-foundation.org>
Wed, 25 Oct 2023 23:47:08 +0000 (16:47 -0700)
Remove several folio->page->folio conversions.  Also use __GFP_NOFAIL
instead of calling yield() and the new get_nth_bh().

Link: https://lkml.kernel.org/r/20231016201114.1928083-8-willy@infradead.org
Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Reviewed-by: Andreas Gruenbacher <agruenba@redhat.com>
Cc: Pankaj Raghav <p.raghav@samsung.com>
Cc: Ryusuke Konishi <konishi.ryusuke@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
fs/gfs2/meta_io.c

index 924361fa510b1f37b669e831e749c986ca36263a..f1fac1b45059626c4ddac65ea2e880759bc5c871 100644 (file)
@@ -115,7 +115,7 @@ struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create)
 {
        struct address_space *mapping = gfs2_glock2aspace(gl);
        struct gfs2_sbd *sdp = gl->gl_name.ln_sbd;
-       struct page *page;
+       struct folio *folio;
        struct buffer_head *bh;
        unsigned int shift;
        unsigned long index;
@@ -129,36 +129,31 @@ struct buffer_head *gfs2_getbuf(struct gfs2_glock *gl, u64 blkno, int create)
        bufnum = blkno - (index << shift);  /* block buf index within page */
 
        if (create) {
-               for (;;) {
-                       page = grab_cache_page(mapping, index);
-                       if (page)
-                               break;
-                       yield();
-               }
-               if (!page_has_buffers(page))
-                       create_empty_buffers(page, sdp->sd_sb.sb_bsize, 0);
+               folio = __filemap_get_folio(mapping, index,
+                               FGP_LOCK | FGP_ACCESSED | FGP_CREAT,
+                               mapping_gfp_mask(mapping) | __GFP_NOFAIL);
+               bh = folio_buffers(folio);
+               if (!bh)
+                       bh = folio_create_empty_buffers(folio,
+                               sdp->sd_sb.sb_bsize, 0);
        } else {
-               page = find_get_page_flags(mapping, index,
-                                               FGP_LOCK|FGP_ACCESSED);
-               if (!page)
+               folio = __filemap_get_folio(mapping, index,
+                               FGP_LOCK | FGP_ACCESSED, 0);
+               if (IS_ERR(folio))
                        return NULL;
-               if (!page_has_buffers(page)) {
-                       bh = NULL;
-                       goto out_unlock;
-               }
+               bh = folio_buffers(folio);
        }
 
-       /* Locate header for our buffer within our page */
-       for (bh = page_buffers(page); bufnum--; bh = bh->b_this_page)
-               /* Do nothing */;
-       get_bh(bh);
+       if (!bh)
+               goto out_unlock;
 
+       bh = get_nth_bh(bh, bufnum);
        if (!buffer_mapped(bh))
                map_bh(bh, sdp->sd_vfs, blkno);
 
 out_unlock:
-       unlock_page(page);
-       put_page(page);
+       folio_unlock(folio);
+       folio_put(folio);
 
        return bh;
 }