aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/nfs/read.c')
-rw-r--r--fs/nfs/read.c30
1 files changed, 8 insertions, 22 deletions
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 2171c043ab08..cfa175c223dc 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -35,16 +35,13 @@ static const struct rpc_call_ops nfs_read_partial_ops;
35static const struct rpc_call_ops nfs_read_full_ops; 35static const struct rpc_call_ops nfs_read_full_ops;
36 36
37static struct kmem_cache *nfs_rdata_cachep; 37static struct kmem_cache *nfs_rdata_cachep;
38static mempool_t *nfs_rdata_mempool;
39
40#define MIN_POOL_READ (32)
41 38
42struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) 39struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
43{ 40{
44 struct nfs_read_data *p = mempool_alloc(nfs_rdata_mempool, GFP_KERNEL); 41 struct nfs_read_data *p;
45 42
43 p = kmem_cache_zalloc(nfs_rdata_cachep, GFP_KERNEL);
46 if (p) { 44 if (p) {
47 memset(p, 0, sizeof(*p));
48 INIT_LIST_HEAD(&p->pages); 45 INIT_LIST_HEAD(&p->pages);
49 p->npages = pagecount; 46 p->npages = pagecount;
50 if (pagecount <= ARRAY_SIZE(p->page_array)) 47 if (pagecount <= ARRAY_SIZE(p->page_array))
@@ -52,7 +49,7 @@ struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount)
52 else { 49 else {
53 p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_KERNEL); 50 p->pagevec = kcalloc(pagecount, sizeof(struct page *), GFP_KERNEL);
54 if (!p->pagevec) { 51 if (!p->pagevec) {
55 mempool_free(p, nfs_rdata_mempool); 52 kmem_cache_free(nfs_rdata_cachep, p);
56 p = NULL; 53 p = NULL;
57 } 54 }
58 } 55 }
@@ -64,7 +61,7 @@ void nfs_readdata_free(struct nfs_read_data *p)
64{ 61{
65 if (p && (p->pagevec != &p->page_array[0])) 62 if (p && (p->pagevec != &p->page_array[0]))
66 kfree(p->pagevec); 63 kfree(p->pagevec);
67 mempool_free(p, nfs_rdata_mempool); 64 kmem_cache_free(nfs_rdata_cachep, p);
68} 65}
69 66
70void nfs_readdata_release(struct nfs_read_data *rdata) 67void nfs_readdata_release(struct nfs_read_data *rdata)
@@ -112,7 +109,7 @@ static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
112 } 109 }
113} 110}
114 111
115static void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio, 112void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
116 struct inode *inode) 113 struct inode *inode)
117{ 114{
118 nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops, 115 nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops,
@@ -276,7 +273,6 @@ nfs_async_read_error(struct list_head *head)
276 while (!list_empty(head)) { 273 while (!list_empty(head)) {
277 req = nfs_list_entry(head->next); 274 req = nfs_list_entry(head->next);
278 nfs_list_remove_request(req); 275 nfs_list_remove_request(req);
279 SetPageError(req->wb_page);
280 nfs_readpage_release(req); 276 nfs_readpage_release(req);
281 } 277 }
282} 278}
@@ -322,7 +318,6 @@ static int nfs_pagein_multi(struct nfs_pageio_descriptor *desc, struct list_head
322 offset += len; 318 offset += len;
323 } while(nbytes != 0); 319 } while(nbytes != 0);
324 atomic_set(&req->wb_complete, requests); 320 atomic_set(&req->wb_complete, requests);
325 ClearPageError(page);
326 desc->pg_rpc_callops = &nfs_read_partial_ops; 321 desc->pg_rpc_callops = &nfs_read_partial_ops;
327 return ret; 322 return ret;
328out_bad: 323out_bad:
@@ -331,7 +326,6 @@ out_bad:
331 list_del(&data->list); 326 list_del(&data->list);
332 nfs_readdata_free(data); 327 nfs_readdata_free(data);
333 } 328 }
334 SetPageError(page);
335 nfs_readpage_release(req); 329 nfs_readpage_release(req);
336 return -ENOMEM; 330 return -ENOMEM;
337} 331}
@@ -357,7 +351,6 @@ static int nfs_pagein_one(struct nfs_pageio_descriptor *desc, struct list_head *
357 req = nfs_list_entry(head->next); 351 req = nfs_list_entry(head->next);
358 nfs_list_remove_request(req); 352 nfs_list_remove_request(req);
359 nfs_list_add_request(req, &data->pages); 353 nfs_list_add_request(req, &data->pages);
360 ClearPageError(req->wb_page);
361 *pages++ = req->wb_page; 354 *pages++ = req->wb_page;
362 } 355 }
363 req = nfs_list_entry(data->pages.next); 356 req = nfs_list_entry(data->pages.next);
@@ -435,7 +428,7 @@ static void nfs_readpage_retry(struct rpc_task *task, struct nfs_read_data *data
435 argp->offset += resp->count; 428 argp->offset += resp->count;
436 argp->pgbase += resp->count; 429 argp->pgbase += resp->count;
437 argp->count -= resp->count; 430 argp->count -= resp->count;
438 nfs_restart_rpc(task, NFS_SERVER(data->inode)->nfs_client); 431 rpc_restart_call_prepare(task);
439} 432}
440 433
441/* 434/*
@@ -462,10 +455,10 @@ static void nfs_readpage_release_partial(void *calldata)
462 int status = data->task.tk_status; 455 int status = data->task.tk_status;
463 456
464 if (status < 0) 457 if (status < 0)
465 SetPageError(page); 458 set_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags);
466 459
467 if (atomic_dec_and_test(&req->wb_complete)) { 460 if (atomic_dec_and_test(&req->wb_complete)) {
468 if (!PageError(page)) 461 if (!test_bit(PG_PARTIAL_READ_FAILED, &req->wb_flags))
469 SetPageUptodate(page); 462 SetPageUptodate(page);
470 nfs_readpage_release(req); 463 nfs_readpage_release(req);
471 } 464 }
@@ -648,7 +641,6 @@ readpage_async_filler(void *data, struct page *page)
648 return 0; 641 return 0;
649out_error: 642out_error:
650 error = PTR_ERR(new); 643 error = PTR_ERR(new);
651 SetPageError(page);
652out_unlock: 644out_unlock:
653 unlock_page(page); 645 unlock_page(page);
654 return error; 646 return error;
@@ -711,16 +703,10 @@ int __init nfs_init_readpagecache(void)
711 if (nfs_rdata_cachep == NULL) 703 if (nfs_rdata_cachep == NULL)
712 return -ENOMEM; 704 return -ENOMEM;
713 705
714 nfs_rdata_mempool = mempool_create_slab_pool(MIN_POOL_READ,
715 nfs_rdata_cachep);
716 if (nfs_rdata_mempool == NULL)
717 return -ENOMEM;
718
719 return 0; 706 return 0;
720} 707}
721 708
722void nfs_destroy_readpagecache(void) 709void nfs_destroy_readpagecache(void)
723{ 710{
724 mempool_destroy(nfs_rdata_mempool);
725 kmem_cache_destroy(nfs_rdata_cachep); 711 kmem_cache_destroy(nfs_rdata_cachep);
726} 712}