diff mbox series

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

Message ID 20181004184500.14403-1-olga.kornievskaia@gmail.com (mailing list archive)
State New, archived
Headers show
Series [1/1] NFSv4.x: fix lock recovery during delegation recall | expand

Commit Message

Olga Kornievskaia Oct. 4, 2018, 6:45 p.m. UTC
From: Olga Kornievskaia <kolga@netapp.com>

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@netapp.com>
---
 fs/nfs/delegation.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

Comments

Trond Myklebust Oct. 5, 2018, 1:35 p.m. UTC | #1
On Thu, 2018-10-04 at 14:45 -0400, Olga Kornievskaia wrote:
> From: Olga Kornievskaia <kolga@netapp.com>
> 
> 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@netapp.com>
> ---
>  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.
diff mbox series

Patch

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