aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--fs/nfs/internal.h2
-rw-r--r--fs/nfs/pnfs.c26
-rw-r--r--fs/nfs/read.c14
3 files changed, 25 insertions, 17 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h
index c1a1bd8ddf1..3f4d95751d5 100644
--- a/fs/nfs/internal.h
+++ b/fs/nfs/internal.h
@@ -299,6 +299,8 @@ extern void nfs_read_prepare(struct rpc_task *task, void *calldata);
299extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc, 299extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc,
300 struct list_head *head); 300 struct list_head *head);
301 301
302extern void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
303 struct inode *inode);
302extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio); 304extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio);
303extern void nfs_readdata_release(struct nfs_read_data *rdata); 305extern void nfs_readdata_release(struct nfs_read_data *rdata);
304 306
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c
index a2478bc7444..e40a3ca22ea 100644
--- a/fs/nfs/pnfs.c
+++ b/fs/nfs/pnfs.c
@@ -1259,6 +1259,25 @@ pnfs_generic_pg_writepages(struct nfs_pageio_descriptor *desc)
1259} 1259}
1260EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages); 1260EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages);
1261 1261
1262static void pnfs_ld_handle_read_error(struct nfs_read_data *data)
1263{
1264 struct nfs_pageio_descriptor pgio;
1265
1266 put_lseg(data->lseg);
1267 data->lseg = NULL;
1268 dprintk("pnfs write error = %d\n", data->pnfs_error);
1269
1270 nfs_pageio_init_read_mds(&pgio, data->inode);
1271
1272 while (!list_empty(&data->pages)) {
1273 struct nfs_page *req = nfs_list_entry(data->pages.next);
1274
1275 nfs_list_remove_request(req);
1276 nfs_pageio_add_request(&pgio, req);
1277 }
1278 nfs_pageio_complete(&pgio);
1279}
1280
1262/* 1281/*
1263 * Called by non rpc-based layout drivers 1282 * Called by non rpc-based layout drivers
1264 */ 1283 */
@@ -1267,11 +1286,8 @@ void pnfs_ld_read_done(struct nfs_read_data *data)
1267 if (likely(!data->pnfs_error)) { 1286 if (likely(!data->pnfs_error)) {
1268 __nfs4_read_done_cb(data); 1287 __nfs4_read_done_cb(data);
1269 data->mds_ops->rpc_call_done(&data->task, data); 1288 data->mds_ops->rpc_call_done(&data->task, data);
1270 } else { 1289 } else
1271 put_lseg(data->lseg); 1290 pnfs_ld_handle_read_error(data);
1272 data->lseg = NULL;
1273 dprintk("pnfs write error = %d\n", data->pnfs_error);
1274 }
1275 data->mds_ops->rpc_release(data); 1291 data->mds_ops->rpc_release(data);
1276} 1292}
1277EXPORT_SYMBOL_GPL(pnfs_ld_read_done); 1293EXPORT_SYMBOL_GPL(pnfs_ld_read_done);
diff --git a/fs/nfs/read.c b/fs/nfs/read.c
index 8b48ec63f72..cfa175c223d 100644
--- a/fs/nfs/read.c
+++ b/fs/nfs/read.c
@@ -109,7 +109,7 @@ static void nfs_readpage_truncate_uninitialised_page(struct nfs_read_data *data)
109 } 109 }
110} 110}
111 111
112static void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio, 112void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio,
113 struct inode *inode) 113 struct inode *inode)
114{ 114{
115 nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops, 115 nfs_pageio_init(pgio, inode, &nfs_pageio_read_ops,
@@ -534,23 +534,13 @@ static void nfs_readpage_result_full(struct rpc_task *task, void *calldata)
534static void nfs_readpage_release_full(void *calldata) 534static void nfs_readpage_release_full(void *calldata)
535{ 535{
536 struct nfs_read_data *data = calldata; 536 struct nfs_read_data *data = calldata;
537 struct nfs_pageio_descriptor pgio;
538 537
539 if (data->pnfs_error) {
540 nfs_pageio_init_read_mds(&pgio, data->inode);
541 pgio.pg_recoalesce = 1;
542 }
543 while (!list_empty(&data->pages)) { 538 while (!list_empty(&data->pages)) {
544 struct nfs_page *req = nfs_list_entry(data->pages.next); 539 struct nfs_page *req = nfs_list_entry(data->pages.next);
545 540
546 nfs_list_remove_request(req); 541 nfs_list_remove_request(req);
547 if (!data->pnfs_error) 542 nfs_readpage_release(req);
548 nfs_readpage_release(req);
549 else
550 nfs_pageio_add_request(&pgio, req);
551 } 543 }
552 if (data->pnfs_error)
553 nfs_pageio_complete(&pgio);
554 nfs_readdata_release(calldata); 544 nfs_readdata_release(calldata);
555} 545}
556 546