All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Jeff Layton <jlayton@primarydata.com>
Cc: hch@infradead.org, linux-nfs@vger.kernel.org
Subject: Re: [PATCH v2 04/10] nfsd: Ensure stateids remain unique until they are freed
Date: Thu, 17 Jul 2014 14:44:17 -0400	[thread overview]
Message-ID: <20140717184417.GD30442@fieldses.org> (raw)
In-Reply-To: <1405521125-2303-5-git-send-email-jlayton@primarydata.com>

On Wed, Jul 16, 2014 at 10:31:59AM -0400, Jeff Layton wrote:
> From: Trond Myklebust <trond.myklebust@primarydata.com>
> 
> Add an extra delegation state to allow the stateid to remain in the idr
> tree until the last reference has been released. This will be necessary
> to ensure uniqueness once the client_mutex is removed.

Cyclic idr allocation should make reuse extremely unlikely, shouldn't
it?

Probably needs to be fixed anyway, applying.

--b.

> 
> [jlayton: reset the sc_type under the state_lock in unhash_delegation]
> 
> Signed-off-by: Trond Myklebust <trond.myklebust@primarydata.com>
> Signed-off-by: Jeff Layton <jlayton@primarydata.com>
> Reviewed-by: Christoph Hellwig <hch@lst.de>
> ---
>  fs/nfsd/nfs4state.c | 8 ++++----
>  fs/nfsd/state.h     | 1 +
>  2 files changed, 5 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 1b01a20827ab..fd4deb049ddf 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -616,6 +616,7 @@ void
>  nfs4_put_delegation(struct nfs4_delegation *dp)
>  {
>  	if (atomic_dec_and_test(&dp->dl_count)) {
> +		remove_stid(&dp->dl_stid);
>  		nfs4_free_stid(deleg_slab, &dp->dl_stid);
>  		num_delegations--;
>  	}
> @@ -657,6 +658,7 @@ unhash_delegation(struct nfs4_delegation *dp)
>  	struct nfs4_file *fp = dp->dl_file;
>  
>  	spin_lock(&state_lock);
> +	dp->dl_stid.sc_type = NFS4_CLOSED_DELEG_STID;
>  	list_del_init(&dp->dl_perclnt);
>  	list_del_init(&dp->dl_recall_lru);
>  	spin_lock(&fp->fi_lock);
> @@ -670,19 +672,15 @@ unhash_delegation(struct nfs4_delegation *dp)
>  	}
>  }
>  
> -
> -
>  static void destroy_revoked_delegation(struct nfs4_delegation *dp)
>  {
>  	list_del_init(&dp->dl_recall_lru);
> -	remove_stid(&dp->dl_stid);
>  	nfs4_put_delegation(dp);
>  }
>  
>  static void destroy_delegation(struct nfs4_delegation *dp)
>  {
>  	unhash_delegation(dp);
> -	remove_stid(&dp->dl_stid);
>  	nfs4_put_delegation(dp);
>  }
>  
> @@ -4036,7 +4034,9 @@ static __be32 nfsd4_validate_stateid(struct nfs4_client *cl, stateid_t *stateid)
>  		return nfs_ok;
>  	default:
>  		printk("unknown stateid type %x\n", s->sc_type);
> +		/* Fallthrough */
>  	case NFS4_CLOSED_STID:
> +	case NFS4_CLOSED_DELEG_STID:
>  		return nfserr_bad_stateid;
>  	}
>  }
> diff --git a/fs/nfsd/state.h b/fs/nfsd/state.h
> index 81b7522e3f67..996d61eeb357 100644
> --- a/fs/nfsd/state.h
> +++ b/fs/nfsd/state.h
> @@ -80,6 +80,7 @@ struct nfs4_stid {
>  #define NFS4_CLOSED_STID 8
>  /* For a deleg stateid kept around only to process free_stateid's: */
>  #define NFS4_REVOKED_DELEG_STID 16
> +#define NFS4_CLOSED_DELEG_STID 32
>  	unsigned char sc_type;
>  	stateid_t sc_stateid;
>  	struct nfs4_client *sc_client;
> -- 
> 1.9.3
> 

  reply	other threads:[~2014-07-17 18:44 UTC|newest]

Thread overview: 25+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-07-16 14:31 [PATCH v2 0/8] nfsd: more delegation fixes to prepare for client_mutex removal Jeff Layton
2014-07-16 14:31 ` [PATCH v2 01/10] nfsd: eliminate nfsd4_init_callback Jeff Layton
2014-07-16 14:31 ` [PATCH v2 02/10] nfsd: Avoid taking state_lock while holding inode lock in nfsd_break_one_deleg Jeff Layton
2014-07-17  1:34   ` J. Bruce Fields
2014-07-17 10:57     ` Jeff Layton
2014-07-16 14:31 ` [PATCH v2 03/10] nfsd: nfs4_alloc_init_lease should take a nfs4_file arg Jeff Layton
2014-07-16 14:31 ` [PATCH v2 04/10] nfsd: Ensure stateids remain unique until they are freed Jeff Layton
2014-07-17 18:44   ` J. Bruce Fields [this message]
2014-07-17 18:46     ` Jeff Layton
2014-07-16 14:32 ` [PATCH v2 05/10] locks: add file_has_lease to prevent delegation break races Jeff Layton
2014-07-16 14:32 ` [PATCH v2 06/10] nfsd: Protect the nfs4_file delegation fields using the fi_lock Jeff Layton
2014-07-16 18:09   ` Christoph Hellwig
2014-07-16 19:04     ` Jeff Layton
2014-07-17 14:55       ` Christoph Hellwig
2014-07-17 15:31         ` Jeff Layton
2014-07-16 14:32 ` [PATCH v2 07/10] nfsd: Move the delegation reference counter into the struct nfs4_stid Jeff Layton
2014-07-16 14:32 ` [PATCH v2 08/10] nfsd: Simplify stateid management Jeff Layton
2014-07-16 18:10   ` Christoph Hellwig
2014-07-16 14:32 ` [PATCH v2 09/10] nfsd: Fix delegation revocation Jeff Layton
2014-07-16 18:30   ` Christoph Hellwig
2014-07-16 19:16     ` Jeff Layton
2014-07-17  9:22       ` Christoph Hellwig
2014-07-16 14:32 ` [PATCH v2 10/10] nfsd: Convert delegation counter to an atomic_long_t type Jeff Layton
2014-07-16 18:11   ` Christoph Hellwig
2014-07-16 14:33 ` [PATCH v2 0/8] nfsd: more delegation fixes to prepare for client_mutex removal Jeff Layton

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=20140717184417.GD30442@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=hch@infradead.org \
    --cc=jlayton@primarydata.com \
    --cc=linux-nfs@vger.kernel.org \
    /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.