diff mbox

[4/6] NFSv4: change nfs4_select_rw_stateid to take a lock_context inplace of lock_owner

Message ID 87zilzx2ek.fsf@notabene.neil.brown.name
State New, archived
Headers show

Commit Message

NeilBrown Oct. 20, 2016, 12:57 a.m. UTC
On Thu, Oct 13 2016, NeilBrown wrote:

> The only time that a lock_context is not immediately available is in
> setattr, and now that it has an open_context, it can easily find one
> with nfs_get_lock_context.
> This removes the need for the on-stack nfs_lockowner.
>
> This change is preparation for correctly support flock stateids.
>
> Signed-off-by: NeilBrown <neilb@suse.com>
> ---
>  fs/nfs/nfs4_fs.h   |    2 +-
>  fs/nfs/nfs4proc.c  |   15 ++++++---------
>  fs/nfs/nfs4state.c |   11 +++++------
>  3 files changed, 12 insertions(+), 16 deletions(-)
>
> diff --git a/fs/nfs/nfs4_fs.h b/fs/nfs/nfs4_fs.h
> index 9b3a82abab07..7784b79915e1 100644
> --- a/fs/nfs/nfs4_fs.h
> +++ b/fs/nfs/nfs4_fs.h
> @@ -457,7 +457,7 @@ extern void nfs41_handle_server_scope(struct nfs_client *,
>  extern void nfs4_put_lock_state(struct nfs4_lock_state *lsp);
>  extern int nfs4_set_lock_state(struct nfs4_state *state, struct file_lock *fl);
>  extern int nfs4_select_rw_stateid(struct nfs4_state *, fmode_t,
> -		const struct nfs_lockowner *, nfs4_stateid *,
> +		const struct nfs_lock_context *, nfs4_stateid *,
>  		struct rpc_cred **);
>  
>  extern struct nfs_seqid *nfs_alloc_seqid(struct nfs_seqid_counter *counter, gfp_t gfp_mask);
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index 950b25413bb4..3c2f11189794 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -2926,12 +2926,13 @@ static int _nfs4_do_setattr(struct inode *inode,
>  	if (nfs4_copy_delegation_stateid(inode, fmode, &arg->stateid, &delegation_cred)) {
>  		/* Use that stateid */
>  	} else if (truncate && ctx != NULL) {
> -		struct nfs_lockowner lockowner = {
> -			.l_owner = current->files,
> -		};
> +		struct nfs_lock_context *l_ctx;
>  		if (!nfs4_valid_open_stateid(ctx->state))
>  			return -EBADF;
> -		if (nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, &lockowner,
> +		l_ctx = nfs_get_lock_context(ctx);
> +		if (IS_ERR(l_ctx))
> +			return PTR_ERR(l_ctx);
> +		if (nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, l_ctx,
>  				&arg->stateid, &delegation_cred) == -EIO)
>  			return -EBADF;

Oops...
I have an nfs_get_lock_context() here with no matching
nfs_put_lock_context();


I've merged:


into that patch and pushed out a new

  git://neil.brown.name/linux tags/nfs-flock-fix

 (3f5546538d7c678b82d10ce6add29a6d92565f1e)


Please let me know if I should re-post the series.

Thanks,
NeilBrown
diff mbox

Patch

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 3c2f11189794..be4e3d9de1eb 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -2932,8 +2932,10 @@  static int _nfs4_do_setattr(struct inode *inode,
 		l_ctx = nfs_get_lock_context(ctx);
 		if (IS_ERR(l_ctx))
 			return PTR_ERR(l_ctx);
-		if (nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, l_ctx,
-				&arg->stateid, &delegation_cred) == -EIO)
+		status = nfs4_select_rw_stateid(ctx->state, FMODE_WRITE, l_ctx,
+						&arg->stateid, &delegation_cred);
+		nfs_put_lock_context(l_ctx);
+		if (status == -EIO)
 			return -EBADF;
 	} else
 		nfs4_stateid_copy(&arg->stateid, &zero_stateid);