| From e59d27e05a6435f8c04d5ad843f37fa795f2eaaa Mon Sep 17 00:00:00 2001 |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| Date: Tue, 27 Mar 2012 18:22:19 -0400 |
| Subject: NFSv4.1: Fix layoutcommit error handling |
| |
| From: Trond Myklebust <Trond.Myklebust@netapp.com> |
| |
| commit e59d27e05a6435f8c04d5ad843f37fa795f2eaaa upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/nfs/nfs4proc.c | 25 +++++++++++++------------ |
| 1 file changed, 13 insertions(+), 12 deletions(-) |
| |
| --- a/fs/nfs/nfs4proc.c |
| +++ b/fs/nfs/nfs4proc.c |
| @@ -5983,21 +5983,22 @@ nfs4_layoutcommit_done(struct rpc_task * |
| return; |
| |
| switch (task->tk_status) { /* Just ignore these failures */ |
| - case NFS4ERR_DELEG_REVOKED: /* layout was recalled */ |
| - case NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */ |
| - case NFS4ERR_BADLAYOUT: /* no layout */ |
| - case NFS4ERR_GRACE: /* loca_recalim always false */ |
| + case -NFS4ERR_DELEG_REVOKED: /* layout was recalled */ |
| + case -NFS4ERR_BADIOMODE: /* no IOMODE_RW layout for range */ |
| + case -NFS4ERR_BADLAYOUT: /* no layout */ |
| + case -NFS4ERR_GRACE: /* loca_recalim always false */ |
| task->tk_status = 0; |
| - } |
| - |
| - if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { |
| - rpc_restart_call_prepare(task); |
| - return; |
| - } |
| - |
| - if (task->tk_status == 0) |
| + break; |
| + case 0: |
| nfs_post_op_update_inode_force_wcc(data->args.inode, |
| data->res.fattr); |
| + break; |
| + default: |
| + if (nfs4_async_handle_error(task, server, NULL) == -EAGAIN) { |
| + rpc_restart_call_prepare(task); |
| + return; |
| + } |
| + } |
| } |
| |
| static void nfs4_layoutcommit_release(void *calldata) |