If a write delegation isn't available, the Linux NFS client uses a zero-stateid when performing a SETATTR. NFSv4.0 provides no mechanism for an NFS server to match such a request to a particular client. It recalls all delegations for that file, even delegations held by the client issuing the request. If that client happens to hold a read delegation, the server will recall it immediately, resulting in an NFS4ERR_DELAY/CB_RECALL/ DELEGRETURN sequence. Optimize out this pipeline bubble by having the client return any delegations it may hold on a file before it issues a SETATTR(zero-stateid) on that file. Signed-off-by: Chuck Lever <chuck.lever@xxxxxxxxxx> --- fs/nfs/nfs4proc.c | 2 ++ 1 file changed, 2 insertions(+) Changes since v1: - Return the delegation only for NFSv4.0 mounts diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index dbd01548335b..bca7245f1e78 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -3314,6 +3314,8 @@ static int _nfs4_do_setattr(struct inode *inode, goto zero_stateid; } else { zero_stateid: + if (server->nfs_client->cl_minorversion == 0) + nfs4_inode_return_delegation(inode); nfs4_stateid_copy(&arg->stateid, &zero_stateid); } if (delegation_cred)