aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/read.c
diff options
context:
space:
mode:
authorFred Isaman <iisaman@netapp.com>2012-04-20 14:47:48 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-04-27 14:10:38 -0400
commit061ae2edb7375ab6776468b075da71008a098b55 (patch)
treea34f25d4d85d90a196b058b879eef3ba374f6d16 /fs/nfs/read.c
parent6c75dc0d498caa402fb17b1bf769835a9db875c8 (diff)
NFS: create completion structure to pass into page_init functions
Factors out the code that will need to change when directio starts using these code paths. This will allow directio to use the generic pagein and flush routines Signed-off-by: Fred Isaman <iisaman@netapp.com> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs/read.c')
-rw-r--r--fs/nfs/read.c36
1 files changed, 22 insertions, 14 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index c9633b2501b..5e78af16203 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -31,6 +31,7 @@
31 31
32static const struct nfs_pageio_ops nfs_pageio_read_ops; 32static const struct nfs_pageio_ops nfs_pageio_read_ops;
33static const struct rpc_call_ops nfs_read_common_ops; 33static const struct rpc_call_ops nfs_read_common_ops;
34static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops;
34 35
35static struct kmem_cache *nfs_rdata_cachep; 36static struct kmem_cache *nfs_rdata_cachep;
36 37
@@ -95,7 +96,7 @@ void nfs_readdata_release(struct nfs_read_data *rdata)
95 else 96 else
96 rdata->header = NULL; 97 rdata->header = NULL;
97 if (atomic_dec_and_test(&hdr->refcnt)) 98 if (atomic_dec_and_test(&hdr->refcnt))
98 nfs_read_completion(hdr); 99 hdr->completion_ops->completion(hdr);
99} 100}
100 101
101static 102static
@@ -108,9 +109,10 @@ int nfs_return_empty_page(struct page *page)
108} 109}
109 110
110void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio, 111void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
111 struct inode *inode) 112 struct inode *inode,
113 const struct nfs_pgio_completion_ops *compl_ops)
112{ 114{
113 nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops, 115 nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops, compl_ops,
114 NFS_SERVER(inode)->rsize, 0); 116 NFS_SERVER(inode)->rsize, 0);
115} 117}
116 118
@@ -122,10 +124,11 @@ void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio)
122EXPORT_SYMBOL_GPL(nfs_pageio_reset_read_mds); 124EXPORT_SYMBOL_GPL(nfs_pageio_reset_read_mds);
123 125
124static void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio, 126static void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
125 struct inode *inode) 127 struct inode *inode,
128 const struct nfs_pgio_completion_ops *compl_ops)
126{ 129{
127 if (!pnfs_pageio_init_read(pgio, inode)) 130 if (!pnfs_pageio_init_read(pgio, inode, compl_ops))
128 nfs_pageio_init_read_mds(pgio, inode); 131 nfs_pageio_init_read_mds(pgio, inode, compl_ops);
129} 132}
130 133
131int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode, 134int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
@@ -146,7 +149,7 @@ int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
146 if (len < PAGE_CACHE_SIZE) 149 if (len < PAGE_CACHE_SIZE)
147 zero_user_segment(page, len, PAGE_CACHE_SIZE); 150 zero_user_segment(page, len, PAGE_CACHE_SIZE);
148 151
149 nfs_pageio_init_read(&pgio, inode); 152 nfs_pageio_init_read(&pgio, inode, &nfs_async_read_completion_ops);
150 nfs_pageio_add_request(&pgio, new); 153 nfs_pageio_add_request(&pgio, new);
151 nfs_pageio_complete(&pgio); 154 nfs_pageio_complete(&pgio);
152 return 0; 155 return 0;
@@ -170,7 +173,7 @@ static void nfs_readpage_release(struct nfs_page *req)
170} 173}
171 174
172/* Note io was page aligned */ 175/* Note io was page aligned */
173void nfs_read_completion(struct nfs_pgio_header *hdr) 176static void nfs_read_completion(struct nfs_pgio_header *hdr)
174{ 177{
175 unsigned long bytes = 0; 178 unsigned long bytes = 0;
176 179
@@ -300,7 +303,7 @@ nfs_do_multiple_reads(struct list_head *head,
300 return ret; 303 return ret;
301} 304}
302 305
303void 306static void
304nfs_async_read_error(struct list_head *head) 307nfs_async_read_error(struct list_head *head)
305{ 308{
306 struct nfs_page *req; 309 struct nfs_page *req;
@@ -312,6 +315,11 @@ nfs_async_read_error(struct list_head *head)
312 } 315 }
313} 316}
314 317
318static const struct nfs_pgio_completion_ops nfs_async_read_completion_ops = {
319 .error_cleanup = nfs_async_read_error,
320 .completion = nfs_read_completion,
321};
322
315/* 323/*
316 * Generate multiple requests to fill a single page. 324 * Generate multiple requests to fill a single page.
317 * 325 *
@@ -362,7 +370,7 @@ out_bad:
362 list_del(&data->list); 370 list_del(&data->list);
363 nfs_readdata_release(data); 371 nfs_readdata_release(data);
364 } 372 }
365 nfs_async_read_error(&hdr->pages); 373 desc->pg_completion_ops->error_cleanup(&hdr->pages);
366 return -ENOMEM; 374 return -ENOMEM;
367} 375}
368 376
@@ -378,7 +386,7 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc,
378 data = nfs_readdata_alloc(hdr, nfs_page_array_len(desc->pg_base, 386 data = nfs_readdata_alloc(hdr, nfs_page_array_len(desc->pg_base,
379 desc->pg_count)); 387 desc->pg_count));
380 if (!data) { 388 if (!data) {
381 nfs_async_read_error(head); 389 desc->pg_completion_ops->error_cleanup(head);
382 ret = -ENOMEM; 390 ret = -ENOMEM;
383 goto out; 391 goto out;
384 } 392 }
@@ -414,7 +422,7 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
414 422
415 rhdr = nfs_readhdr_alloc(); 423 rhdr = nfs_readhdr_alloc();
416 if (!rhdr) { 424 if (!rhdr) {
417 nfs_async_read_error(&desc->pg_list); 425 desc->pg_completion_ops->error_cleanup(&desc->pg_list);
418 return -ENOMEM; 426 return -ENOMEM;
419 } 427 }
420 hdr = &rhdr->header; 428 hdr = &rhdr->header;
@@ -427,7 +435,7 @@ static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
427 else 435 else
428 set_bit(NFS_IOHDR_REDO, &hdr->flags); 436 set_bit(NFS_IOHDR_REDO, &hdr->flags);
429 if (atomic_dec_and_test(&hdr->refcnt)) 437 if (atomic_dec_and_test(&hdr->refcnt))
430 nfs_read_completion(hdr); 438 hdr->completion_ops->completion(hdr);
431 return ret; 439 return ret;
432} 440}
433 441
@@ -652,7 +660,7 @@ int nfs_readpages(struct file *filp, struct address_space *mapping,
652 if (ret == 0) 660 if (ret == 0)
653 goto read_complete; /* all pages were read */ 661 goto read_complete; /* all pages were read */
654 662
655 nfs_pageio_init_read(&pgio, inode); 663 nfs_pageio_init_read(&pgio, inode, &nfs_async_read_completion_ops);
656 664
657 ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc); 665 ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);
658 666