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:
Родитель
98c27f276b
Коммит
8786fde842
|
@ -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
|
||||
|
|
Загрузка…
Ссылка в новой задаче