{
        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;
        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;
 }