diff options
Diffstat (limited to 'fs/nfs/read.c')
-rw-r--r-- | fs/nfs/read.c | 30 |
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; | |||
35 | static const struct rpc_call_ops nfs_read_full_ops; | 35 | static const struct rpc_call_ops nfs_read_full_ops; |
36 | 36 | ||
37 | static struct kmem_cache *nfs_rdata_cachep; | 37 | static struct kmem_cache *nfs_rdata_cachep; |
38 | static mempool_t *nfs_rdata_mempool; | ||
39 | |||
40 | #define MIN_POOL_READ (32) | ||
41 | 38 | ||
42 | struct nfs_read_data *nfs_readdata_alloc(unsigned int pagecount) | 39 | struct 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 | ||
70 | void nfs_readdata_release(struct nfs_read_data *rdata) | 67 | void 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 | ||
115 | static void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio, | 112 | void 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; |
328 | out_bad: | 323 | out_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; |
649 | out_error: | 642 | out_error: |
650 | error = PTR_ERR(new); | 643 | error = PTR_ERR(new); |
651 | SetPageError(page); | ||
652 | out_unlock: | 644 | out_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 | ||
722 | void nfs_destroy_readpagecache(void) | 709 | void 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 | } |