OSDN Git Service

Merge tag 'erofs-for-5.8-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/xiang...
[tomoyo/tomoyo-test1.git] / fs / erofs / data.c
index fc3a8d8..64b56c7 100644 (file)
@@ -265,7 +265,7 @@ submit_bio_out:
  */
 static int erofs_raw_access_readpage(struct file *file, struct page *page)
 {
-       erofs_off_t last_block;
+       erofs_off_t uninitialized_var(last_block);
        struct bio *bio;
 
        trace_erofs_readpage(page, true);
@@ -280,47 +280,36 @@ static int erofs_raw_access_readpage(struct file *file, struct page *page)
        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;
+       erofs_off_t uninitialized_var(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,
@@ -358,7 +347,7 @@ static sector_t erofs_bmap(struct address_space *mapping, sector_t block)
 /* 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,
 };