NFSv4.1/pnfs: Play safe w.r.t. close() races when return-on-close is set
authorTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 19 Aug 2015 04:45:13 +0000 (23:45 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Wed, 19 Aug 2015 04:45:13 +0000 (23:45 -0500)
If we have an OPEN_DOWNGRADE and CLOSE race with one another, we want
to ensure that the layout is forgotten by the client, so that we
start afresh with a new layoutget.

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

index bda7837dfe6b98720c6b299fd77ede10202aae5b..9e9f7816cf2409f63b356302646111ce799ccc77 100644 (file)
@@ -2661,7 +2661,7 @@ static void nfs4_close_done(struct rpc_task *task, void *data)
        switch (task->tk_status) {
                case 0:
                        res_stateid = &calldata->res.stateid;
-                       if (calldata->arg.fmode == 0 && calldata->roc)
+                       if (calldata->roc)
                                pnfs_roc_set_barrier(state->inode,
                                                     calldata->roc_barrier);
                        renew_lease(server, calldata->timestamp);
@@ -2735,11 +2735,11 @@ static void nfs4_close_prepare(struct rpc_task *task, void *data)
                goto out_no_action;
        }
 
-       if (calldata->arg.fmode == 0) {
+       if (calldata->arg.fmode == 0)
                task->tk_msg.rpc_proc = &nfs4_procedures[NFSPROC4_CLNT_CLOSE];
-               if (calldata->roc)
-                       pnfs_roc_get_barrier(inode, &calldata->roc_barrier);
-       }
+       if (calldata->roc)
+               pnfs_roc_get_barrier(inode, &calldata->roc_barrier);
+
        calldata->arg.share_access =
                nfs4_map_atomic_open_share(NFS_SERVER(inode),
                                calldata->arg.fmode, 0);