Re: [PATCH 1/1] NFSv4.x: fix lock recovery during delegation recall

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

 



On Thu, 2018-10-04 at 14:45 -0400, Olga Kornievskaia wrote:
> From: Olga Kornievskaia <kolga@xxxxxxxxxx>
> 
> Running "./nfstest_delegation --runtest recall26" uncovers that
> client doesn't recover the lock when we have an appending open,
> where the initial open got a write delegation.
> 
> Instead of checking for the passed in open context against
> the file lock's open context. Check that the state is the same.
> 
> Signed-off-by: Olga Kornievskaia <kolga@xxxxxxxxxx>
> ---
>  fs/nfs/delegation.c | 6 +++---
>  1 file changed, 3 insertions(+), 3 deletions(-)
> 
> diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c
> index 76d205d..07b8395 100644
> --- a/fs/nfs/delegation.c
> +++ b/fs/nfs/delegation.c
> @@ -93,7 +93,7 @@ int nfs4_check_delegation(struct inode *inode,
> fmode_t flags)
>  	return nfs4_do_check_delegation(inode, flags, false);
>  }
>  
> -static int nfs_delegation_claim_locks(struct nfs_open_context *ctx,
> struct nfs4_state *state, const nfs4_stateid *stateid)
> +static int nfs_delegation_claim_locks(struct nfs4_state *state,
> const nfs4_stateid *stateid)
>  {
>  	struct inode *inode = state->inode;
>  	struct file_lock *fl;
> @@ -108,7 +108,7 @@ static int nfs_delegation_claim_locks(struct
> nfs_open_context *ctx, struct nfs4_
>  	spin_lock(&flctx->flc_lock);
>  restart:
>  	list_for_each_entry(fl, list, fl_list) {
> -		if (nfs_file_open_context(fl->fl_file) != ctx)
> +		if (nfs_file_open_context(fl->fl_file)->state != state)
>  			continue;
>  		spin_unlock(&flctx->flc_lock);
>  		status = nfs4_lock_delegation_recall(fl, state,
> stateid);
> @@ -156,7 +156,7 @@ static int nfs_delegation_claim_opens(struct
> inode *inode,
>  		seq = raw_seqcount_begin(&sp->so_reclaim_seqcount);
>  		err = nfs4_open_delegation_recall(ctx, state, stateid,
> type);
>  		if (!err)
> -			err = nfs_delegation_claim_locks(ctx, state,
> stateid);
> +			err = nfs_delegation_claim_locks(state,
> stateid);
>  		if (!err && read_seqcount_retry(&sp-
> >so_reclaim_seqcount, seq))
>  			err = -EAGAIN;
>  		mutex_unlock(&sp->so_delegreturn_mutex);

Thanks! That looks good to me.

-- 
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