diff options
author | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-11-10 14:30:37 -0500 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2011-11-10 14:50:26 -0500 |
commit | 62e4a76987eab2b7fa952546614bc83e5bfc9d3e (patch) | |
tree | 433ab5bde90a8d2dbeeabc29a6aa0c25deae5732 | |
parent | 2aa13531bbbc6582874bedfcd853e1058b0fb4f9 (diff) |
NFS: Revert pnfs ugliness from the generic NFS read code path
pNFS-specific code belongs in the pnfs layer. It should not be
hijacking generic NFS read or write code paths.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
-rw-r--r-- | fs/nfs/internal.h | 2 | ||||
-rw-r--r-- | fs/nfs/pnfs.c | 26 | ||||
-rw-r--r-- | fs/nfs/read.c | 14 |
3 files changed, 25 insertions, 17 deletions
diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index c1a1bd8ddf1c..3f4d95751d52 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); | |||
299 | extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc, | 299 | extern int nfs_generic_pagein(struct nfs_pageio_descriptor *desc, |
300 | struct list_head *head); | 300 | struct list_head *head); |
301 | 301 | ||
302 | extern void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio, | ||
303 | struct inode *inode); | ||
302 | extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio); | 304 | extern void nfs_pageio_reset_read_mds(struct nfs_pageio_descriptor *pgio); |
303 | extern void nfs_readdata_release(struct nfs_read_data *rdata); | 305 | extern void nfs_readdata_release(struct nfs_read_data *rdata); |
304 | 306 | ||
diff --git a/fs/nfs/pnfs.c b/fs/nfs/pnfs.c index a2478bc74442..e40a3ca22eaf 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 | } |
1260 | EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages); | 1260 | EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages); |
1261 | 1261 | ||
1262 | static 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 | } |
1277 | EXPORT_SYMBOL_GPL(pnfs_ld_read_done); | 1293 | EXPORT_SYMBOL_GPL(pnfs_ld_read_done); |
diff --git a/fs/nfs/read.c b/fs/nfs/read.c index 8b48ec63f722..cfa175c223dc 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 | ||
112 | static void nfs_pageio_init_read_mds(struct nfs_pageio_descriptor *pgio, | 112 | void 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) | |||
534 | static void nfs_readpage_release_full(void *calldata) | 534 | static 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 | ||