On Sat, 2020-08-29 at 13:16 -0400, Chuck Lever wrote: > 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); So, the intention is that nfs4_inode_make_writeable() takes care of this, and in principle it is done in the cases that matter in nfs4_proc_setattr(). I agree that the zero_stateid case is not currently being taken care of, but that only matters for the case of truncate. So perhaps we can just add a single call to nfs4_inode_make_writeable() above the zero_stateid label instead of adding redundancy for all the other cases? > nfs4_stateid_copy(&arg->stateid, &zero_stateid); > } > if (delegation_cred) > > -- Trond Myklebust Linux NFS client maintainer, Hammerspace trond.myklebust@xxxxxxxxxxxxxxx