diff mbox

[v2] nfs4: reset states to use open_stateid when returning delegation voluntarily

Message ID 1443806077-27148-1-git-send-email-jeff.layton@primarydata.com (mailing list archive)
State New, archived
Headers show

Commit Message

Jeff Layton Oct. 2, 2015, 5:14 p.m. UTC
When the client goes to return a delegation, it should always update any
nfs4_state currently set up to use that delegation stateid to instead
use the open stateid. It already does do this in some cases,
particularly in the state recovery code, but not currently when the
delegation is voluntarily returned (e.g. in advance of a RENAME).  This
causes the client to try to continue using the delegation stateid after
the DELEGRETURN, e.g. in LAYOUTGET.

Set the nfs4_state back to using the open stateid in
nfs4_open_delegation_recall, just before clearing the
NFS_DELEGATED_STATE bit.

Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
---
 fs/nfs/nfs4proc.c | 3 +++
 1 file changed, 3 insertions(+)

Comments

Trond Myklebust Oct. 2, 2015, 7:53 p.m. UTC | #1
On Fri, Oct 2, 2015 at 1:14 PM, Jeff Layton <jlayton@poochiereds.net> wrote:
> When the client goes to return a delegation, it should always update any
> nfs4_state currently set up to use that delegation stateid to instead
> use the open stateid. It already does do this in some cases,
> particularly in the state recovery code, but not currently when the
> delegation is voluntarily returned (e.g. in advance of a RENAME).  This
> causes the client to try to continue using the delegation stateid after
> the DELEGRETURN, e.g. in LAYOUTGET.
>
> Set the nfs4_state back to using the open stateid in
> nfs4_open_delegation_recall, just before clearing the
> NFS_DELEGATED_STATE bit.
>
> Signed-off-by: Jeff Layton <jeff.layton@primarydata.com>
> ---
>  fs/nfs/nfs4proc.c | 3 +++
>  1 file changed, 3 insertions(+)
>
> diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
> index f93b9cdb4934..246753e1d19d 100644
> --- a/fs/nfs/nfs4proc.c
> +++ b/fs/nfs/nfs4proc.c
> @@ -1771,6 +1771,9 @@ int nfs4_open_delegation_recall(struct nfs_open_context *ctx,
>         if (IS_ERR(opendata))
>                 return PTR_ERR(opendata);
>         nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid);
> +       write_seqlock(&state->seqlock);
> +       nfs4_stateid_copy(&state->stateid, &state->open_stateid);
> +       write_sequnlock(&state->seqlock);
>         clear_bit(NFS_DELEGATED_STATE, &state->flags);
>         switch (type & (FMODE_READ|FMODE_WRITE)) {
>         case FMODE_READ|FMODE_WRITE:
> --

Looks good. Thanks!
--
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
diff mbox

Patch

diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index f93b9cdb4934..246753e1d19d 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -1771,6 +1771,9 @@  int nfs4_open_delegation_recall(struct nfs_open_context *ctx,
 	if (IS_ERR(opendata))
 		return PTR_ERR(opendata);
 	nfs4_stateid_copy(&opendata->o_arg.u.delegation, stateid);
+	write_seqlock(&state->seqlock);
+	nfs4_stateid_copy(&state->stateid, &state->open_stateid);
+	write_sequnlock(&state->seqlock);
 	clear_bit(NFS_DELEGATED_STATE, &state->flags);
 	switch (type & (FMODE_READ|FMODE_WRITE)) {
 	case FMODE_READ|FMODE_WRITE: