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 19/47] nfsd41: DRC save, restore, and clear functions
Date: Tue, 31 Mar 2009 19:03:05 -0400	[thread overview]
Message-ID: <20090331230305.GA23198@fieldses.org> (raw)
In-Reply-To: <1238229152-10860-1-git-send-email-bhalevy@panasas.com>

This one scares me.

On Sat, Mar 28, 2009 at 11:32:32AM +0300, Benny Halevy wrote:
> From: Andy Adamson <andros@netapp.com>
> 
> Cache all the result pages, including the rpc header in rq_respages[0],
> for a request in the slot table cache entry.
> 
> Cache the statp pointer from nfsd_dispatch which points into rq_respages[0]
> just past the rpc header. When setting a cache entry, calculate and save the
> length of the nfs data minus the rpc header for rq_respages[0].
> 
> When replaying a cache entry, replace the cached rpc header with the
> replayed request rpc result header, unless there is not enough room in the
> cached results first page. In that case, use the cached rpc header.
> 
> The sessions fore channel maxresponse size cached is set to NFSD_PAGES_PER_SLOT
> * PAGE_SIZE. For compounds we are cacheing with operations such as READDIR
> that use the xdr_buf->pages to hold data, we choose to cache the extra page of
> data rather than copying data from xdr_buf->pages into the xdr_buf->head page.
> 
> [nfsd41: limit cache to maxresponsesize_cached]
> Signed-off-by: Andy Adamson <andros@netapp.com>
> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
> [nfsd41: mv nfsd4_set_statp under CONFIG_NFSD_V4_1]
> Signed-off-by: Andy Adamson <andros@netapp.com>
> Signed-off-by: Benny Halevy <bhalevy@panasas.com>
> ---
>  fs/nfsd/nfs4state.c        |  142 ++++++++++++++++++++++++++++++++++++++++++++
>  fs/nfsd/nfssvc.c           |    4 +
>  include/linux/nfsd/cache.h |    5 ++
>  include/linux/nfsd/state.h |   13 ++++
>  include/linux/nfsd/xdr4.h  |    4 +
>  5 files changed, 168 insertions(+), 0 deletions(-)
> 
> diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c
> index 10eb67b..f0ce639 100644
> --- a/fs/nfsd/nfs4state.c
> +++ b/fs/nfsd/nfs4state.c
> @@ -860,6 +860,148 @@ out_err:
>  }
>  
>  #if defined(CONFIG_NFSD_V4_1)
> +void
> +nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp)
> +{
> +	struct nfsd4_compoundres *resp = rqstp->rq_resp;
> +
> +	resp->cstate.statp = statp;
> +}
> +
> +/*
> + * Dereference the result pages.
> + */
> +static void
> +nfsd4_release_respages(struct page **respages, short resused)
> +{
> +	int page_no;
> +
> +	dprintk("--> %s\n", __func__);
> +	for (page_no = 0; page_no < resused; page_no++) {
> +		if (!respages[page_no])
> +			continue;
> +		put_page(respages[page_no]);
> +		respages[page_no] = NULL;
> +	}
> +}
> +
> +static void
> +nfsd4_move_pages(struct page **topages, struct page **frompages, short count)

s/move/copy/; we're not removing anything from the source.

> +{
> +	int page_no;

As a general matter of style, I'd rather any loop variable in a function
this short and simple be named "i".  "j" if you need another....

> +
> +	for (page_no = 0; page_no < count; page_no++) {
> +		topages[page_no] = frompages[page_no];
> +		if (!topages[page_no])
> +			continue;
> +		get_page(topages[page_no]);
> +	}
> +}
> +
> +/*
> + * Cache the reply pages up to NFSD_PAGES_PER_SLOT + 1, clearing the previous
> + * pages. We add a page to NFSD_PAGES_PER_SLOT for the case where the total
> + * length of the XDR response is less than se_fmaxresp_cached
> + * (NFSD_PAGES_PER_SLOT * PAGE_SIZE) but the xdr_buf pages is used for a
> + * of the reply (e.g. readdir).

That comment isn't very clear.

Is one page really sufficient?  Consider, for example, a 2-byte read
which spans a page boundary:

	first page: rpc header, compound header, putfh reply, etc.
	second page: 1st byte of read data
	third page: 2nd byte of read data
	fourth page: 2 bytes of padding, rest of reply.

That's for a reply of total length less than a page.

> + *
> + * Store the base and length of the rq_req.head[0] page
> + * of the NFSv4.1 data, just past the rpc header.
> + */
> +void
> +nfsd4_set_cache_entry(struct nfsd4_compoundres *resp)

