From 664831c820b3a9cbe8a8005126b577b87f9f00cd Mon Sep 17 00:00:00 2001 From: Andy Adamson Date: Fri, 27 Apr 2012 17:53:48 -0400 Subject: [PATCH] --- yaml --- r: 308624 b: refs/heads/master c: 0ad2f378e1af7996d6f8355c02181ff3cc7ab260 h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/nfs/nfs4filelayout.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 03636fbe8309..78a466778e9a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a033a09189c0125d56f2ac17ffb4bec5a3d3323b +refs/heads/master: 0ad2f378e1af7996d6f8355c02181ff3cc7ab260 diff --git a/trunk/fs/nfs/nfs4filelayout.c b/trunk/fs/nfs/nfs4filelayout.c index f503cbe5a21a..1b9bedb89620 100644 --- a/trunk/fs/nfs/nfs4filelayout.c +++ b/trunk/fs/nfs/nfs4filelayout.c @@ -252,7 +252,14 @@ filelayout_set_layoutcommit(struct nfs_write_data *wdata) static void filelayout_read_prepare(struct rpc_task *task, void *data) { struct nfs_read_data *rdata = data; + struct pnfs_layout_segment *lseg = rdata->header->lseg; + if (filelayout_test_devid_invalid(FILELAYOUT_DEVID_NODE(lseg))) { + dprintk("%s task %u reset io to MDS\n", __func__, task->tk_pid); + filelayout_reset_read(rdata); + rpc_exit(task, 0); + return; + } rdata->read_done_cb = filelayout_read_done_cb; if (nfs41_setup_sequence(rdata->ds_clp->cl_session, @@ -269,6 +276,9 @@ static void filelayout_read_call_done(struct rpc_task *task, void *data) dprintk("--> %s task->tk_status %d\n", __func__, task->tk_status); + if (test_bit(NFS_IOHDR_REDO, &rdata->header->flags)) + return; + /* Note this may cause RPC to be resent */ rdata->header->mds_ops->rpc_call_done(task, data); } @@ -343,7 +353,14 @@ static int filelayout_commit_done_cb(struct rpc_task *task, static void filelayout_write_prepare(struct rpc_task *task, void *data) { struct nfs_write_data *wdata = data; + struct pnfs_layout_segment *lseg = wdata->header->lseg; + if (filelayout_test_devid_invalid(FILELAYOUT_DEVID_NODE(lseg))) { + dprintk("%s task %u reset io to MDS\n", __func__, task->tk_pid); + filelayout_reset_write(wdata); + rpc_exit(task, 0); + return; + } if (nfs41_setup_sequence(wdata->ds_clp->cl_session, &wdata->args.seq_args, &wdata->res.seq_res, task)) @@ -356,6 +373,9 @@ static void filelayout_write_call_done(struct rpc_task *task, void *data) { struct nfs_write_data *wdata = data; + if (test_bit(NFS_IOHDR_REDO, &wdata->header->flags)) + return; + /* Note this may cause RPC to be resent */ wdata->header->mds_ops->rpc_call_done(task, data); }