Re: [PATCH v2] NFS: Zero-stateid SETATTR should first return delegation

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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






[Index of Archives]     [Linux Filesystem Development]     [Linux USB Development]     [Linux Media Development]     [Video for Linux]     [Linux NILFS]     [Linux Audio Users]     [Yosemite Info]     [Linux SCSI]

  Powered by Linux