]> git.karo-electronics.de Git - karo-tx-linux.git/blob - fs/nfs/read.c
Merge branch 'perf/urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/acme...
[karo-tx-linux.git] / fs / nfs / read.c
1 /*
2  * linux/fs/nfs/read.c
3  *
4  * Block I/O for NFS
5  *
6  * Partial copy of Linus' read cache modifications to fs/nfs/file.c
7  * modified for async RPC by okir@monad.swb.de
8  */
9
10 #include <linux/time.h>
11 #include <linux/kernel.h>
12 #include <linux/errno.h>
13 #include <linux/fcntl.h>
14 #include <linux/stat.h>
15 #include <linux/mm.h>
16 #include <linux/slab.h>
17 #include <linux/pagemap.h>
18 #include <linux/sunrpc/clnt.h>
19 #include <linux/nfs_fs.h>
20 #include <linux/nfs_page.h>
21 #include <linux/module.h>
22
23 #include <asm/system.h>
24 #include "pnfs.h"
25
26 #include "nfs4_fs.h"
27 #include "internal.h"
28 #include "iostat.h"
29 #include "fscache.h"
30
31 #define NFSDBG_FACILITY         NFSDBG_PAGECACHE
32
33 static const struct nfs_pageio_ops nfs_pageio_read_ops;
34 static const struct rpc_call_ops nfs_read_partial_ops;
35 static const struct rpc_call_ops nfs_read_full_ops;
36
37 static struct kmem_cache *nfs_rdata_cachep;
38
39 struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
40 {
41         struct nfs_read_data *p;
42
43         p = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
44         if (p) {
45                 INIT_LIST_HEAD(&p->pages);
46                 p->npages = pagecount;
47                 if (pagecount <= ARRAY_SIZE(p->page_array))
48                         p->pagevec = p->page_array;
49                 else {
50                         p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_KERNEL);
51                         if (!p->pagevec) {
52                                 kmem_cache_free(nfs_rdata_cachep, p);
53                                 p = NULL;
54                         }
55                 }
56         }
57         return p;
58 }
59
60 void nfs_readdata_free(struct nfs_read_data *p)
61 {
62         if (p && (p->pagevec != &p->page_array[0]))
63                 kfree(p->pagevec);
64         kmem_cache_free(nfs_rdata_cachep, p);
65 }
66
67 void nfs_readdata_release(struct nfs_read_data *rdata)
68 {
69         put_nfs_open_context(rdata->args.context);
70         nfs_readdata_free(rdata);
71 }
72
73 static
74 int nfs_return_empty_page(struct page *page)
75 {
76         zero_user(page, 0, PAGE_CACHE_SIZE);
77         SetPageUptodate(page);
78         unlock_page(page);
79         return 0;
80 }
81
82 static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
83 {
84         unsigned int remainder = data->args.count - data->res.count;
85         unsigned int base = data->args.pgbase + data->res.count;
86         unsigned int pglen;
87         struct page **pages;
88
89         if (data->res.eof == 0 || remainder == 0)
90                 return;
91         /*
92          * Note: "remainder" can never be negative, since we check for
93          *      this in the XDR code.
94          */
95         pages = &data->args.pages[base >> PAGE_CACHE_SHIFT];
96         base &= ~PAGE_CACHE_MASK;
97         pglen = PAGE_CACHE_SIZE - base;
98         for (;;) {
99                 if (remainder <= pglen) {
100                         zero_user(*pages, base, remainder);
101                         break;
102                 }
103                 zero_user(*pages, base, pglen);
104                 pages++;
105                 remainder -= pglen;
106                 pglen = PAGE_CACHE_SIZE;
107                 base = 0;
108         }
109 }
110
111 void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
112                 struct inode *inode)
113 {
114         nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops,
115                         NFS_SERVER(inode)->rsize, 0);
116 }
117
118 void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio)
119 {
120         pgio->pg_ops = &nfs_pageio_read_ops;
121         pgio->pg_bsize = NFS_SERVER(pgio->pg_inode)->rsize;
122 }
123 EXPORT_SYMBOL_GPL(nfs_pageio_reset_read_mds);
124
125 static void nfs_pageio_init_read(struct nfs_pageio_descriptor *pgio,
126                 struct inode *inode)
127 {
128         if (!pnfs_pageio_init_read(pgio, inode))
129                 nfs_pageio_init_read_mds(pgio, inode);
130 }
131
132 int nfs_readpage_async(struct nfs_open_context *ctx, struct inode *inode,
133                        struct page *page)
134 {
135         struct nfs_page *new;
136         unsigned int len;
137         struct nfs_pageio_descriptor pgio;
138
139         len = nfs_page_length(page);
140         if (len == 0)
141                 return nfs_return_empty_page(page);
142         new = nfs_create_request(ctx, inode, page, 0, len);
143         if (IS_ERR(new)) {
144                 unlock_page(page);
145                 return PTR_ERR(new);
146         }
147         if (len < PAGE_CACHE_SIZE)
148                 zero_user_segment(page, len, PAGE_CACHE_SIZE);
149
150         nfs_pageio_init_read(&pgio, inode);
151         nfs_pageio_add_request(&pgio, new);
152         nfs_pageio_complete(&pgio);
153         return 0;
154 }
155
156 static void nfs_readpage_release(struct nfs_page *req)
157 {
158         struct inode *d_inode = req->wb_context->dentry->d_inode;
159
160         if (PageUptodate(req->wb_page))
161                 nfs_readpage_to_fscache(d_inode, req->wb_page, 0);
162
163         unlock_page(req->wb_page);
164
165         dprintk("NFS: read done (%s/%Ld %d@%Ld)\n",
166                         req->wb_context->dentry->d_inode->i_sb->s_id,
167                         (long long)NFS_FILEID(req->wb_context->dentry->d_inode),
168                         req->wb_bytes,
169                         (long long)req_offset(req));
170         nfs_release_request(req);
171 }
172
173 int nfs_initiate_read(struct nfs_read_data *data, struct rpc_clnt *clnt,
174                       const struct rpc_call_ops *call_ops)
175 {
176         struct inode *inode = data->inode;
177         int swap_flags = IS_SWAPFILE(inode) ? NFS_RPC_SWAPFLAGS : 0;
178         struct rpc_task *task;
179         struct rpc_message msg = {
180                 .rpc_argp = &data->args,
181                 .rpc_resp = &data->res,
182                 .rpc_cred = data->cred,
183         };
184         struct rpc_task_setup task_setup_data = {
185                 .task = &data->task,
186                 .rpc_client = clnt,
187                 .rpc_message = &msg,
188                 .callback_ops = call_ops,
189                 .callback_data = data,
190                 .workqueue = nfsiod_workqueue,
191                 .flags = RPC_TASK_ASYNC | swap_flags,
192         };
193
194         /* Set up the initial task struct. */
195         NFS_PROTO(inode)->read_setup(data, &msg);
196
197         dprintk("NFS: %5u initiated read call (req %s/%lld, %u bytes @ "
198                         "offset %llu)\n",
199                         data->task.tk_pid,
200                         inode->i_sb->s_id,
201                         (long long)NFS_FILEID(inode),
202                         data->args.count,
203                         (unsigned long long)data->args.offset);
204
205         task = rpc_run_task(&task_setup_data);
206         if (IS_ERR(task))
207                 return PTR_ERR(task);
208         rpc_put_task(task);
209         return 0;
210 }
211 EXPORT_SYMBOL_GPL(nfs_initiate_read);
212
213 /*
214  * Set up the NFS read request struct
215  */
216 static void nfs_read_rpcsetup(struct nfs_page *req, struct nfs_read_data *data,
217                 unsigned int count, unsigned int offset)
218 {
219         struct inode *inode = req->wb_context->dentry->d_inode;
220
221         data->req         = req;
222         data->inode       = inode;
223         data->cred        = req->wb_context->cred;
224
225         data->args.fh     = NFS_FH(inode);
226         data->args.offset = req_offset(req) + offset;
227         data->args.pgbase = req->wb_pgbase + offset;
228         data->args.pages  = data->pagevec;
229         data->args.count  = count;
230         data->args.context = get_nfs_open_context(req->wb_context);
231         data->args.lock_context = req->wb_lock_context;
232
233         data->res.fattr   = &data->fattr;
234         data->res.count   = count;
235         data->res.eof     = 0;
236         nfs_fattr_init(&data->fattr);
237 }
238
239 static int nfs_do_read(struct nfs_read_data *data,
240                 const struct rpc_call_ops *call_ops)
241 {
242         struct inode *inode = data->args.context->dentry->d_inode;
243
244         return nfs_initiate_read(data, NFS_CLIENT(inode), call_ops);
245 }
246
247 static int
248 nfs_do_multiple_reads(struct list_head *head,
249                 const struct rpc_call_ops *call_ops)
250 {
251         struct nfs_read_data *data;
252         int ret = 0;
253
254         while (!list_empty(head)) {
255                 int ret2;
256
257                 data = list_entry(head->next, struct nfs_read_data, list);
258                 list_del_init(&data->list);
259
260                 ret2 = nfs_do_read(data, call_ops);
261                 if (ret == 0)
262                         ret = ret2;
263         }
264         return ret;
265 }
266
267 static void
268 nfs_async_read_error(struct list_head *head)
269 {
270         struct nfs_page *req;
271
272         while (!list_empty(head)) {
273                 req = nfs_list_entry(head->next);
274                 nfs_list_remove_request(req);
275                 nfs_readpage_release(req);
276         }
277 }
278
279 /*
280  * Generate multiple requests to fill a single page.
281  *
282  * We optimize to reduce the number of read operations on the wire.  If we
283  * detect that we're reading a page, or an area of a page, that is past the
284  * end of file, we do not generate NFS read operations but just clear the
285  * parts of the page that would have come back zero from the server anyway.
286  *
287  * We rely on the cached value of i_size to make this determination; another
288  * client can fill pages on the server past our cached end-of-file, but we
289  * won't see the new data until our attribute cache is updated.  This is more
290  * or less conventional NFS client behavior.
291  */
292 static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc, struct list_head *res)
293 {
294         struct nfs_page *req = nfs_list_entry(desc->pg_list.next);
295         struct page *page = req->wb_page;
296         struct nfs_read_data *data;
297         size_t rsize = desc->pg_bsize, nbytes;
298         unsigned int offset;
299         int requests = 0;
300         int ret = 0;
301
302         nfs_list_remove_request(req);
303
304         offset = 0;
305         nbytes = desc->pg_count;
306         do {
307                 size_t len = min(nbytes,rsize);
308
309                 data = nfs_readdata_alloc(1);
310                 if (!data)
311                         goto out_bad;
312                 data->pagevec[0] = page;
313                 nfs_read_rpcsetup(req, data, len, offset);
314                 list_add(&data->list, res);
315                 requests++;
316                 nbytes -= len;
317                 offset += len;
318         } while(nbytes != 0);
319         atomic_set(&req->wb_complete, requests);
320         desc->pg_rpc_callops = &nfs_read_partial_ops;
321         return ret;
322 out_bad:
323         while (!list_empty(res)) {
324                 data = list_entry(res->next, struct nfs_read_data, list);
325                 list_del(&data->list);
326                 nfs_readdata_free(data);
327         }
328         nfs_readpage_release(req);
329         return -ENOMEM;
330 }
331
332 static int nfs_pagein_one(struct nfs_pageio_descriptor *desc, struct list_head *res)
333 {
334         struct nfs_page         *req;
335         struct page             **pages;
336         struct nfs_read_data    *data;
337         struct list_head *head = &desc->pg_list;
338         int ret = 0;
339
340         data = nfs_readdata_alloc(nfs_page_array_len(desc->pg_base,
341                                                      desc->pg_count));
342         if (!data) {
343                 nfs_async_read_error(head);
344                 ret = -ENOMEM;
345                 goto out;
346         }
347
348         pages = data->pagevec;
349         while (!list_empty(head)) {
350                 req = nfs_list_entry(head->next);
351                 nfs_list_remove_request(req);
352                 nfs_list_add_request(req, &data->pages);
353                 *pages++ = req->wb_page;
354         }
355         req = nfs_list_entry(data->pages.next);
356
357         nfs_read_rpcsetup(req, data, desc->pg_count, 0);
358         list_add(&data->list, res);
359         desc->pg_rpc_callops = &nfs_read_full_ops;
360 out:
361         return ret;
362 }
363
364 int nfs_generic_pagein(struct nfs_pageio_descriptor *desc, struct list_head *head)
365 {
366         if (desc->pg_bsize < PAGE_CACHE_SIZE)
367                 return nfs_pagein_multi(desc, head);
368         return nfs_pagein_one(desc, head);
369 }
370
371 static int nfs_generic_pg_readpages(struct nfs_pageio_descriptor *desc)
372 {
373         LIST_HEAD(head);
374         int ret;
375
376         ret = nfs_generic_pagein(desc, &head);
377         if (ret == 0)
378                 ret = nfs_do_multiple_reads(&head, desc->pg_rpc_callops);
379         return ret;
380 }
381
382 static const struct nfs_pageio_ops nfs_pageio_read_ops = {
383         .pg_test = nfs_generic_pg_test,
384         .pg_doio = nfs_generic_pg_readpages,
385 };
386
387 /*
388  * This is the callback from RPC telling us whether a reply was
389  * received or some error occurred (timeout or socket shutdown).
390  */
391 int nfs_readpage_result(struct rpc_task *task, struct nfs_read_data *data)
392 {
393         int status;
394
395         dprintk("NFS: %s: %5u, (status %d)\n", __func__, task->tk_pid,
396                         task->tk_status);
397
398         status = NFS_PROTO(data->inode)->read_done(task, data);
399         if (status != 0)
400                 return status;
401
402         nfs_add_stats(data->inode, NFSIOS_SERVERREADBYTES, data->res.count);
403
404         if (task->tk_status == -ESTALE) {
405                 set_bit(NFS_INO_STALE, &NFS_I(data->inode)->flags);
406                 nfs_mark_for_revalidate(data->inode);
407         }
408         return 0;
409 }
410
411 static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data)
412 {
413         struct nfs_readargs *argp = &data->args;
414         struct nfs_readres *resp = &data->res;
415
416         if (resp->eof || resp->count == argp->count)
417                 return;
418
419         /* This is a short read! */
420         nfs_inc_stats(data->inode, NFSIOS_SHORTREAD);
421         /* Has the server at least made some progress? */
422         if (resp->count == 0)
423                 return;
424
425         /* Yes, so retry the read at the end of the data */
426         data->mds_offset += resp->count;
427         argp->offset += resp->count;
428         argp->pgbase += resp->count;
429         argp->count -= resp->count;
430         rpc_restart_call_prepare(task);
431 }
432
433 /*
434  * Handle a read reply that fills part of a page.
435  */
436 static void nfs_readpage_result_partial(struct rpc_task *task, void *calldata)
437 {
438         struct nfs_read_data *data = calldata;
439  
440         if (nfs_readpage_result(task, data) != 0)
441                 return;
442         if (task->tk_status < 0)
443                 return;
444
445         nfs_readpage_truncate_uninitialised_page(data);
446         nfs_readpage_retry(task, data);
447 }
448
449 static void nfs_readpage_release_partial(void *calldata)
450 {
451         struct nfs_read_data *data = calldata;
452         struct nfs_page *req = data->req;
453         struct page *page = req->wb_page;
454         int status = data->task.tk_status;
455
456         if (status < 0)
457                 set_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags);
458
459         if (atomic_dec_and_test(&req->wb_complete)) {
460                 if (!test_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags))
461                         SetPageUptodate(page);
462                 nfs_readpage_release(req);
463         }
464         nfs_readdata_release(calldata);
465 }
466
467 void nfs_read_prepare(struct rpc_task *task, void *calldata)
468 {
469         struct nfs_read_data *data = calldata;
470         NFS_PROTO(data->inode)->read_rpc_prepare(task, data);
471 }
472
473 static const struct rpc_call_ops nfs_read_partial_ops = {
474         .rpc_call_prepare = nfs_read_prepare,
475         .rpc_call_done = nfs_readpage_result_partial,
476         .rpc_release = nfs_readpage_release_partial,
477 };
478
479 static void nfs_readpage_set_pages_uptodate(struct nfs_read_data *data)
480 {
481         unsigned int count = data->res.count;
482         unsigned int base = data->args.pgbase;
483         struct page **pages;
484
485         if (data->res.eof)
486                 count = data->args.count;
487         if (unlikely(count == 0))
488                 return;
489         pages = &data->args.pages[base >> PAGE_CACHE_SHIFT];
490         base &= ~PAGE_CACHE_MASK;
491         count += base;
492         for (;count >= PAGE_CACHE_SIZE; count -= PAGE_CACHE_SIZE, pages++)
493                 SetPageUptodate(*pages);
494         if (count == 0)
495                 return;
496         /* Was this a short read? */
497         if (data->res.eof || data->res.count == data->args.count)
498                 SetPageUptodate(*pages);
499 }
500
501 /*
502  * This is the callback from RPC telling us whether a reply was
503  * received or some error occurred (timeout or socket shutdown).
504  */
505 static void nfs_readpage_result_full(struct rpc_task *task, void *calldata)
506 {
507         struct nfs_read_data *data = calldata;
508
509         if (nfs_readpage_result(task, data) != 0)
510                 return;
511         if (task->tk_status < 0)
512                 return;
513         /*
514          * Note: nfs_readpage_retry may change the values of
515          * data->args. In the multi-page case, we therefore need
516          * to ensure that we call nfs_readpage_set_pages_uptodate()
517          * first.
518          */
519         nfs_readpage_truncate_uninitialised_page(data);
520         nfs_readpage_set_pages_uptodate(data);
521         nfs_readpage_retry(task, data);
522 }
523
524 static void nfs_readpage_release_full(void *calldata)
525 {
526         struct nfs_read_data *data = calldata;
527
528         while (!list_empty(&data->pages)) {
529                 struct nfs_page *req = nfs_list_entry(data->pages.next);
530
531                 nfs_list_remove_request(req);
532                 nfs_readpage_release(req);
533         }
534         nfs_readdata_release(calldata);
535 }
536
537 static const struct rpc_call_ops nfs_read_full_ops = {
538         .rpc_call_prepare = nfs_read_prepare,
539         .rpc_call_done = nfs_readpage_result_full,
540         .rpc_release = nfs_readpage_release_full,
541 };
542
543 /*
544  * Read a page over NFS.
545  * We read the page synchronously in the following case:
546  *  -   The error flag is set for this page. This happens only when a
547  *      previous async read operation failed.
548  */
549 int nfs_readpage(struct file *file, struct page *page)
550 {
551         struct nfs_open_context *ctx;
552         struct inode *inode = page->mapping->host;
553         int             error;
554
555         dprintk("NFS: nfs_readpage (%p %ld@%lu)\n",
556                 page, PAGE_CACHE_SIZE, page->index);
557         nfs_inc_stats(inode, NFSIOS_VFSREADPAGE);
558         nfs_add_stats(inode, NFSIOS_READPAGES, 1);
559
560         /*
561          * Try to flush any pending writes to the file..
562          *
563          * NOTE! Because we own the page lock, there cannot
564          * be any new pending writes generated at this point
565          * for this page (other pages can be written to).
566          */
567         error = nfs_wb_page(inode, page);
568         if (error)
569                 goto out_unlock;
570         if (PageUptodate(page))
571                 goto out_unlock;
572
573         error = -ESTALE;
574         if (NFS_STALE(inode))
575                 goto out_unlock;
576
577         if (file == NULL) {
578                 error = -EBADF;
579                 ctx = nfs_find_open_context(inode, NULL, FMODE_READ);
580                 if (ctx == NULL)
581                         goto out_unlock;
582         } else
583                 ctx = get_nfs_open_context(nfs_file_open_context(file));
584
585         if (!IS_SYNC(inode)) {
586                 error = nfs_readpage_from_fscache(ctx, inode, page);
587                 if (error == 0)
588                         goto out;
589         }
590
591         error = nfs_readpage_async(ctx, inode, page);
592
593 out:
594         put_nfs_open_context(ctx);
595         return error;
596 out_unlock:
597         unlock_page(page);
598         return error;
599 }
600
601 struct nfs_readdesc {
602         struct nfs_pageio_descriptor *pgio;
603         struct nfs_open_context *ctx;
604 };
605
606 static int
607 readpage_async_filler(void *data, struct page *page)
608 {
609         struct nfs_readdesc *desc = (struct nfs_readdesc *)data;
610         struct inode *inode = page->mapping->host;
611         struct nfs_page *new;
612         unsigned int len;
613         int error;
614
615         len = nfs_page_length(page);
616         if (len == 0)
617                 return nfs_return_empty_page(page);
618
619         new = nfs_create_request(desc->ctx, inode, page, 0, len);
620         if (IS_ERR(new))
621                 goto out_error;
622
623         if (len < PAGE_CACHE_SIZE)
624                 zero_user_segment(page, len, PAGE_CACHE_SIZE);
625         if (!nfs_pageio_add_request(desc->pgio, new)) {
626                 error = desc->pgio->pg_error;
627                 goto out_unlock;
628         }
629         return 0;
630 out_error:
631         error = PTR_ERR(new);
632 out_unlock:
633         unlock_page(page);
634         return error;
635 }
636
637 int nfs_readpages(struct file *filp, struct address_space *mapping,
638                 struct list_head *pages, unsigned nr_pages)
639 {
640         struct nfs_pageio_descriptor pgio;
641         struct nfs_readdesc desc = {
642                 .pgio = &pgio,
643         };
644         struct inode *inode = mapping->host;
645         unsigned long npages;
646         int ret = -ESTALE;
647
648         dprintk("NFS: nfs_readpages (%s/%Ld %d)\n",
649                         inode->i_sb->s_id,
650                         (long long)NFS_FILEID(inode),
651                         nr_pages);
652         nfs_inc_stats(inode, NFSIOS_VFSREADPAGES);
653
654         if (NFS_STALE(inode))
655                 goto out;
656
657         if (filp == NULL) {
658                 desc.ctx = nfs_find_open_context(inode, NULL, FMODE_READ);
659                 if (desc.ctx == NULL)
660                         return -EBADF;
661         } else
662                 desc.ctx = get_nfs_open_context(nfs_file_open_context(filp));
663
664         /* attempt to read as many of the pages as possible from the cache
665          * - this returns -ENOBUFS immediately if the cookie is negative
666          */
667         ret = nfs_readpages_from_fscache(desc.ctx, inode, mapping,
668                                          pages, &nr_pages);
669         if (ret == 0)
670                 goto read_complete; /* all pages were read */
671
672         nfs_pageio_init_read(&pgio, inode);
673
674         ret = read_cache_pages(mapping, pages, readpage_async_filler, &desc);
675
676         nfs_pageio_complete(&pgio);
677         npages = (pgio.pg_bytes_written + PAGE_CACHE_SIZE - 1) >> PAGE_CACHE_SHIFT;
678         nfs_add_stats(inode, NFSIOS_READPAGES, npages);
679 read_complete:
680         put_nfs_open_context(desc.ctx);
681 out:
682         return ret;
683 }
684
685 int __init nfs_init_readpagecache(void)
686 {
687         nfs_rdata_cachep = kmem_cache_create("nfs_read_data",
688                                              sizeof(struct nfs_read_data),
689                                              0, SLAB_HWCACHE_ALIGN,
690                                              NULL);
691         if (nfs_rdata_cachep == NULL)
692                 return -ENOMEM;
693
694         return 0;
695 }
696
697 void nfs_destroy_readpagecache(void)
698 {
699         kmem_cache_destroy(nfs_rdata_cachep);
700 }