NFS: Retry the CLOSE if the embedded GETATTR is rejected with EACCES
authorTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 19 Dec 2016 15:34:14 +0000 (10:34 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 19 Dec 2016 22:30:01 +0000 (17:30 -0500)
If our CLOSE RPC call is rejected with an EACCES call, then we should
remove the GETATTR call from the compound RPC and retry.
This could potentially happen when there is a conflict between an
ACL denying attribute reads and our use of SP4_MACH_CRED.

Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
fs/nfs/nfs4proc.c

index c3263114c6b8ef11b39978da1953cbffa357fcc8..4b66b0c469cd18bc1a7f1e74bce47794b223e695 100644 (file)
@@ -3122,6 +3122,16 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
                        res_stateid = &calldata->res.stateid;
                        renew_lease(server, calldata->timestamp);
                        break;
+               case -NFS4ERR_ACCESS:
+                       if (calldata->arg.bitmask != NULL) {
+                               calldata->arg.bitmask = NULL;
+                               calldata->res.fattr = NULL;
+                               task->tk_status = 0;
+                               rpc_restart_call_prepare(task);
+                               goto out_release;
+
+                       }
+                       break;
                case -NFS4ERR_ADMIN_REVOKED:
                case -NFS4ERR_STALE_STATEID:
                case -NFS4ERR_EXPIRED: