aboutsummaryrefslogtreecommitdiffstats
path: root/include/linux
diff options
context:
space:
mode:
authorAndy Adamson <andros@netapp.com>2009-04-03 01:28:15 -0400
committerJ. Bruce Fields <bfields@citi.umich.edu>2009-04-03 20:41:17 -0400
commit074fe897536f095309c5aaffcf912952882ab2cb (patch)
treed4bb2fff645a2df1dbdec4af6787359d888a3695 /include/linux
parentf9bb94c4c60f6e1d1717077bfddb614f03a607d1 (diff)
nfsd41: DRC save, restore, and clear functions
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] [nfsd41: mv nfsd4_set_statp under CONFIG_NFSD_V4_1] [nfsd41: rename nfsd4_move_pages] [nfsd41: rename page_no variable] [nfsd41: rename nfsd4_set_cache_entry] [nfsd41: fix nfsd41_copy_replay_data comment] [nfsd41: add to nfsd4_set_cache_entry] Signed-off-by: Andy Adamson <andros@netapp.com> Signed-off-by: Benny Halevy <bhalevy@panasas.com> Signed-off-by: J. Bruce Fields <bfields@citi.umich.edu>
Diffstat (limited to 'include/linux')
-rw-r--r--include/linux/nfsd/cache.h1
-rw-r--r--include/linux/nfsd/state.h13
-rw-r--r--include/linux/nfsd/xdr4.h4
3 files changed, 18 insertions, 0 deletions
diff --git a/include/linux/nfsd/cache.h b/include/linux/nfsd/cache.h
index 04b355c801d8..a59a2df6d079 100644
--- a/include/linux/nfsd/cache.h
+++ b/include/linux/nfsd/cache.h
@@ -75,5 +75,6 @@ int nfsd_reply_cache_init(void);
75void nfsd_reply_cache_shutdown(void); 75void nfsd_reply_cache_shutdown(void);
76int nfsd_cache_lookup(struct svc_rqst *, int); 76int nfsd_cache_lookup(struct svc_rqst *, int);
77void nfsd_cache_update(struct svc_rqst *, int, __be32 *); 77void nfsd_cache_update(struct svc_rqst *, int, __be32 *);
78void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp);
78 79
79#endif /* NFSCACHE_H */ 80#endif /* NFSCACHE_H */
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h
index 90829db76861..f1edb1d98523 100644
--- a/include/linux/nfsd/state.h
+++ b/include/linux/nfsd/state.h
@@ -99,9 +99,22 @@ struct nfs4_callback {
99 struct rpc_clnt * cb_client; 99 struct rpc_clnt * cb_client;
100}; 100};
101 101
102/* Maximum number of pages per slot cache entry */
103#define NFSD_PAGES_PER_SLOT 1
104
105struct nfsd4_cache_entry {
106 __be32 ce_status;
107 struct kvec ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */
108 struct page *ce_respages[NFSD_PAGES_PER_SLOT + 1];
109 short ce_resused;
110 int ce_opcnt;
111 int ce_rpchdrlen;
112};
113
102struct nfsd4_slot { 114struct nfsd4_slot {
103 bool sl_inuse; 115 bool sl_inuse;
104 u32 sl_seqid; 116 u32 sl_seqid;
117 struct nfsd4_cache_entry sl_cache_entry;
105}; 118};
106 119
107struct nfsd4_session { 120struct nfsd4_session {
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h
index 6e28a041008d..d091684325af 100644
--- a/include/linux/nfsd/xdr4.h
+++ b/include/linux/nfsd/xdr4.h
@@ -51,6 +51,8 @@ struct nfsd4_compound_state {
51 /* For sessions DRC */ 51 /* For sessions DRC */
52 struct nfsd4_session *session; 52 struct nfsd4_session *session;
53 struct nfsd4_slot *slot; 53 struct nfsd4_slot *slot;
54 __be32 *statp;
55 u32 status;
54}; 56};
55 57
56struct nfsd4_change_info { 58struct nfsd4_change_info {
@@ -487,6 +489,8 @@ extern __be32 nfsd4_setclientid(struct svc_rqst *rqstp,
487extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp, 489extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp,
488 struct nfsd4_compound_state *, 490 struct nfsd4_compound_state *,
489 struct nfsd4_setclientid_confirm *setclientid_confirm); 491 struct nfsd4_setclientid_confirm *setclientid_confirm);
492extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp);
493extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp);
490extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp, 494extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp,
491 struct nfsd4_compound_state *, 495 struct nfsd4_compound_state *,
492struct nfsd4_exchange_id *); 496struct nfsd4_exchange_id *);