return 0;
 }
 
-static int erofs_raw_access_readpages(struct file *filp,
-                                     struct address_space *mapping,
-                                     struct list_head *pages,
-                                     unsigned int nr_pages)
+static void erofs_raw_access_readahead(struct readahead_control *rac)
 {
        erofs_off_t last_block;
        struct bio *bio = NULL;
-       gfp_t gfp = readahead_gfp_mask(mapping);
-       struct page *page = list_last_entry(pages, struct page, lru);
-
-       trace_erofs_readpages(mapping->host, page, nr_pages, true);
+       struct page *page;
 
-       for (; nr_pages; --nr_pages) {
-               page = list_entry(pages->prev, struct page, lru);
+       trace_erofs_readpages(rac->mapping->host, readahead_index(rac),
+                       readahead_count(rac), true);
 
+       while ((page = readahead_page(rac))) {
                prefetchw(&page->flags);
-               list_del(&page->lru);
 
-               if (!add_to_page_cache_lru(page, mapping, page->index, gfp)) {
-                       bio = erofs_read_raw_page(bio, mapping, page,
-                                                 &last_block, nr_pages, true);
+               bio = erofs_read_raw_page(bio, rac->mapping, page, &last_block,
+                               readahead_count(rac), true);
 
-                       /* all the page errors are ignored when readahead */
-                       if (IS_ERR(bio)) {
-                               pr_err("%s, readahead error at page %lu of nid %llu\n",
-                                      __func__, page->index,
-                                      EROFS_I(mapping->host)->nid);
+               /* all the page errors are ignored when readahead */
+               if (IS_ERR(bio)) {
+                       pr_err("%s, readahead error at page %lu of nid %llu\n",
+                              __func__, page->index,
+                              EROFS_I(rac->mapping->host)->nid);
 
-                               bio = NULL;
-                       }
+                       bio = NULL;
                }
 
-               /* pages could still be locked */
                put_page(page);
        }
-       DBG_BUGON(!list_empty(pages));
 
        /* the rare case (end in gaps) */
        if (bio)
                submit_bio(bio);
-       return 0;
 }
 
 static int erofs_get_block(struct inode *inode, sector_t iblock,
 /* for uncompressed (aligned) files and raw access for other files */
 const struct address_space_operations erofs_raw_access_aops = {
        .readpage = erofs_raw_access_readpage,
-       .readpages = erofs_raw_access_readpages,
+       .readahead = erofs_raw_access_readahead,
        .bmap = erofs_bmap,
 };
 
 
 
 TRACE_EVENT(erofs_readpages,
 
-       TP_PROTO(struct inode *inode, struct page *page, unsigned int nrpage,
+       TP_PROTO(struct inode *inode, pgoff_t start, unsigned int nrpage,
                bool raw),
 
-       TP_ARGS(inode, page, nrpage, raw),
+       TP_ARGS(inode, start, nrpage, raw),
 
        TP_STRUCT__entry(
                __field(dev_t,          dev     )
        TP_fast_assign(
                __entry->dev    = inode->i_sb->s_dev;
                __entry->nid    = EROFS_I(inode)->nid;
-               __entry->start  = page->index;
+               __entry->start  = start;
                __entry->nrpage = nrpage;
                __entry->raw    = raw;
        ),