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@xxxxxxxx> > --- > 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: 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); 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
Attachment:
signature.asc
Description: PGP signature