From: andros@netapp.com
To: bfields@fieldses.org
Cc: pnfs@linux-nfs.org, linux-nfs@vger.kernel.org,
Andy Adamson <andros@netapp.com>
Subject: [PATCH 04/31] nfsd41: separate clientid slot from session slot
Date: Tue, 28 Apr 2009 12:59:38 -0400 [thread overview]
Message-ID: <1240938005-23778-4-git-send-email-andros@netapp.com> (raw)
In-Reply-To: <1240938005-23778-3-git-send-email-andros@netapp.com>
From: Andy Adamson <andros@netapp.com>
The nfs41 single slot clientid cache holds an encoded create session response
which has a maximum size of 88 bytes. The slot does not need the inuse,
cachethis or other fields that the multiple slot session cache uses.
Declare a new structure with a static buffer to struct nfs4_client to cache
the encoded create session response.
Signed-off-by: Andy Adamson <andros@netapp.com>
---
fs/nfsd/nfs4state.c | 28 ++++++++++++++++------------
include/linux/nfsd/state.h | 16 +++++++++++++++-
2 files changed, 31 insertions(+), 13 deletions(-)
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
index e6dbf05..fee6bf0 100644
--- a/fs/nfsd/nfs4state.c
+++ b/fs/nfsd/nfs4state.c
@@ -652,8 +652,6 @@ free_client(struct nfs4_client *clp)
shutdown_callback_client(clp);
if (clp->cl_cb_xprt)
svc_xprt_put(clp->cl_cb_xprt);
- nfsd4_release_respages(clp->cl_slot.sl_cache_entry.ce_respages,
- clp->cl_slot.sl_cache_entry.ce_resused);
if (clp->cl_cred.cr_group_info)
put_group_info(clp->cl_cred.cr_group_info);
kfree(clp->cl_principal);
@@ -729,6 +727,18 @@ static struct nfs4_client *create_client(struct xdr_netobj name, char *recdir)
return clp;
}
+static struct nfs4_client *create_client_session(struct xdr_netobj name,
+ char *recdir)
+{
+ struct nfs4_client *clp;
+
+ clp = create_client(name, recdir);
+ if (clp)
+ /* the slot sl_seqid is 0 */
+ clp->cl_slot.sl_datalen = CS_MAX_ENC_SZ;
+ return clp;
+}
+
static void copy_verf(struct nfs4_client *target, nfs4_verifier *source)
{
memcpy(target->cl_verifier.data, source->data,
@@ -1277,7 +1287,7 @@ nfsd4_exchange_id(struct svc_rqst *rqstp,
out_new:
/* Normal case */
- new = create_client(exid->clname, dname);
+ new = create_client_session(exid->clname, dname);
if (new == NULL) {
status = nfserr_resource;
goto out;
@@ -1294,7 +1304,6 @@ out_copy:
exid->clientid.cl_boot = new->cl_clientid.cl_boot;
exid->clientid.cl_id = new->cl_clientid.cl_id;
- new->cl_slot.sl_seqid = 0;
exid->seqid = 1;
nfsd4_set_ex_flags(new, exid);
@@ -1342,7 +1351,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
{
u32 ip_addr = svc_addr_in(rqstp)->sin_addr.s_addr;
struct nfs4_client *conf, *unconf;
- struct nfsd4_slot *slot = NULL;
+ struct nfsd4_clid_slot *slot = NULL;
int status = 0;
nfs4_lock_state();
@@ -1351,8 +1360,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
if (conf) {
slot = &conf->cl_slot;
- status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid,
- slot->sl_inuse);
+ status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid, 0);
if (status == nfserr_replay_cache) {
dprintk("Got a create_session replay! seqid= %d\n",
slot->sl_seqid);
@@ -1372,8 +1380,7 @@ nfsd4_create_session(struct svc_rqst *rqstp,
}
slot = &unconf->cl_slot;
- status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid,
- slot->sl_inuse);
+ status = check_slot_seqid(cr_ses->seqid, slot->sl_seqid, 0);
if (status) {
/* an unconfirmed replay returns misordered */
status = nfserr_seq_misordered;
@@ -1412,9 +1419,6 @@ nfsd4_create_session(struct svc_rqst *rqstp,
NFS4_MAX_SESSIONID_LEN);
cr_ses->seqid = slot->sl_seqid;
- slot->sl_inuse = true;
- /* Ensure a page is used for the cache */
- slot->sl_cache_entry.ce_cachethis = 1;
out:
nfs4_unlock_state();
dprintk("%s returns %d\n", __func__, ntohl(status));
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 14da8f6..bc34876 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -128,6 +128,20 @@ struct nfsd4_slot {
struct nfsd4_cache_entry sl_cache_entry;
};
+/*
+ * maximum encoded size of create session response
+ * 16 - sessionid, 8 - sequence # and flags,
+ * 32 - fore channel attrs, 32 - back channel attrs
+ */
+#define CS_MAX_ENC_SZ 88
+
+struct nfsd4_clid_slot {
+ u32 sl_seqid;
+ __be32 sl_status;
+ u32 sl_datalen;
+ char sl_data[CS_MAX_ENC_SZ];
+};
+
struct nfsd4_channel_attrs {
u32 headerpadsz;
u32 maxreq_sz;
@@ -205,7 +219,7 @@ struct nfs4_client {
/* for nfs41 */
struct list_head cl_sessions;
- struct nfsd4_slot cl_slot; /* create_session slot */
+ struct nfsd4_clid_slot cl_slot; /* create_session slot */
u32 cl_exchange_flags;
struct nfs4_sessionid cl_sessionid;
--
1.5.4.3
next prev parent reply other threads:[~2009-04-28 17:01 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 ` andros [this message]
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 ` [PATCH 05/31] nfsd41: encode create_session result into cache J. Bruce Fields
2009-05-18 13:54 ` [pnfs] " 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=1240938005-23778-4-git-send-email-andros@netapp.com \
--to=andros@netapp.com \
--cc=bfields@fieldses.org \
--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.