Merge tag 'for-5.18/io_uring-2022-04-01' of git://git.kernel.dk/linux-block
[linux-2.6-microblaze.git] / fs / nfs / read.c
index eb00229..5e76573 100644 (file)
@@ -123,7 +123,7 @@ static void nfs_readpage_release(struct nfs_page *req, int error)
                struct address_space *mapping = page_file_mapping(page);
 
                if (PageUptodate(page))
-                       nfs_readpage_to_fscache(inode, page);
+                       nfs_fscache_write_page(inode, page);
                else if (!PageError(page) && !PagePrivate(page))
                        generic_error_remove_page(mapping, page);
                unlock_page(page);
@@ -194,10 +194,6 @@ static void nfs_initiate_read(struct nfs_pgio_header *hdr,
                              const struct nfs_rpc_ops *rpc_ops,
                              struct rpc_task_setup *task_setup_data, int how)
 {
-       struct inode *inode = hdr->inode;
-       int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0;
-
-       task_setup_data->flags |= swap_flags;
        rpc_ops->read_setup(hdr, msg);
        trace_nfs_initiate_read(hdr);
 }
@@ -290,9 +286,8 @@ static void nfs_readpage_result(struct rpc_task *task,
 }
 
 static int
-readpage_async_filler(void *data, struct page *page)
+readpage_async_filler(struct nfs_readdesc *desc, struct page *page)
 {
-       struct nfs_readdesc *desc = data;
        struct inode *inode = page_file_mapping(page)->host;
        unsigned int rsize = NFS_SERVER(inode)->rsize;
        struct nfs_page *new;
@@ -306,7 +301,7 @@ readpage_async_filler(void *data, struct page *page)
        aligned_len = min_t(unsigned int, ALIGN(len, rsize), PAGE_SIZE);
 
        if (!IS_SYNC(page->mapping->host)) {
-               error = nfs_readpage_from_fscache(page->mapping->host, page);
+               error = nfs_fscache_read_page(page->mapping->host, page);
                if (error == 0)
                        goto out_unlock;
        }
@@ -397,14 +392,16 @@ out_unlock:
        return ret;
 }
 
-int nfs_readpages(struct file *file, struct address_space *mapping,
-               struct list_head *pages, unsigned nr_pages)
+void nfs_readahead(struct readahead_control *ractl)
 {
+       unsigned int nr_pages = readahead_count(ractl);
+       struct file *file = ractl->file;
        struct nfs_readdesc desc;
-       struct inode *inode = mapping->host;
+       struct inode *inode = ractl->mapping->host;
+       struct page *page;
        int ret;
 
-       trace_nfs_aop_readahead(inode, lru_to_page(pages), nr_pages);
+       trace_nfs_aop_readahead(inode, readahead_pos(ractl), nr_pages);
        nfs_inc_stats(inode, NFSIOS_VFSREADPAGES);
 
        ret = -ESTALE;
@@ -422,14 +419,18 @@ int nfs_readpages(struct file *file, struct address_space *mapping,
        nfs_pageio_init_read(&desc.pgio, inode, false,
                             &nfs_async_read_completion_ops);
 
-       ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);
+       while ((page = readahead_page(ractl)) != NULL) {
+               ret = readpage_async_filler(&desc, page);
+               put_page(page);
+               if (ret)
+                       break;
+       }
 
        nfs_pageio_complete_read(&desc.pgio);
 
        put_nfs_open_context(desc.ctx);
 out:
        trace_nfs_aop_readahead_done(inode, nr_pages, ret);
-       return ret;
 }
 
 int __init nfs_init_readpagecache(void)