From: Jeff Layton <jlayton@redhat.com>
To: NeilBrown <neilb@suse.com>,
Trond Myklebust <trond.myklebust@primarydata.com>,
Anna Schumaker <anna.schumaker@netapp.com>
Cc: Benjamin Coddington <bcodding@redhat.com>,
Linux NFS Mailing List <linux-nfs@vger.kernel.org>
Subject: Re: [PATCH 5/6] NFSv4: enhance nfs4_copy_lock_stateid to use a flock stateid if there is one
Date: Thu, 13 Oct 2016 11:22:16 -0400 [thread overview]
Message-ID: <1476372136.12134.12.camel@redhat.com> (raw)
In-Reply-To: <147633280755.766.16463067741350482818.stgit@noble>
On Thu, 2016-10-13 at 15:26 +1100, NeilBrown wrote:
> A process can have two possible lock owner for a given open file:
> a per-process Posix lock owner and a per-open-file flock owner
> Use both of these when searching for a suitable stateid to use.
>
> With this patch, READ/WRITE requests will use the correct stateid
> if a flock lock is active.
>
> Signed-off-by: NeilBrown <neilb@suse.com>
> ---
> fs/nfs/nfs4state.c | 14 +++++++++-----
> 1 file changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/fs/nfs/nfs4state.c b/fs/nfs/nfs4state.c
> index f25eee8202bf..ed39ee164f5f 100644
> --- a/fs/nfs/nfs4state.c
> +++ b/fs/nfs/nfs4state.c
> @@ -800,11 +800,13 @@ void nfs4_close_sync(struct nfs4_state *state, fmode_t fmode)
> * that is compatible with current->files
> */
> static struct nfs4_lock_state *
> -__nfs4_find_lock_state(struct nfs4_state *state, fl_owner_t fl_owner)
> +__nfs4_find_lock_state(struct nfs4_state *state,
> + fl_owner_t fl_owner, fl_owner_t fl_owner2)
> {
> struct nfs4_lock_state *pos;
> list_for_each_entry(pos, &state->lock_states, ls_locks) {
> - if (pos->ls_owner != fl_owner)
> + if (pos->ls_owner != fl_owner &&
> + pos->ls_owner != fl_owner2)
> continue;
> atomic_inc(&pos->ls_count);
> return pos;
Ok, so we end up getting whatever is first on the list here. That's
certainly fine when there are either flock/OFD locks or traditional
POSIX locks in use.
When there are both in use though, then things may be less predictable.
That said, mixing flock/OFD and POSIX locks on the same fds from the
same process is not a great idea in general, and I have a hard time
coming up with a valid use-case there.
So, I don't see that as a real problem, but it may be worth explaining
that rationale in the comment block above this function in case we need
to revisit it later.
> @@ -857,7 +859,7 @@ static struct nfs4_lock_state *nfs4_get_lock_state(struct nfs4_state *state, fl_
>
> for(;;) {
> spin_lock(&state->state_lock);
> - lsp = __nfs4_find_lock_state(state, owner);
> + lsp = __nfs4_find_lock_state(state, owner, 0);
> if (lsp != NULL)
> break;
> if (new != NULL) {
> @@ -942,7 +944,7 @@ static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
> const struct nfs_lock_context *l_ctx)
> {
> struct nfs4_lock_state *lsp;
> - fl_owner_t fl_owner;
> + fl_owner_t fl_owner, fl_flock_owner;
> int ret = -ENOENT;
>
> if (l_ctx == NULL)
> @@ -952,8 +954,10 @@ static int nfs4_copy_lock_stateid(nfs4_stateid *dst,
> goto out;
>
> fl_owner = l_ctx->lockowner.l_owner;
> + fl_flock_owner = l_ctx->open_context->flock_owner;
> +
> spin_lock(&state->state_lock);
> - lsp = __nfs4_find_lock_state(state, fl_owner);
> + lsp = __nfs4_find_lock_state(state, fl_owner, fl_flock_owner);
> if (lsp && test_bit(NFS_LOCK_LOST, &lsp->ls_flags))
> ret = -EIO;
> else if (lsp != NULL && test_bit(NFS_LOCK_INITIALIZED, &lsp->ls_flags) != 0) {
>
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
Jeff Layton <jlayton@redhat.com>
next prev parent reply other threads:[~2016-10-13 15:22 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2016-10-13 4:26 [PATCH 0/6] NFSv4: Fix stateid used when flock locks in use. - V2 NeilBrown
2016-10-13 4:26 ` [PATCH 2/6] NFSv4: add flock_owner to open context NeilBrown
2016-10-13 4:26 ` [PATCH 6/6] NFS: discard nfs_lockowner structure NeilBrown
2016-10-13 4:26 ` [PATCH 1/6] NFS: remove l_pid field from nfs_lockowner NeilBrown
2016-10-13 4:26 ` [PATCH 4/6] NFSv4: change nfs4_select_rw_stateid to take a lock_context inplace of lock_owner NeilBrown
2016-10-20 0:57 ` NeilBrown
2016-10-13 4:26 ` [PATCH 5/6] NFSv4: enhance nfs4_copy_lock_stateid to use a flock stateid if there is one NeilBrown
2016-10-13 15:22 ` Jeff Layton [this message]
2016-10-14 0:22 ` NeilBrown
2016-10-14 10:49 ` Jeff Layton
2016-12-19 0:33 ` [PATCH] NFSv4: ensure __nfs4_find_lock_state returns consistent result NeilBrown
2016-10-13 4:26 ` [PATCH 3/6] NFSv4: change nfs4_do_setattr to take an open_context instead of a nfs4_state NeilBrown
2016-11-02 15:49 ` Benjamin Coddington
2016-11-02 23:34 ` NeilBrown
2016-11-03 16:38 ` Benjamin Coddington
2016-11-03 23:12 ` Benjamin Coddington
2016-10-13 15:31 ` [PATCH 0/6] NFSv4: Fix stateid used when flock locks in use. - V2 Jeff Layton
2016-10-18 21:52 ` NeilBrown
2016-11-18 4:59 ` NeilBrown
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1476372136.12134.12.camel@redhat.com \
--to=jlayton@redhat.com \
--cc=anna.schumaker@netapp.com \
--cc=bcodding@redhat.com \
--cc=linux-nfs@vger.kernel.org \
--cc=neilb@suse.com \
--cc=trond.myklebust@primarydata.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.