I find "set" a little vague.  How about "store"?

> +{
> +	struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
> +	struct svc_rqst *rqstp = resp->rqstp;
> +	struct kvec *resv = &rqstp->rq_res.head[0];
> +
> +	dprintk("--> %s entry %p\n", __func__, entry);
> +
> +	/* Don't cache a failed OP_SEQUENCE */
> +	if (resp->opcnt == 1 && resp->cstate.status)
> +		return;
> +	nfsd4_release_respages(entry->ce_respages, entry->ce_resused);
> +	entry->ce_resused = rqstp->rq_resused;
> +	if (entry->ce_resused > NFSD_PAGES_PER_SLOT + 1)
> +		entry->ce_resused = NFSD_PAGES_PER_SLOT + 1;
> +	nfsd4_move_pages(entry->ce_respages, rqstp->rq_respages,
> +			 entry->ce_resused);
> +	entry->ce_status = resp->cstate.status;

Don't we need to track rq_res.page_base, page_len, etc.?  Try testing
replays of small unaligned reads.

> +	entry->ce_datav.iov_base = resp->cstate.statp;
> +	entry->ce_datav.iov_len = resv->iov_len - ((char *)resp->cstate.statp -
> +				(char *)page_address(rqstp->rq_respages[0]));
> +	entry->ce_opcnt = resp->opcnt;

Why do we need to save and restore the number of operations?

In general--I'd rather functions and data structures got introduced in
the same patch as their users; they're harder to judge on their own.

> +	/* Current request rpc header length*/
> +	entry->ce_rpchdrlen = (char *)resp->cstate.statp -
> +				(char *)page_address(rqstp->rq_respages[0]);

I don't believe we need to save ce_rpchdrlen.

> +}
> +
> +/*
> + * Copy the cached NFSv4.1 reply skipping the cached rpc header into the
> + * replay result res.head[0] past the rpc header to end up with replay
> + * rpc header and cached NFSv4.1 reply.

This comment could be clearer; how about just:

	We keep the rpc header, but take the nfs reply from the reply
	cache.

?

> + */
> +static int
> +nfsd41_copy_replay_data(struct nfsd4_compoundres *resp,
> +			struct nfsd4_cache_entry *entry)
> +{
> +	struct svc_rqst *rqstp = resp->rqstp;
> +	struct kvec *resv = &resp->rqstp->rq_res.head[0];
> +	int len;
> +
> +	/* Current request rpc header length*/
> +	len = (char *)resp->cstate.statp -
> +			(char *)page_address(rqstp->rq_respages[0]);

Could write just resv->iov_base for for the second term there, I
beleive.

> +	if (entry->ce_datav.iov_len + len > PAGE_SIZE) {

This should depend on NFSD_MAX_PAGES_PER_SLOT, or something--we
shouldn't be hard-wiring the assumption that the maximum cached reply
size is PAGE_SIZE.

> +		dprintk("%s v41 cached reply too large (%Zd).\n", __func__,
> +			entry->ce_datav.iov_len);
> +		return 0;
> +	}
> +	/* copy the cached reply nfsd data past the current rpc header */
> +	memcpy((char *)resv->iov_base + len, entry->ce_datav.iov_base,

That first argument could just be resp->cstate.statp.

> +		entry->ce_datav.iov_len);
> +	resv->iov_len = len + entry->ce_datav.iov_len;
> +	return 1;
> +}
> +
> +/*
> + * Keep the first page of the replay. Copy the NFSv4.1 data from the first
> + * cached page.  Replace any futher replay pages from the cache.
> + */
> +__be32
> +nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp)
> +{
> +	struct nfsd4_cache_entry *entry = &resp->cstate.slot->sl_cache_entry;
> +	__be32 status;
> +
> +	dprintk("--> %s entry %p\n", __func__, entry);
> +
> +
> +	if (!nfsd41_copy_replay_data(resp, entry)) {
> +		/*
> +		 * Not enough room to use the replay rpc header, send the
> +		 * cached header. Release all the allocated result pages.
> +		 */

No, we can't do this.  The protocol requires that we use the rpc header
from the replay.

--b.

> +		svc_free_res_pages(resp->rqstp);
> +		nfsd4_move_pages(resp->rqstp->rq_respages, entry->ce_respages,
> +			entry->ce_resused);
> +	} else {
> +		/* Release all but the first allocated result page */
> +
> +		resp->rqstp->rq_resused--;
> +		svc_free_res_pages(resp->rqstp);
> +
> +		nfsd4_move_pages(&resp->rqstp->rq_respages[1],
> +				 &entry->ce_respages[1],
> +				 entry->ce_resused - 1);
> +	}
> +
> +	resp->rqstp->rq_resused = entry->ce_resused;
> +	status = entry->ce_status;
> +
> +	return status;
> +}
> +
>  /*
>   * Set the exchange_id flags returned by the server.
>   */
> diff --git a/fs/nfsd/nfssvc.c b/fs/nfsd/nfssvc.c
> index ef0a368..b5168d1 100644
> --- a/fs/nfsd/nfssvc.c
> +++ b/fs/nfsd/nfssvc.c
> @@ -515,6 +515,10 @@ nfsd_dispatch(struct svc_rqst *rqstp, __be32 *statp)
>  		+ rqstp->rq_res.head[0].iov_len;
>  	rqstp->rq_res.head[0].iov_len += sizeof(__be32);
>  
> +	/* NFSv4.1 DRC requires statp */
> +	if (rqstp->rq_vers == 4)
> +		nfsd4_set_statp(rqstp, statp);
> +
>  	/* Now call the procedure handler, and encode NFS status. */
>  	nfserr = proc->pc_func(rqstp, rqstp->rq_argp, rqstp->rq_resp);
>  	nfserr = map_new_errors(rqstp->rq_vers, nfserr);
> diff --git a/include/linux/nfsd/cache.h b/include/linux/nfsd/cache.h
> index 04b355c..57a83c7 100644
> --- a/include/linux/nfsd/cache.h
> +++ b/include/linux/nfsd/cache.h
> @@ -75,5 +75,10 @@ int	nfsd_reply_cache_init(void);
>  void	nfsd_reply_cache_shutdown(void);
>  int	nfsd_cache_lookup(struct svc_rqst *, int);
>  void	nfsd_cache_update(struct svc_rqst *, int, __be32 *);
> +#ifdef CONFIG_NFSD_V4_1
> +void	nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp);
> +#else /* CONFIG_NFSD_V4_1 */
> +static inline void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp) {}
> +#endif /* CONFIG_NFSD_V4_1 */
>  
>  #endif /* NFSCACHE_H */
> diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
> index feab6ec..8ca6a82 100644
> --- a/include/linux/nfsd/state.h
> +++ b/include/linux/nfsd/state.h
> @@ -99,10 +99,23 @@ struct nfs4_callback {
>  	struct rpc_clnt *       cb_client;
>  };
>  
> +/* Maximum number of pages per slot cache entry */
> +#define NFSD_PAGES_PER_SLOT	1
> +
> +struct nfsd4_cache_entry {
> +	__be32		ce_status;
> +	struct kvec	ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */
> +	struct page	*ce_respages[NFSD_PAGES_PER_SLOT + 1];
> +	short		ce_resused;
> +	int		ce_opcnt;
> +	int		ce_rpchdrlen;
> +};
> +
>  struct nfsd4_slot {
>  	bool				sl_inuse;
>  	struct nfsd4_session		*sl_session;
>  	u32				sl_seqid;
> +	struct nfsd4_cache_entry	sl_cache_entry;
>  };
>  
>  struct nfsd4_session {
> diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
> index 9e4d8db..cde8947 100644
> --- a/include/linux/nfsd/xdr4.h
> +++ b/include/linux/nfsd/xdr4.h
> @@ -50,6 +50,8 @@ struct nfsd4_compound_state {
>  	struct nfs4_stateowner	*replay_owner;
>  	/* For sessions DRC */
>  	struct nfsd4_slot	*slot;
> +	__be32			*statp;
> +	u32			status;
>  };
>  
>  struct nfsd4_change_info {
> @@ -490,6 +492,8 @@ extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
>  		struct nfsd4_compound_state *,
>  		struct nfsd4_setclientid_confirm *setclientid_confirm);
>  #if defined(CONFIG_NFSD_V4_1)
> +extern void nfsd4_set_cache_entry(struct nfsd4_compoundres *resp);
> +extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp);
>  extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp,
>  		struct nfsd4_compound_state *,
>  struct nfsd4_exchange_id *);
> -- 
> 1.6.2.1
> 

  reply	other threads:[~2009-03-31 23:03 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 [this message]
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
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=20090331230305.GA23198@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.