All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: andros@netapp.com
Cc: pnfs@linux-nfs.org, linux-nfs@vger.kernel.org
Subject: Re: [PATCH 05/31] nfsd41: encode create_session result into cache
Date: Fri, 15 May 2009 19:05:18 -0400	[thread overview]
Message-ID: <20090515230518.GG26389@fieldses.org> (raw)
In-Reply-To: <1240938005-23778-5-git-send-email-andros@netapp.com>

On Tue, Apr 28, 2009 at 12:59:39PM -0400, andros@netapp.com wrote:
> From: Andy Adamson <andros@netapp.com>
> 
> CREATE_SESSION can be preceeded by a SEQUENCE operation and the
> create session single slot cache must be maintained. Encode the results of
> a create session call into the cache at the end of processing.
> 
> The create session result will also be encoded into the RPC response, and if
> it is preceeded by a SEQUENCE operation, will also be encoded into the
> session slot table cache.
> 
> Errors that do not change the create session cache:
> A create session NFS4ERR_STALE_CLIENTID error means that a client record
> (and associated create session slot) could not be found and therefore can't
> be changed.  NFSERR_SEQ_MISORDERED errors do not change the slot cache.
> 
> All other errors get cached.
> 
> Signed-off-by: Andy Adamson <andros@netapp.com>
> ---
>  fs/nfsd/nfs4state.c       |    6 ++++--
>  fs/nfsd/nfs4xdr.c         |   18 ++++++++++++++++++
>  include/linux/nfsd/xdr4.h |    2 ++
>  3 files changed, 24 insertions(+), 2 deletions(-)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index fee6bf0..142c460 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -1376,7 +1376,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
>  		if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
>  		    (ip_addr != unconf->cl_addr)) {
>  			status = nfserr_clid_inuse;
> -			goto out;
> +			goto out_cache;
>  		}
>  
>  		slot = &unconf->cl_slot;
> @@ -1418,7 +1418,9 @@ nfsd4_create_session(struct svc_rqst *rqstp,
>  	memcpy(cr_ses->sessionid.data, conf->cl_sessionid.data,
>  	       NFS4_MAX_SESSIONID_LEN);
>  	cr_ses->seqid = slot->sl_seqid;
> -
> +out_cache:
> +	/* cache solo and embedded create sessions under the state lock */
> +	nfsd4_cache_create_session(cr_ses, slot, status);
>  out:
>  	nfs4_unlock_state();
>  	dprintk("%s returns %d\n", __func__, ntohl(status));
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index b2f8d74..1dfec1d 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -3046,6 +3046,24 @@ nfsd4_encode_create_session(struct nfsd4_compoundres *resp, int nfserr,
>  	return 0;
>  }
>  
> +/*
> + * Encode the create_session result into the create session single DRC
> + * slot cache. Do this for solo or embedded create session operations.
> + */
> +void
> +nfsd4_cache_create_session(struct nfsd4_create_session *cr_ses,
> +			   struct nfsd4_clid_slot *slot, int nfserr)
> +{
> +	__be32 *p = (__be32 *)slot->sl_data;
> +	struct nfsd4_compoundres tmp = {
> +		.p = p,
> +		.end = p + XDR_QUADLEN(CS_MAX_ENC_SZ),
> +	}, *resp = &tmp;

bfields@pig:~/local/linux-2.6$ gdb vmlinux 
GNU gdb 6.8-debian
...
This GDB was configured as "i486-linux-gnu"...
(gdb) p sizeof(struct nfsd4_compoundres)
$1 = 588

So that's a 588 byte structure on my machine--better not to put it on
the stack if we can avoid it.

This trick of faking up a temporary nfsd4_compoundres to be able to use
nfsd4_encode_create_session() unmodified is sort of brilliant but
possibly also sort of nuts?  I don't know.  Anyway, maybe:

	- rewrite nfsd4_encode_create_session() to call a common
	  encode_create_session that takes just the start and end
	  pointers, then call that?  Or
	- forget the xdr encoding entirely and just save the values we
	  care about from nfsd4_create_session?  (Heck, there's no
	  pointers in there or anything--you could just make a copy of
	  the whole struct.)

I'm leaning towards the latter--the xdr encoding seems unnecessary, and
introduces error-handling for a case (overflowing the CS_MAX_ENC_SZ-size
buffer) that we'll never hit.  And if we're making the clientid slot
such a special case then I suppose there's no need to xdr-encode for
uniform handling with the regular sessions slot case.

--b.

> +
> +	slot->sl_status = nfsd4_encode_create_session(resp, nfserr, cr_ses);
> +	slot->sl_datalen = (char *)resp->p - (char *)p;
> +}
> +
>  static __be32
>  nfsd4_encode_destroy_session(struct nfsd4_compoundres *resp, int nfserr,
>  			     struct nfsd4_destroy_session *destroy_session)
> diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
> index afd4464..21e0b73 100644
> --- a/include/linux/nfsd/xdr4.h
> +++ b/include/linux/nfsd/xdr4.h
> @@ -517,6 +517,8 @@ extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
>  extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp);
>  extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp,
>  		struct nfsd4_sequence *seq);
> +extern void nfsd4_cache_create_session(struct nfsd4_create_session *cr_ses,
> +		struct nfsd4_clid_slot *slot, int nfserr);
>  extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp,
>  		struct nfsd4_compound_state *,
>  struct nfsd4_exchange_id *);
> -- 
> 1.5.4.3
> 

  parent reply	other threads:[~2009-05-15 23:05 UTC|newest]

