From b940cf1fc8ccb72dac559d9bfa77cedbc49707d7 Mon Sep 17 00:00:00 2001 From: Peng Tao Date: Thu, 22 Sep 2011 21:50:15 -0400 Subject: [PATCH] --- yaml --- r: 267215 b: refs/heads/master c: 9b7eecdcfeb943f130d86bbc249fde4994b6fe30 h: refs/heads/master i: 267213: a0a91071db38575df2f67093a1994719daa407a7 267211: 43a32f79cfe62887f242e004005a117084ca8e15 267207: 0cf4cee8f92443ceaae0012486befb8d1aae8b76 267199: 510bdd3ade342ca0e559c01f64a23e526dfdafac v: v3 --- [refs] | 2 +- trunk/fs/nfs/pnfs.c | 20 +++++++------------- trunk/fs/nfs/pnfs.h | 2 +- trunk/fs/nfs/read.c | 12 +++++++++++- 4 files changed, 20 insertions(+), 16 deletions(-) diff --git a/[refs] b/[refs] index 5d764aab2f26..ed2fe43dd80c 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 8ce160c5ef06cc89c2b6b26bfa5ef7a5ce2c93e0 +refs/heads/master: 9b7eecdcfeb943f130d86bbc249fde4994b6fe30 diff --git a/trunk/fs/nfs/pnfs.c b/trunk/fs/nfs/pnfs.c index a205c8e2c731..ee73d9a4f700 100644 --- a/trunk/fs/nfs/pnfs.c +++ b/trunk/fs/nfs/pnfs.c @@ -1262,23 +1262,17 @@ EXPORT_SYMBOL_GPL(pnfs_generic_pg_writepages); /* * Called by non rpc-based layout drivers */ -int -pnfs_ld_read_done(struct nfs_read_data *data) +void pnfs_ld_read_done(struct nfs_read_data *data) { - int status; - - if (!data->pnfs_error) { + if (likely(!data->pnfs_error)) { __nfs4_read_done_cb(data); data->mds_ops->rpc_call_done(&data->task, data); - data->mds_ops->rpc_release(data); - return 0; + } else { + put_lseg(data->lseg); + data->lseg = NULL; + dprintk("pnfs write error = %d\n", data->pnfs_error); } - - dprintk("%s: pnfs_error=%d, retry via MDS\n", __func__, - data->pnfs_error); - status = nfs_initiate_read(data, NFS_CLIENT(data->inode), - data->mds_ops); - return status ? : -EAGAIN; + data->mds_ops->rpc_release(data); } EXPORT_SYMBOL_GPL(pnfs_ld_read_done); diff --git a/trunk/fs/nfs/pnfs.h b/trunk/fs/nfs/pnfs.h index 71c23d40f735..1509530cb111 100644 --- a/trunk/fs/nfs/pnfs.h +++ b/trunk/fs/nfs/pnfs.h @@ -202,7 +202,7 @@ void pnfs_cleanup_layoutcommit(struct nfs4_layoutcommit_data *data); int pnfs_layoutcommit_inode(struct inode *inode, bool sync); int _pnfs_return_layout(struct inode *); void pnfs_ld_write_done(struct nfs_write_data *); -int pnfs_ld_read_done(struct nfs_read_data *); +void pnfs_ld_read_done(struct nfs_read_data *); struct pnfs_layout_segment *pnfs_update_layout(struct inode *ino, struct nfs_open_context *ctx, loff_t pos, diff --git a/trunk/fs/nfs/read.c b/trunk/fs/nfs/read.c index 2171c043ab08..bfc20b160243 100644 --- a/trunk/fs/nfs/read.c +++ b/trunk/fs/nfs/read.c @@ -541,13 +541,23 @@ static void nfs_readpage_result_full(struct rpc_task *task, void *calldata) static void nfs_readpage_release_full(void *calldata) { struct nfs_read_data *data = calldata; + struct nfs_pageio_descriptor pgio; + if (data->pnfs_error) { + nfs_pageio_init_read_mds(&pgio, data->inode); + pgio.pg_recoalesce = 1; + } while (!list_empty(&data->pages)) { struct nfs_page *req = nfs_list_entry(data->pages.next); nfs_list_remove_request(req); - nfs_readpage_release(req); + if (!data->pnfs_error) + nfs_readpage_release(req); + else + nfs_pageio_add_request(&pgio, req); } + if (data->pnfs_error) + nfs_pageio_complete(&pgio); nfs_readdata_release(calldata); }