Convert NFS from readpages to readahead
authorMatthew Wilcox (Oracle) <willy@infradead.org>
Sat, 22 Jan 2022 20:54:52 +0000 (20:54 +0000)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Fri, 25 Feb 2022 20:07:07 +0000 (15:07 -0500)
NFS is one of the last two users of the deprecated ->readpages aop.
This conversion looks straightforward, but I have only compile-tested
it.

Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/file.c
fs/nfs/nfstrace.h
fs/nfs/read.c
include/linux/nfs_fs.h

index 76d76acbc594397dd52307815282e437001b7d4b..4d681683d13cb09366e2b5ba06bfe888476e5f67 100644 (file)
@@ -514,7 +514,7 @@ static void nfs_swap_deactivate(struct file *file)
 
 const struct address_space_operations nfs_file_aops = {
        .readpage = nfs_readpage,
-       .readpages = nfs_readpages,
+       .readahead = nfs_readahead,
        .set_page_dirty = __set_page_dirty_nobuffers,
        .writepage = nfs_writepage,
        .writepages = nfs_writepages,
index 317ce27bdc4b8fceaf61834b674b7f9312654a39..4611aa3a21a46e2a35e67819db33a40e68a82386 100644 (file)
@@ -889,11 +889,11 @@ TRACE_EVENT(nfs_aop_readpage_done,
 TRACE_EVENT(nfs_aop_readahead,
                TP_PROTO(
                        const struct inode *inode,
-                       struct page *page,
+                       loff_t pos,
                        unsigned int nr_pages
                ),
 
-               TP_ARGS(inode, page, nr_pages),
+               TP_ARGS(inode, pos, nr_pages),
 
                TP_STRUCT__entry(
                        __field(dev_t, dev)
@@ -911,7 +911,7 @@ TRACE_EVENT(nfs_aop_readahead,
                        __entry->fileid = nfsi->fileid;
                        __entry->fhandle = nfs_fhandle_hash(&nfsi->fh);
                        __entry->version = inode_peek_iversion_raw(inode);
-                       __entry->offset = page_index(page) << PAGE_SHIFT;
+                       __entry->offset = pos;
                        __entry->nr_pages = nr_pages;
                ),
 
index eb00229c1a501b55bf55a4f7a6b2579ae151b0a3..2472f962a9a2390edbb5fb34ac47172d4c992ce9 100644 (file)
@@ -290,9 +290,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;
@@ -397,14 +396,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 +423,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)
index 68f81d8d36def119a1c53215cb6d6ddef27526f1..333ea05e253194d1303f563d580f85049b9e968b 100644 (file)
@@ -601,8 +601,7 @@ nfs_have_writebacks(struct inode *inode)
  * linux/fs/nfs/read.c
  */
 extern int  nfs_readpage(struct file *, struct page *);
-extern int  nfs_readpages(struct file *, struct address_space *,
-               struct list_head *, unsigned);
+void nfs_readahead(struct readahead_control *);
 
 /*
  * inline functions