Convert NFS from readpages to readahead

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>
This commit is contained in:
Matthew Wilcox (Oracle) 2022-01-22 20:54:52 +00:00 коммит произвёл Trond Myklebust
Родитель 98c27f276b
Коммит 8786fde842
4 изменённых файлов: 18 добавлений и 14 удалений

Просмотреть файл

@ -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,

Просмотреть файл

@ -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;
),

Просмотреть файл

@ -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)

Просмотреть файл

@ -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