struct inode *const inode = rac->mapping->host;
        struct erofs_sb_info *const sbi = EROFS_I_SB(inode);
        struct z_erofs_decompress_frontend f = DECOMPRESS_FRONTEND_INIT(inode);
-       struct page *head = NULL, *page;
-       unsigned int nr_pages;
+       struct folio *head = NULL, *folio;
+       unsigned int nr_folios;
+       int err;
 
        f.headoffset = readahead_pos(rac);
 
        z_erofs_pcluster_readmore(&f, rac, true);
-       nr_pages = readahead_count(rac);
-       trace_erofs_readpages(inode, readahead_index(rac), nr_pages, false);
+       nr_folios = readahead_count(rac);
+       trace_erofs_readpages(inode, readahead_index(rac), nr_folios, false);
 
-       while ((page = readahead_page(rac))) {
-               set_page_private(page, (unsigned long)head);
-               head = page;
+       while ((folio = readahead_folio(rac))) {
+               folio->private = head;
+               head = folio;
        }
 
+       /* traverse in reverse order for best metadata I/O performance */
        while (head) {
-               struct page *page = head;
-               int err;
-
-               /* traversal in reverse order */
-               head = (void *)page_private(page);
+               folio = head;
+               head = folio_get_private(folio);
 
-               err = z_erofs_do_read_page(&f, page);
+               err = z_erofs_do_read_page(&f, &folio->page);
                if (err && err != -EINTR)
-                       erofs_err(inode->i_sb, "readahead error %d @ %lu of nid %llu",
-                                 err, page->index, EROFS_I(inode)->nid);
-               put_page(page);
+                       erofs_err(inode->i_sb, "readahead error at folio %lu @ nid %llu",
+                                 folio->index, EROFS_I(inode)->nid);
        }
        z_erofs_pcluster_readmore(&f, rac, false);
        z_erofs_pcluster_end(&f);
 
-       z_erofs_runqueue(&f, z_erofs_is_sync_decompress(sbi, nr_pages), true);
+       z_erofs_runqueue(&f, z_erofs_is_sync_decompress(sbi, nr_folios), true);
        erofs_put_metabuf(&f.map.buf);
        erofs_release_pages(&f.pagepool);
 }