All of lore.kernel.org
 help / color / mirror / Atom feed
From: "J. Bruce Fields" <bfields@fieldses.org>
To: Benny Halevy <bhalevy@panasas.com>
Cc: linux-nfs@vger.kernel.org, pnfs@linux-nfs.org
Subject: Re: [PATCH v2 23/47] nfsd41: create_session operation
Date: Tue, 31 Mar 2009 21:06:54 -0400	[thread overview]
Message-ID: <20090401010654.GE26583@fieldses.org> (raw)
In-Reply-To: <1238229177-10984-1-git-send-email-bhalevy@panasas.com>

On Sat, Mar 28, 2009 at 11:32:57AM +0300, Benny Halevy wrote:
> From: Andy Adamson <andros@netapp.com>
> 
> Implement the create_session operation confoming to
> http://tools.ietf.org/html/draft-ietf-nfsv4-minorversion1-26
> 
> Look up the client id (generated by the server on exchange_id,
> given by the client on create_session).
> If neither a confirmed or unconfirmed client is found
> then the client id is stale
> If a confirmed cilent is found (i.e. we already received
> create_session for it) then compare the sequence id
> to determine if it's a replay or possibly a mis-ordered rpc.
> If the seqid is in order, update the confirmed client seqid
> and procedd with updating the session parameters.
> 
> If an unconfirmed client_id is found then verify the creds
> and seqid.  If both match move the client id to confirmed state
> and proceed with processing the create_session.
> 
> Currently, we do not support persistent sessions, and RDMA.
> 
> alloc_init_session generates a new sessionid and creates
> a session structure.
> 
> NFSD_PAGES_PER_SLOT is used for the max response cached calculation, and for
> the counting of DRC pages using the hard limits set in struct srv_serv.
> 
> A note on NFSD_PAGES_PER_SLOT:
> 
> Other patches in this series allow for NFSD_PAGES_PER_SLOT + 1 pages to be
> cached in a DRC slot when the response size is less than NFSD_PAGES_PER_SLOT *
> PAGE_SIZE but xdr_buf pages are used. e.g. a READDIR operation will encode a
> small amount of data in the xdr_buf head, and then the READDIR in the xdr_buf
> pages.  So, the hard limit calculation use of pages by a session is
> underestimated by the number of cached operations using the xdr_buf pages.
> 
> Yet another patch caches no pages for the solo sequence operation, or any
> compound where cache_this is False.  So the hard limit calculation use of
> pages by a session is overestimated by the number of these operations in the
> cache.
> 
> TODO: improve resource pre-allocation and negotiate session
> parameters accordingly.  Respect and possibly adjust
> backchannel attributes.
> 
> Signed-off-by: Marc Eshel <eshel@almaden.ibm.com>
> Signed-off-by: Dean Hildebrand <dhildeb@us.ibm.com>
> [nfsd41: remove headerpadsz from channel attributes]
> Our client and server only support a headerpadsz of 0.
> [nfsd41: use DRC limits in fore channel init]
> [nfsd41: do not change CREATE_SESSION back channel attrs]
> Signed-off-by: Andy Adamson <andros@netapp.com>
> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
> [use sessionid_lock spin lock]
> [nfsd41: use bool inuse for slot state]
> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
> ---
>  fs/nfsd/nfs4state.c        |  197 +++++++++++++++++++++++++++++++++++++++++++-
>  fs/nfsd/nfs4xdr.c          |  147 ++++++++++++++++++++++++++++++++-
>  include/linux/nfsd/state.h |    7 ++
>  include/linux/nfsd/xdr4.h  |   21 +++++-
>  4 files changed, 368 insertions(+), 4 deletions(-)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 37865c9..e4e2c19 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -68,6 +68,9 @@ static u32 current_delegid = 1;
>  static u32 nfs4_init;
>  static stateid_t zerostateid;             /* bits all 0 */
>  static stateid_t onestateid;              /* bits all 1 */
> +#ifdef CONFIG_NFSD_V4_1
> +static u64 current_sessionid = 1;
> +#endif /* CONFIG_NFSD_V4_1 */
>  
>  #define ZERO_STATEID(stateid) (!memcmp((stateid), &zerostateid, sizeof(stateid_t)))
>  #define ONE_STATEID(stateid)  (!memcmp((stateid), &onestateid, sizeof(stateid_t)))
> @@ -402,6 +405,138 @@ dump_sessionid(const char *fn, struct nfs4_sessionid *sessionid)
>  	dprintk("%s: %u:%u:%u:%u\n", fn, ptr[0], ptr[1], ptr[2], ptr[3]);
>  }
>  
> +static void
> +gen_sessionid(struct nfsd4_session *ses)
> +{
> +	struct nfs4_client *clp = ses->se_client;
> +	struct nfsd4_sessionid *sid;
> +
> +	sid = (struct nfsd4_sessionid *)ses->se_sessionid.data;
> +	sid->clientid = clp->cl_clientid;
> +	sid->sequence = current_sessionid++;
> +	sid->reserved = 0;
> +}
> +
> +/*
> + * Give the client the number of slots it requests bound by
> + * NFSD_MAX_SLOTS_PER_SESSION and by sv_drc_max_pages.
> + *
> + * If we run out of pages (sv_drc_pages_used == sv_drc_max_pages) we
> + * should (up to a point) re-negotiate active sessions and reduce their
> + * slot usage to make rooom for new connections. For now we just fail the
> + * create session.
> + */
> +static int set_forechannel_maxreqs(struct nfsd4_channel_attrs *fchan)
> +{
> +	int status = 0, np = fchan->maxreqs * NFSD_PAGES_PER_SLOT;
> +
> +	spin_lock(&nfsd_serv->sv_lock);
> +	if (np + nfsd_serv->sv_drc_pages_used > nfsd_serv->sv_drc_max_pages)
> +		np = nfsd_serv->sv_drc_max_pages - nfsd_serv->sv_drc_pages_used;
> +	nfsd_serv->sv_drc_pages_used += np;
> +	spin_unlock(&nfsd_serv->sv_lock);
> +
> +	if (np <= 0) {
> +		status = nfserr_resource;
> +		fchan->maxreqs = 0;
> +	} else
> +		fchan->maxreqs = np / NFSD_PAGES_PER_SLOT;
> +
> +	return status;
> +}
> +
> +/*
> + * fchan holds the client values on input, and the server values on output
> + */
> +static int init_forechannel_attrs(struct svc_rqst *rqstp,
> +				    struct nfsd4_session *session,
> +				    struct nfsd4_channel_attrs *fchan)
> +{
> +	int status = 0;
> +	__u32   maxcount = svc_max_payload(rqstp);
> +
> +	/* headerpadsz set to zero in encode routine*/
> +
> +	/* Use the client's max request and max response size if possible */
> +	if (fchan->maxreq_sz > maxcount)
> +		fchan->maxreq_sz = maxcount;
> +	session->se_fmaxreq_sz = fchan->maxreq_sz;
> +
> +	if (fchan->maxresp_sz > maxcount)
> +		fchan->maxresp_sz = maxcount;
> +	session->se_fmaxresp_sz = fchan->maxresp_sz;
> +
> +	/* Set the max response cached size our default which is
> +	 * a multiple of PAGE_SIZE and small */
> +	session->se_fmaxresp_cached = NFSD_PAGES_PER_SLOT * PAGE_SIZE;
> +	fchan->maxresp_cached = session->se_fmaxresp_cached;
> +
> +	/* Use the client's maxops if possible */
> +	if (fchan->maxops > NFSD_MAX_OPS_PER_COMPOUND)
> +		fchan->maxops = NFSD_MAX_OPS_PER_COMPOUND;
> +	session->se_fmaxops = fchan->maxops;
> +
> +	/* try to use the client requested number of slots */
> +	if (fchan->maxreqs > NFSD_MAX_SLOTS_PER_SESSION)
> +		fchan->maxreqs = NFSD_MAX_SLOTS_PER_SESSION;
> +
> +	/* FIXME: Error means no more DRC pages so the server should
> +	 * recover pages from existing sessions. For now fail session
> +	 * creation.
> +	 */
> +	status = set_forechannel_maxreqs(fchan);
> +
> +	session->se_fnumslots = fchan->maxreqs;
> +	return status;
> +}
> +
> +static int
> +alloc_init_session(struct svc_rqst *rqstp, struct nfs4_client *clp,
> +		   struct nfsd4_create_session *cses)
> +{
> +	struct nfsd4_session *new;
> +	int idx, status = nfserr_resource, slotsize, i;
> +
> +	new = kzalloc(sizeof(*new), GFP_KERNEL);
> +	if (!new)
> +		goto out;
> +
> +	/* FIXME: For now, we just accept the client back channel attributes. */
> +	status = init_forechannel_attrs(rqstp, new, &cses->fore_channel);
> +	if (status)
> +		goto out_free;
> +
> +	slotsize = new->se_fnumslots * sizeof(struct nfsd4_slot);
> +	new->se_slots = kzalloc(slotsize, GFP_KERNEL);
> +	if (!new->se_slots)
> +		goto out_free;
> +
> +	for (i = 0; i < new->se_fnumslots; i++)
> +		new->se_slots[i].sl_session = new;
> +
> +	new->se_client = clp;
> +	gen_sessionid(new);
> +	idx = hash_sessionid(&new->se_sessionid);
> +	memcpy(clp->cl_sessionid.data, new->se_sessionid.data,
> +	       NFS4_MAX_SESSIONID_LEN);

The sessionid should be part of the new session, not the client, right?

> +
> +	new->se_flags = cses->flags;
> +	kref_init(&new->se_ref);
> +	INIT_LIST_HEAD(&new->se_hash);
> +	INIT_LIST_HEAD(&new->se_perclnt);
> +	spin_lock(&sessionid_lock);
> +	list_add(&new->se_hash, &sessionid_hashtbl[idx]);
> +	list_add(&new->se_perclnt, &clp->cl_sessions);
> +	spin_unlock(&sessionid_lock);
> +
> +	status = nfs_ok;
> +out:
> +	return status;
> +out_free:
> +	kfree(new);
> +	goto out;
> +}
> +
>  /* caller must hold sessionid_lock */
>  static struct nfsd4_session *
>  find_in_sessionid_hashtbl(struct nfs4_sessionid *sessionid)
> @@ -1186,7 +1321,67 @@ nfsd4_create_session(struct svc_rqst *rqstp,
>  		     struct nfsd4_compound_state *cstate,
>  		     struct nfsd4_create_session *cr_ses)
>  {
> -	return -1;	/* stub */
> +	u32 ip_addr = svc_addr_in(rqstp)->sin_addr.s_addr;
> +	struct nfs4_client *conf, *unconf;
> +	int status = 0;
> +
> +	nfs4_lock_state();
> +	unconf = find_unconfirmed_client(&cr_ses->clientid);
> +	conf = find_confirmed_client(&cr_ses->clientid);
> +
> +	if (conf) {
> +		status = nfs_ok;
> +		if (conf->cl_seqid == cr_ses->seqid) {
> +			dprintk("Got a create_session replay! seqid= %d\n",
> +				conf->cl_seqid);
> +			goto out_replay;
> +		} else if (cr_ses->seqid != conf->cl_seqid + 1) {
> +			status = nfserr_seq_misordered;
> +			dprintk("Sequence misordered!\n");
> +			dprintk("Expected seqid= %d but got seqid= %d\n",
> +				conf->cl_seqid, cr_ses->seqid);
> +			goto out;
> +		}
> +		conf->cl_seqid++;
> +	} else if (unconf) {
> +		if (!same_creds(&unconf->cl_cred, &rqstp->rq_cred) ||
> +		    (ip_addr != unconf->cl_addr)) {

Again, I don't believe the nfsv4/4.1 specs require the client to keep to
a single ip address, so we shouldn't be doing ip address checks.

--b.

> +			status = nfserr_clid_inuse;
> +			goto out;
> +		}
> +
> +		if (unconf->cl_seqid != cr_ses->seqid) {
> +			status = nfserr_seq_misordered;
> +			goto out;
> +		}
> +
> +		move_to_confirmed(unconf);
> +
> +		/*
> +		 * We do not support RDMA or persistent sessions
> +		 */
> +		cr_ses->flags &= ~SESSION4_PERSIST;
> +		cr_ses->flags &= ~SESSION4_RDMA;
> +
> +		conf = unconf;
> +	} else {
> +		status = nfserr_stale_clientid;
> +		goto out;

Is this the right error?

--b.

> +	}
> +
> +	status = alloc_init_session(rqstp, conf, cr_ses);
> +	if (status)
> +		goto out;
> +
> +out_replay:
> +	memcpy(cr_ses->sessionid.data, conf->cl_sessionid.data,
> +	       NFS4_MAX_SESSIONID_LEN);
> +	cr_ses->seqid = conf->cl_seqid;
> +
> +out:
> +	nfs4_unlock_state();
> +	dprintk("%s returns %d\n", __func__, ntohl(status));
> +	return status;
>  }
>  
>  __be32
> diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c
> index 57afb33..60db854 100644
> --- a/fs/nfsd/nfs4xdr.c
> +++ b/fs/nfsd/nfs4xdr.c
> @@ -1100,7 +1100,108 @@ static __be32
>  nfsd4_decode_create_session(struct nfsd4_compoundargs *argp,
>  			    struct nfsd4_create_session *sess)
>  {
> -	return nfserr_opnotsupp;	/* stub */
> +	DECODE_HEAD;
> +
> +	u32 dummy;
> +	char *machine_name;
> +	int i;
> +	int nr_secflavs;
> +
> +	READ_BUF(16);
> +	COPYMEM(&sess->clientid, 8);
> +	READ32(sess->seqid);
> +	READ32(sess->flags);
> +
> +	/* Fore channel attrs */
> +	READ_BUF(28);
> +	READ32(dummy); /* headerpadsz is always 0 */
> +	READ32(sess->fore_channel.maxreq_sz);
> +	READ32(sess->fore_channel.maxresp_sz);
> +	READ32(sess->fore_channel.maxresp_cached);
> +	READ32(sess->fore_channel.maxops);
> +	READ32(sess->fore_channel.maxreqs);
> +	READ32(sess->fore_channel.nr_rdma_attrs);
> +	if (sess->fore_channel.nr_rdma_attrs == 1) {
> +		READ_BUF(4);
> +		READ32(sess->fore_channel.rdma_attrs);
> +	} else if (sess->fore_channel.nr_rdma_attrs > 1) {
> +		dprintk("Too many fore channel attr bitmaps!\n");
> +		goto xdr_error;
> +	}
> +
> +	/* Back channel attrs */
> +	READ_BUF(28);
> +	READ32(dummy); /* headerpadsz is always 0 */
> +	READ32(sess->back_channel.maxreq_sz);
> +	READ32(sess->back_channel.maxresp_sz);
> +	READ32(sess->back_channel.maxresp_cached);
> +	READ32(sess->back_channel.maxops);
> +	READ32(sess->back_channel.maxreqs);
> +	READ32(sess->back_channel.nr_rdma_attrs);
> +	if (sess->back_channel.nr_rdma_attrs == 1) {
> +		READ_BUF(4);
> +		READ32(sess->back_channel.rdma_attrs);
> +	} else if (sess->back_channel.nr_rdma_attrs > 1) {
> +		dprintk("Too many back channel attr bitmaps!\n");
> +		goto xdr_error;
> +	}
> +
> +	READ_BUF(8);
> +	READ32(sess->callback_prog);
> +
> +	/* callback_sec_params4 */
> +	READ32(nr_secflavs);
> +	for (i = 0; i < nr_secflavs; ++i) {
> +		READ_BUF(4);
> +		READ32(dummy);
> +		switch (dummy) {
> +		case RPC_AUTH_NULL:
> +			/* Nothing to read */
> +			break;
> +		case RPC_AUTH_UNIX:
> +			READ_BUF(8);
> +			/* stamp */
> +			READ32(dummy);
> +
> +			/* machine name */
> +			READ32(dummy);
> +			READ_BUF(dummy);
> +			SAVEMEM(machine_name, dummy);
> +
> +			/* uid, gid */
> +			READ_BUF(8);
> +			READ32(sess->uid);
> +			READ32(sess->gid);
> +
> +			/* more gids */
> +			READ_BUF(4);
> +			READ32(dummy);
> +			READ_BUF(dummy * 4);
> +			for (i = 0; i < dummy; ++i)
> +				READ32(dummy);
> +			break;
> +		case RPC_AUTH_GSS:
> +			dprintk("RPC_AUTH_GSS callback secflavor "
> +				"not supported!\n");
> +			READ_BUF(8);
> +			/* gcbp_service */
> +			READ32(dummy);
> +			/* gcbp_handle_from_server */
> +			READ32(dummy);
> +			READ_BUF(dummy);
> +			p += XDR_QUADLEN(dummy);
> +			/* gcbp_handle_from_client */
> +			READ_BUF(4);
> +			READ32(dummy);
> +			READ_BUF(dummy);
> +			p += XDR_QUADLEN(dummy);
> +			break;
> +		default:
> +			dprintk("Illegal callback secflavor\n");
> +			return nfserr_inval;
> +		}
> +	}
> +	DECODE_TAIL;
>  }
>  
>  static __be32
> @@ -2829,7 +2930,49 @@ static __be32
>  nfsd4_encode_create_session(struct nfsd4_compoundres *resp, int nfserr,
>  			    struct nfsd4_create_session *sess)
>  {
> -	/* stub */
> +	ENCODE_HEAD;
> +
> +	if (nfserr)
> +		goto out;
> +
> +	RESERVE_SPACE(24);
> +	WRITEMEM(sess->sessionid.data, NFS4_MAX_SESSIONID_LEN);
> +	WRITE32(sess->seqid);
> +	WRITE32(sess->flags);
> +	ADJUST_ARGS();
> +
> +	RESERVE_SPACE(28);
> +	WRITE32(0); /* headerpadsz */
> +	WRITE32(sess->fore_channel.maxreq_sz);
> +	WRITE32(sess->fore_channel.maxresp_sz);
> +	WRITE32(sess->fore_channel.maxresp_cached);
> +	WRITE32(sess->fore_channel.maxops);
> +	WRITE32(sess->fore_channel.maxreqs);
> +	WRITE32(sess->fore_channel.nr_rdma_attrs);
> +	ADJUST_ARGS();
> +
> +	if (sess->fore_channel.nr_rdma_attrs) {
> +		RESERVE_SPACE(4);
> +		WRITE32(sess->fore_channel.rdma_attrs);
> +		ADJUST_ARGS();
> +	}
> +
> +	RESERVE_SPACE(28);
> +	WRITE32(0); /* headerpadsz */
> +	WRITE32(sess->back_channel.maxreq_sz);
> +	WRITE32(sess->back_channel.maxresp_sz);
> +	WRITE32(sess->back_channel.maxresp_cached);
> +	WRITE32(sess->back_channel.maxops);
> +	WRITE32(sess->back_channel.maxreqs);
> +	WRITE32(sess->back_channel.nr_rdma_attrs);
> +	ADJUST_ARGS();
> +
> +	if (sess->back_channel.nr_rdma_attrs) {
> +		RESERVE_SPACE(4);
> +		WRITE32(sess->back_channel.rdma_attrs);
> +		ADJUST_ARGS();
> +	}
> +out:
>  	return nfserr;
>  }
>  
> diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
> index 8ca6a82..98d7b1c 100644
> --- a/include/linux/nfsd/state.h
> +++ b/include/linux/nfsd/state.h
> @@ -99,8 +99,12 @@ struct nfs4_callback {
>  	struct rpc_clnt *       cb_client;
>  };
>  
> +/* Maximum number of slots per session. 128 is useful for long haul TCP */
> +#define NFSD_MAX_SLOTS_PER_SESSION	128
>  /* Maximum number of pages per slot cache entry */
>  #define NFSD_PAGES_PER_SLOT	1
> +/* Maximum number of operations per session compound */
> +#define NFSD_MAX_OPS_PER_COMPOUND	16
>  
>  struct nfsd4_cache_entry {
>  	__be32		ce_status;
> @@ -188,6 +192,9 @@ struct nfs4_client {
>  	struct list_head	cl_sessions;
>  	u32			cl_seqid;       /* seqid for create_session */
>  	u32			cl_exchange_flags;
> +	struct nfs4_sessionid	cl_sessionid;
> +
> +	struct svc_xprt		*cl_cb_xprt;	/* 4.1 callback transport */
>  #endif /* CONFIG_NFSD_V4_1 */
>  };
>  
> diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
> index 5c0d376..c7bf0a1 100644
> --- a/include/linux/nfsd/xdr4.h
> +++ b/include/linux/nfsd/xdr4.h
> @@ -360,8 +360,27 @@ struct nfsd4_exchange_id {
>  	int		spa_how;
>  };
>  
> +struct nfsd4_channel_attrs {
> +	u32		headerpadsz;
> +	u32		maxreq_sz;
> +	u32		maxresp_sz;
> +	u32		maxresp_cached;
> +	u32		maxops;
> +	u32		maxreqs;
> +	u32		nr_rdma_attrs;
> +	u32		rdma_attrs;
> +};
> +
>  struct nfsd4_create_session {
> -	int	foo;	/* stub */
> +	clientid_t		clientid;
> +	struct nfs4_sessionid	sessionid;
> +	u32			seqid;
> +	u32			flags;
> +	struct nfsd4_channel_attrs fore_channel;
> +	struct nfsd4_channel_attrs back_channel;
> +	u32			callback_prog;
> +	u32			uid;
> +	u32			gid;
>  };
>  
>  struct nfsd4_sequence {
> -- 
> 1.6.2.1
> 

  parent reply	other threads:[~2009-04-01  1:06 UTC|newest]

Thread overview: 204+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-03-27  2:58 [PATCH 0/47] NFSv4.1 Sessions server code for 2.6.30 Benny Halevy
2009-03-27  3:01 ` [PATCH 01/47] nfsd: don't use the deferral service, return NFS4ERR_DELAY Benny Halevy
2009-03-28  0:04   ` J. Bruce Fields
2009-03-28  7:54     ` Benny Halevy
2009-03-27  3:01 ` [PATCH 02/47] sunrpc: add cl_private field to struct rpc_clnt Benny Halevy
2009-03-28  0:05   ` J. Bruce Fields
2009-03-28  0:39     ` Myklebust, Trond
2009-03-28  8:20       ` Benny Halevy
2009-03-28 17:23         ` Trond Myklebust
     [not found]           ` <1238261035.6679.4.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2009-03-28 17:29             ` Benny Halevy
2009-03-28 17:35               ` Trond Myklebust
     [not found]                 ` <1238261753.6679.13.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2009-03-28 19:26                   ` Benny Halevy
2009-03-28 20:37                     ` Trond Myklebust
2009-03-27  3:02 ` [PATCH 03/47] nfsd: embed nfsd4_current_state in nfsd4_compoundres Benny Halevy
2009-03-27  3:05 ` [PATCH 04/47] nfsd: add a struct nfsd4_slot pointer to struct nfsd4_compound_state Benny Halevy
2009-03-27  3:06 ` [PATCH 05/47] nfs41: common protocol definitions Benny Halevy
2009-03-27  3:06 ` [PATCH 06/47] nfsd41: change NFSERR_REPLAY_ME Benny Halevy
2009-03-27  3:06 ` [PATCH 07/47] nfsd41: Add Kconfig symbols for NFSv4.1 Benny Halevy
2009-03-27  3:07 ` [PATCH 08/47] nfsd41: define nfs41 error codes Benny Halevy
2009-03-27  3:07 ` [PATCH 09/47] nfsd41: sessions basic data types Benny Halevy
2009-03-27  3:07 ` [PATCH 10/47] nfsd41: introduce nfs4_client cl_sessions list Benny Halevy
2009-03-27  3:08 ` [PATCH 11/47] nfsd41: release_session when client is expired Benny Halevy
2009-03-27  3:08 ` [PATCH 12/47] nfsd41: sessionid hashing Benny Halevy
2009-03-27  3:08 ` [PATCH 13/47] nfsd41: xdr infrastructure Benny Halevy
2009-03-27  3:09 ` [PATCH 14/47] nfsd: remove nfsd4_ops array size Benny Halevy
2009-03-27  3:11 ` [PATCH 15/47] nfsd41: proc stubs Benny Halevy
2009-03-27  3:15 ` [PATCH 16/47] nfsd41: exchange_id operation Benny Halevy
2009-03-27  3:15 ` [PATCH 17/47] nfsd41: match clientid establishment method Benny Halevy
2009-03-27  3:15 ` [PATCH 18/47] nfsd41: sequence operation Benny Halevy
2009-03-27  3:15 ` [PATCH 19/47] nfsd41: enforce NFS4ERR_SEQUENCE_POS operation order rules Benny Halevy
2009-03-27  3:16 ` [PATCH 20/47] nfsd41: DRC save, restore, and clear functions Benny Halevy
2009-03-27  3:16 ` [PATCH 21/47] nfsd41: hard page limit for DRC Benny Halevy
2009-03-27  3:16 ` [PATCH 22/47] nfsd41: nfsd DRC logic Benny Halevy
2009-03-27  3:16 ` [PATCH 23/47] nfsd41: clear DRC cache on free_session Benny Halevy
2009-03-27  3:16 ` [PATCH 24/47] nfsd41: create_session operation Benny Halevy
2009-03-27  3:16 ` [PATCH 25/47] nfsd41: Add a create session replay cache Benny Halevy
2009-03-27  3:16 ` [PATCH 26/47] nfsd41: non-page DRC for solo sequence responses Benny Halevy
2009-03-27  3:16 ` [PATCH 27/47] nfsd41: destroy_session operation Benny Halevy
2009-03-27  3:17 ` [PATCH 28/47] nfsd41: stateid handling Benny Halevy
2009-03-27  3:17 ` [PATCH 29/47] nfsd41: check encode size for sessions maxresponse cached Benny Halevy
2009-03-27  3:17 ` [PATCH 30/47] nfsd41: clientid handling Benny Halevy
2009-03-27  3:17 ` [PATCH 31/47] nfsd41: access_valid Benny Halevy
2009-03-27  3:18 ` [PATCH 32/47] nfsd41: add OPEN4_SHARE_ACCESS_WANT nfs4_stateid bmap Benny Halevy
2009-03-27  3:18 ` [PATCH 33/47] nfsd41: provide support for minor version 1 at rpc level Benny Halevy
2009-03-27  3:18 ` [PATCH 34/47] nfsd: cleanup nfs4.0 callback encode routines Benny Halevy
2009-03-27  3:18 ` [PATCH 35/47] nfsd: minorversion support for the back channel Benny Halevy
2009-03-27  3:18 ` [PATCH 36/47] nfsd41: sunrpc: Added rpc server-side backchannel handling Benny Halevy
2009-03-27  3:19 ` [PATCH 37/47] nfsd41: callback infrastructure Benny Halevy
2009-03-27  3:19 ` [PATCH 38/47] nfsd41: Remember the auth flavor to use for callbacks Benny Halevy
2009-03-27  3:19 ` [PATCH 39/47] nfsd41: introduce cl_cb_mutex Benny Halevy
2009-03-27  3:19 ` [PATCH 40/47] nfsd41: cb_sequence callback Benny Halevy
2009-03-27  3:20 ` [PATCH 41/47] nfsd41: introduce nfs4_cb_call_sync for nfs4 and nfs41 Benny Halevy
2009-03-27  3:20 ` [PATCH 42/47] nfsd41: cb_recall callback Benny Halevy
2009-03-27  3:20 ` [PATCH 43/47] nfsd41: pass writable attrs mask to nfsd4_decode_fattr Benny Halevy
2009-03-27  3:20 ` [PATCH 44/47] nfsd41: support for 3-word long attribute bitmask Benny Halevy
2009-03-27  3:20 ` [PATCH 45/47] nfsd41: SUPPATTR_EXCLCREAT attribute Benny Halevy
2009-03-27  3:22 ` [PATCH 46/47] nfsd41: CREATE_EXCLUSIVE4_1 Benny Halevy
2009-03-27  3:23 ` [PATCH 47/47] nfsd41: Documentation/filesystems/nfs41-server.txt Benny Halevy
2009-03-28  0:01 ` [PATCH 0/47] NFSv4.1 Sessions server code for 2.6.30 J. Bruce Fields
2009-03-28  8:28   ` Benny Halevy
2009-03-28  8:30     ` [PATCH v2 01/47] nfsd: don't use the deferral service, return NFS4ERR_DELAY Benny Halevy
2009-03-28  8:30     ` [PATCH v2 02/47] nfsd: embed nfsd4_current_state in nfsd4_compoundres Benny Halevy
2009-03-29 20:46       ` J. Bruce Fields
2009-03-28  8:30     ` [PATCH v2 03/47] nfsd: add a struct nfsd4_slot pointer to struct nfsd4_compound_state Benny Halevy
2009-03-29 20:46       ` J. Bruce Fields
2009-03-30 19:59         ` Benny Halevy
2009-03-28  8:31     ` [PATCH v2 04/47] nfs41: common protocol definitions Benny Halevy
2009-03-30 21:54       ` J. Bruce Fields
2009-03-31  7:06         ` Benny Halevy
2009-03-28  8:31     ` [PATCH v2 05/47] nfsd41: change NFSERR_REPLAY_ME Benny Halevy
2009-03-28  8:31     ` [PATCH v2 06/47] nfsd41: Add Kconfig symbols for NFSv4.1 Benny Halevy
2009-04-01  4:33       ` J. Bruce Fields
2009-04-01  8:31         ` Benny Halevy
2009-04-01 13:10           ` J. Bruce Fields
2009-04-01 14:07             ` Benny Halevy
2009-04-01 15:32               ` [pnfs] " Benny Halevy
2009-04-02  9:18                 ` Benny Halevy
2009-04-02 13:27                   ` J. Bruce Fields
2009-04-02 13:46                     ` Benny Halevy
2009-04-02 14:16                       ` Trond Myklebust
     [not found]                         ` <1238681800.6191.5.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2009-04-02 14:22                           ` J. Bruce Fields
2009-04-02 14:25                             ` Trond Myklebust
     [not found]                               ` <1238682355.6191.6.camel-rJ7iovZKK19ZJLDQqaL3InhyD016LWXt@public.gmane.org>
2009-04-02 14:31                                 ` J. Bruce Fields
2009-04-02 16:34                                   ` Benny Halevy
2009-04-02 16:54                                     ` J. Bruce Fields
2009-04-02 17:45                                       ` Benny Halevy
2009-04-02 17:52                                         ` Benny Halevy
2009-04-02 17:55                                           ` J. Bruce Fields
2009-04-02 17:58                                             ` J. Bruce Fields
2009-04-02 18:41                                               ` Benny Halevy
2009-04-02 18:46                                                 ` J. Bruce Fields
2009-04-02 19:05                                                   ` Benny Halevy
2009-04-02 22:49                                                     ` J. Bruce Fields
2009-04-03  0:11                                                       ` Benny Halevy
2009-04-03  2:29                                                         ` J. Bruce Fields
2009-03-28  8:31     ` [PATCH v2 07/47] nfsd41: define nfs41 error codes Benny Halevy
2009-03-30 18:16       ` J. Bruce Fields
2009-03-30 19:59         ` Benny Halevy
2009-03-30 20:08           ` J. Bruce Fields
2009-03-28  8:31     ` [PATCH v2 08/47] nfsd41: sessions basic data types Benny Halevy
2009-03-28  8:31     ` [PATCH v2 09/47] nfsd41: introduce nfs4_client cl_sessions list Benny Halevy
2009-03-28  8:31     ` [PATCH v2 10/47] nfsd41: release_session when client is expired Benny Halevy
2009-03-28  8:31     ` [PATCH v2 11/47] nfsd41: sessionid hashing Benny Halevy
2009-03-30 20:08       ` J. Bruce Fields
2009-03-30 20:34         ` Benny Halevy
2009-03-30 20:59           ` J. Bruce Fields
2009-03-31  7:02             ` Benny Halevy
2009-03-28  8:31     ` [PATCH v2 12/47] nfsd41: xdr infrastructure Benny Halevy
2009-03-28  8:32     ` [PATCH v2 13/47] nfsd: remove nfsd4_ops array size Benny Halevy
2009-03-28  8:32     ` [PATCH v2 14/47] nfsd41: proc stubs Benny Halevy
2009-03-28  8:32     ` [PATCH v2 15/47] nfsd41: exchange_id operation Benny Halevy
2009-03-30 22:06       ` J. Bruce Fields
2009-03-31  7:44         ` Benny Halevy
2009-03-31  2:47       ` J. Bruce Fields
     [not found]         ` <7A6A58246D5F0B4EA127BEA555B3A9AD72ED6C@RTPMVEXC1-PRD.hq.netapp.com>
     [not found]           ` <7A6A58246D5F0B4EA127BEA555B3A9AD72ED6C-rtwIt2gI0FxT+ZUat5FNkAK/GNPrWCqfQQ4Iyu8u01E@public.gmane.org>
2009-04-01 15:01             ` [pnfs] " J. Bruce Fields
2009-04-01 15:53               ` Sager, Mike
2009-03-28  8:32     ` [PATCH v2 16/47] nfsd41: match clientid establishment method Benny Halevy
2009-03-30 22:07       ` J. Bruce Fields
2009-03-31  6:59         ` Benny Halevy
2009-03-31 17:59           ` J. Bruce Fields
2009-03-31 18:21             ` Benny Halevy
2009-03-31  3:04       ` J. Bruce Fields
2009-03-31  8:49         ` Benny Halevy
2009-03-31 14:10           ` Andy Adamson
2009-04-02  0:01             ` J. Bruce Fields
2009-04-02  0:14               ` J. Bruce Fields
2009-04-02  7:22               ` Benny Halevy
2009-03-28  8:32     ` [PATCH v2 17/47] nfsd41: sequence operation Benny Halevy
2009-03-31 19:23       ` J. Bruce Fields
2009-03-28  8:32     ` [PATCH v2 18/47] nfsd41: enforce NFS4ERR_SEQUENCE_POS operation order rules Benny Halevy
2009-03-31  3:20       ` J. Bruce Fields
2009-03-31  9:04         ` Benny Halevy
2009-03-28  8:32     ` [PATCH v2 19/47] nfsd41: DRC save, restore, and clear functions Benny Halevy
2009-03-31 23:03       ` J. Bruce Fields
2009-04-01 18:23         ` Andy Adamson
2009-04-02 21:16           ` J. Bruce Fields
2009-04-02 21:29             ` [pnfs] " William A. (Andy) Adamson
     [not found]               ` <89c397150904021429i6731a9c0ibe064a0828941d16-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-04-02 22:31                 ` J. Bruce Fields
2009-03-28  8:32     ` [PATCH v2 20/47] nfsd41: hard page limit for DRC Benny Halevy
2009-03-28  8:32     ` [PATCH v2 21/47] nfsd41: nfsd DRC logic Benny Halevy
2009-03-31 19:30       ` J. Bruce Fields
2009-04-01 19:01         ` [pnfs] " William A. (Andy) Adamson
     [not found]           ` <89c397150904011201j3cc19794x4a017d4e97bcd8f5-JsoAwUIsXosN+BqQ9rBEUg@public.gmane.org>
2009-04-01 19:10             ` J. Bruce Fields
2009-04-01 20:20               ` William A. (Andy) Adamson
2009-03-28  8:32     ` [PATCH v2 22/47] nfsd41: clear DRC cache on free_session Benny Halevy
2009-03-28  8:32     ` [PATCH v2 23/47] nfsd41: create_session operation Benny Halevy
2009-03-31 23:38       ` J. Bruce Fields
2009-04-01  1:06       ` J. Bruce Fields [this message]
2009-03-28  8:33     ` [PATCH v2 24/47] nfsd41: Add a create session replay cache Benny Halevy
2009-04-01  1:27       ` J. Bruce Fields
2009-03-28  8:33     ` [PATCH v2 25/47] nfsd41: non-page DRC for solo sequence responses Benny Halevy
2009-04-01  4:12       ` J. Bruce Fields
2009-04-01 13:15         ` [pnfs] " William A. (Andy) Adamson
2009-03-28  8:33     ` [PATCH v2 26/47] nfsd41: destroy_session operation Benny Halevy
2009-03-28  8:33     ` [PATCH v2 27/47] nfsd41: stateid handling Benny Halevy
2009-04-01  4:21       ` J. Bruce Fields
2009-03-28  8:33     ` [PATCH v2 28/47] nfsd41: check encode size for sessions maxresponse cached Benny Halevy
2009-04-01 21:54       ` J. Bruce Fields
2009-03-28  8:33     ` [PATCH v2 29/47] nfsd41: clientid handling Benny Halevy
2009-03-28  8:33     ` [PATCH v2 30/47] nfsd41: access_valid Benny Halevy
2009-03-28  8:33     ` [PATCH v2 31/47] nfsd41: add OPEN4_SHARE_ACCESS_WANT nfs4_stateid bmap Benny Halevy
2009-03-28  8:33     ` [PATCH v2 32/47] nfsd41: provide support for minor version 1 at rpc level Benny Halevy
2009-03-28  8:34     ` [PATCH v2 33/47] nfsd: cleanup nfs4.0 callback encode routines Benny Halevy
2009-03-28  8:34     ` [PATCH v2 34/47] sunrpc: add cl_private field to struct rpc_clnt Benny Halevy
2009-03-28  8:34     ` [PATCH v2 35/47] nfsd: minorversion support for the back channel Benny Halevy
2009-03-28  8:34     ` [PATCH v2 36/47] nfsd41: sunrpc: Added rpc server-side backchannel handling Benny Halevy
2009-04-01  4:35       ` J. Bruce Fields
2009-03-28  8:34     ` [PATCH v2 37/47] nfsd41: callback infrastructure Benny Halevy
2009-03-28  8:34     ` [PATCH v2 38/47] nfsd41: Remember the auth flavor to use for callbacks Benny Halevy
2009-03-28  8:34     ` [PATCH v2 39/47] nfsd41: introduce cl_cb_mutex Benny Halevy
2009-03-28  8:34     ` [PATCH v2 40/47] nfsd41: cb_sequence callback Benny Halevy
2009-04-01  4:39       ` J. Bruce Fields
2009-04-01  8:43         ` Benny Halevy
2009-04-01 22:49           ` J. Bruce Fields
2009-04-02  8:47         ` Benny Halevy
2009-04-02 18:51           ` J. Bruce Fields
2009-04-02 19:20             ` Benny Halevy
2009-04-02 19:27               ` J. Bruce Fields
2009-04-02 19:34                 ` Benny Halevy
2009-04-02 20:54                   ` J. Bruce Fields
2009-04-03  1:06                     ` Labiaga, Ricardo
     [not found]                       ` <273FE88A07F5D445824060902F70034405026F00-hX7t0kiaRRpT+ZUat5FNkAK/GNPrWCqfQQ4Iyu8u01E@public.gmane.org>
2009-04-03  2:34                         ` J. Bruce Fields
2009-04-03 21:15                           ` Labiaga, Ricardo
2009-04-02 20:32               ` Labiaga, Ricardo
2009-03-28  8:34     ` [PATCH v2 41/47] nfsd41: introduce nfs4_cb_call_sync for nfs4 and nfs41 Benny Halevy
2009-03-28  8:34     ` [PATCH v2 42/47] nfsd41: cb_recall callback Benny Halevy
2009-03-28  8:35     ` [PATCH v2 43/47] nfsd41: pass writable attrs mask to nfsd4_decode_fattr Benny Halevy
2009-03-28  8:35     ` [PATCH v2 44/47] nfsd41: support for 3-word long attribute bitmask Benny Halevy
2009-03-28  8:35     ` [PATCH v2 45/47] nfsd41: SUPPATTR_EXCLCREAT attribute Benny Halevy
2009-03-28  8:35     ` [PATCH v2 46/47] nfsd41: CREATE_EXCLUSIVE4_1 Benny Halevy
2009-03-28  8:35     ` [PATCH v2 47/47] nfsd41: Documentation/filesystems/nfs41-server.txt Benny Halevy
2009-03-28 16:37     ` [PATCH 0/47] NFSv4.1 Sessions server code for 2.6.30 J. Bruce Fields
2009-03-30 18:33     ` J. Bruce Fields
2009-03-30 18:59       ` J. Bruce Fields
2009-03-30 19:03       ` Benny Halevy
2009-03-30 19:07         ` J. Bruce Fields
2009-03-30 19:38           ` Benny Halevy
2009-03-30 21:15             ` J. Bruce Fields
2009-03-31  7:04               ` Benny Halevy
2009-03-31  1:27         ` Labiaga, Ricardo
2009-03-28  1:17 ` J. Bruce Fields
2009-03-28 18:32   ` Benny Halevy
2009-03-28 18:33     ` [PATCH 1/2] SQUASHME: nfsd41: do not verify nfserr_sequence_pos for minorversion 0 Benny Halevy
2009-03-28 18:33     ` [PATCH 2/2] nfsd: dynamically skip encoded fattr bitmap in _nfsd4_verify Benny Halevy

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=20090401010654.GE26583@fieldses.org \
    --to=bfields@fieldses.org \
    --cc=bhalevy@panasas.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.