Thread overview: 45+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-04-28 16:59 [PATCH 01/31] nfsd41: slots are freed with session andros
2009-04-28 16:59 ` [PATCH 02/31] nfsd41: change check_slot_seqid parameters andros
2009-04-28 16:59   ` [PATCH 03/31] nfsd41: turn off create session caching andros
2009-04-28 16:59     ` [PATCH 04/31] nfsd41: separate clientid slot from session slot andros
2009-04-28 16:59       ` [PATCH 05/31] nfsd41: encode create_session result into cache andros
2009-04-28 16:59         ` [PATCH 06/31] nfsd41: create_session check replay first andros
2009-04-28 16:59           ` [PATCH 07/31] nfsd41: replay solo and embedded create session andros
2009-04-28 16:59             ` [PATCH 08/31] nfsd41: sanity check client drc maxreqs andros
2009-04-28 16:59               ` [PATCH 09/31] nfsd41: change from page to memory based drc limits andros
2009-04-28 16:59                 ` [PATCH 10/31] nfsd41: use globals for DRC memory use management andros
2009-04-28 16:59                   ` [PATCH 11/31] nfsd41: set the session maximum response size cached andros
2009-04-28 16:59                     ` [PATCH 12/31] nfsd41: use static buffers for sessions DRC andros
2009-04-28 16:59                       ` [PATCH 13/31] nfsd41: replace ce_cachethis with nfsd4_slot field andros
2009-04-28 16:59                         ` [PATCH 14/31] nfsd41: replace ce_opcnt " andros
2009-04-28 16:59                           ` [PATCH 15/31] nfsd41: nfsd41: replace ce_status " andros
2009-04-28 16:59                             ` [PATCH 16/31] nfsd41: obliterate nfsd4_copy_pages andros
2009-04-28 16:59                               ` [PATCH 17/31] nfsd41: obliterate nfsd41_copy_replay_data andros
2009-04-28 16:59                                 ` [PATCH 18/31] nfsd41: obliterate nfsd4_release_respages andros
2009-04-28 16:59                                   ` [PATCH 19/31] nfsd41: remove iovlen field from nfsd4_compound_state andros
2009-04-28 16:59                                     ` [PATCH 20/31] nfsd41: remove struct nfsd4_cache_entry andros
2009-04-28 16:59                                       ` [PATCH 21/31] nfsd41: obliterate nfsd4_set_statp andros
2009-04-28 16:59                                         ` [PATCH 22/31] nfsd41: rename nfsd4_enc_uncached_replay andros
2009-04-28 16:59                                           ` [PATCH 23/31] nfsd41: encode replay sequence from the slot values andros
2009-04-28 16:59                                             ` [PATCH 24/31] nfsd41: fix nfsd4_replay_cache_entry comments andros
2009-04-28 16:59                                               ` [PATCH 25/31] nfsd41: fix nfsd4_store_cache_entry comments andros
2009-04-28 17:00                                                 ` [PATCH 26/31] nfsd41: support 16 slots per session andros
2009-04-28 17:00                                                   ` [PATCH 27/31] nfsd41: use the maximum operations per compound in nfsd4_compoundargs andros
2009-04-28 17:00                                                     ` [PATCH 28/31] nfsd41: fix nfsd4_store_cache_entry dprintk andros
2009-04-28 17:00                                                       ` [PATCH 29/31] nfsd41: add test for failed sequence operation andros
2009-04-28 17:00                                                         ` [PATCH 30/31] nfsd41: remove redundant failed sequence check andros
2009-04-28 17:00                                                           ` [PATCH 31/31] nfsd41: only reference the session on non-replay sequence andros
2009-04-30 23:08                   ` [PATCH 10/31] nfsd41: use globals for DRC memory use management Benny Halevy
2009-05-01 14:39                     ` Andy Adamson
2009-04-30 17:34               ` [PATCH 08/31] nfsd41: sanity check client drc maxreqs Benny Halevy
2009-04-30 18:43                 ` Trond Myklebust
2009-05-15 23:08             ` [PATCH 07/31] nfsd41: replay solo and embedded create session J. Bruce Fields
2009-05-18 14:02               ` [pnfs] " William A. (Andy) Adamson
     [not found]                 ` <89c397150905180702x6cecb802md9fed2f7f81e9aa1-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-05-18 14:23                   ` J. Bruce Fields
2009-05-18 14:42                     ` William A. (Andy) Adamson
2009-05-15 23:05         ` J. Bruce Fields [this message]
2009-05-18 13:54           ` [pnfs] [PATCH 05/31] nfsd41: encode create_session result into cache William A. (Andy) Adamson
2009-04-30 17:35   ` [PATCH 02/31] nfsd41: change check_slot_seqid parameters Benny Halevy
2009-04-30 19:34     ` Andy Adamson
2009-04-30  9:12 ` [PATCH 01/31] nfsd41: slots are freed with session Benny Halevy
2009-04-30 13:13   ` Andy Adamson

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=20090515230518.GG26389@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=andros@netapp.com \
    --cc=linux-nfs@vger.kernel.org \
    --cc=pnfs@linux-nfs.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.