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
>
next prev 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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox