NFSv4: Don't discard the attributes returned by asynchronous DELEGRETURN
authorTrond Myklebust <trond.myklebust@primarydata.com>
Sat, 17 Dec 2016 00:48:09 +0000 (19:48 -0500)
committerTrond Myklebust <trond.myklebust@primarydata.com>
Mon, 19 Dec 2016 22:29:29 +0000 (17:29 -0500)
DELEGRETURN will always carry a reference to the inode except when
the latter is being freed, so let's ensure that we always use that
inode information to ensure close-to-open cache consistency, even
when the DELEGRETURN call is asynchronous.

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

index 39dfba9265f95cbf1462a63d443e27f14720771d..0d9fa18aa2431a7105bfd2c29d64f330bafeac1e 100644 (file)
@@ -5699,6 +5699,7 @@ static void nfs4_delegreturn_release(void *calldata)
                if (data->lr.roc)
                        pnfs_roc_release(&data->lr.arg, &data->lr.res,
                                        data->res.lr_ret);
+               nfs_post_op_update_inode_force_wcc(inode, &data->fattr);
                nfs_iput_and_deactive(inode);
        }
        kfree(calldata);
@@ -5787,10 +5788,6 @@ static int _nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, co
        if (status != 0)
                goto out;
        status = data->rpc_status;
-       if (status == 0)
-               nfs_post_op_update_inode_force_wcc(inode, &data->fattr);
-       else
-               nfs_refresh_inode(inode, &data->fattr);
 out:
        rpc_put_task(task);
        return status;