aboutsummaryrefslogtreecommitdiffstats
path: root/fs/nfs
diff options
context:
space:
mode:
authorTrond Myklebust <Trond.Myklebust@netapp.com>2012-03-27 18:22:19 -0400
committerTrond Myklebust <Trond.Myklebust@netapp.com>2012-03-27 21:53:14 -0400
commite59d27e05a6435f8c04d5ad843f37fa795f2eaaa (patch)
tree217a19f29b5214d8b0e36dbe190c34140a01000f /fs/nfs
parent05e9cfb408b24debb3a85fd98edbfd09dd148881 (diff)
NFSv4.1: Fix layoutcommit error handling
Firstly, task->tk_status will always return negative error values, so the current tests for 'NFS4ERR_DELEG_REVOKED' etc. are all being ignored. Secondly, clean up the code so that we only need to test task->tk_status once! Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> Cc: stable@vger.kernel.org
Diffstat (limited to 'fs/nfs')
-rw-r--r--fs/nfs/nfs4proc.c25
1 files changed, 13 insertions, 12 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index ee9ca19457ab..1933e6719bb0 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -6112,21 +6112,22 @@ nfs4_layoutcommit_done(struct rpc_task *task, void *calldata)
6112 return; 6112 return;
6113 6113
6114 switch (task->tk_status) { /* Just ignore these failures */ 6114 switch (task->tk_status) { /* Just ignore these failures */
6115 case NFS4ERR_DELEG_REVOKED: /* layout was recalled */ 6115 case -NFS4ERR_DELEG_REVOKED: /* layout was recalled */
6116 case NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */ 6116 case -NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */
6117 case NFS4ERR_BADLAYOUT: /* no layout */ 6117 case -NFS4ERR_BADLAYOUT: /* no layout */
6118 case NFS4ERR_GRACE: /* loca_recalim always false */ 6118 case -NFS4ERR_GRACE: /* loca_recalim always false */
6119 task->tk_status = 0; 6119 task->tk_status = 0;
6120 } 6120 break;
6121 6121 case 0:
6122 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) {
6123 rpc_restart_call_prepare(task);
6124 return;
6125 }
6126
6127 if (task->tk_status == 0)
6128 nfs_post_op_update_inode_force_wcc(data->args.inode, 6122 nfs_post_op_update_inode_force_wcc(data->args.inode,
6129 data->res.fattr); 6123 data->res.fattr);
6124 break;
6125 default:
6126 if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) {
6127 rpc_restart_call_prepare(task);
6128 return;
6129 }
6130 }
6130} 6131}
6131 6132
6132static void nfs4_layoutcommit_release(void *calldata) 6133static void nfs4_layoutcommit_release(void *calldata)