diff options
author | Andy Adamson <andros@netapp.com> | 2009-04-03 01:28:35 -0400 |
---|---|---|
committer | J. Bruce Fields <bfields@citi.umich.edu> | 2009-04-03 20:41:19 -0400 |
commit | bf864a31d50e3e94d6e76537b97d664913906ff8 (patch) | |
tree | 8de829d0cdc0c88fe523fc4a288b8e16eedc6a2e /include/linux | |
parent | 38eb76a54d803e6792816623651b1a9cb85f8d01 (diff) |
nfsd41: non-page DRC for solo sequence responses
A session inactivity time compound (lease renewal) or a compound where the
sequence operation has sa_cachethis set to FALSE do not require any pages
to be held in the v4.1 DRC. This is because struct nfsd4_slot is already
caching the session information.
Add logic to the nfs41 server to not cache response pages for solo sequence
responses.
Return nfserr_replay_uncached_rep on the operation following the sequence
operation when sa_cachethis is FALSE.
Signed-off-by: Andy Adamson <andros@netapp.com>
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[nfsd41: use cstate session in nfsd4_replay_cache_entry]
[nfsd41: rename nfsd4_no_page_in_cache]
[nfsd41 rename nfsd4_enc_no_page_replay]
[nfsd41 nfsd4_is_solo_sequence]
[nfsd41 change nfsd4_not_cached return]
Signed-off-by: Andy Adamson <andros@netapp.com>
[changed return type to bool]
Signed-off-by: Benny Halevy <bhalevy@panasas.com>
[nfsd41 drop parens in nfsd4_is_solo_sequence call]
Signed-off-by: Andy Adamson <andros@netapp.com>
[changed "== 0" to "!"]
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/state.h | 1 | ||||
-rw-r--r-- | include/linux/nfsd/xdr4.h | 15 |
2 files changed, 15 insertions, 1 deletions
diff --git a/include/linux/nfsd/state.h b/include/linux/nfsd/state.h index f063df7ad134..18dcffa57f77 100644 --- a/include/linux/nfsd/state.h +++ b/include/linux/nfsd/state.h | |||
@@ -110,6 +110,7 @@ struct nfsd4_cache_entry { | |||
110 | __be32 ce_status; | 110 | __be32 ce_status; |
111 | struct kvec ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */ | 111 | struct kvec ce_datav; /* encoded NFSv4.1 data in rq_res.head[0] */ |
112 | struct page *ce_respages[NFSD_PAGES_PER_SLOT + 1]; | 112 | struct page *ce_respages[NFSD_PAGES_PER_SLOT + 1]; |
113 | int ce_cachethis; | ||
113 | short ce_resused; | 114 | short ce_resused; |
114 | int ce_opcnt; | 115 | int ce_opcnt; |
115 | int ce_rpchdrlen; | 116 | int ce_rpchdrlen; |
diff --git a/include/linux/nfsd/xdr4.h b/include/linux/nfsd/xdr4.h index 9468829adb70..486188810a60 100644 --- a/include/linux/nfsd/xdr4.h +++ b/include/linux/nfsd/xdr4.h | |||
@@ -480,6 +480,18 @@ struct nfsd4_compoundres { | |||
480 | struct nfsd4_compound_state cstate; | 480 | struct nfsd4_compound_state cstate; |
481 | }; | 481 | }; |
482 | 482 | ||
483 | static inline bool nfsd4_is_solo_sequence(struct nfsd4_compoundres *resp) | ||
484 | { | ||
485 | struct nfsd4_compoundargs *args = resp->rqstp->rq_argp; | ||
486 | return args->opcnt == 1; | ||
487 | } | ||
488 | |||
489 | static inline bool nfsd4_not_cached(struct nfsd4_compoundres *resp) | ||
490 | { | ||
491 | return !resp->cstate.slot->sl_cache_entry.ce_cachethis || | ||
492 | nfsd4_is_solo_sequence(resp); | ||
493 | } | ||
494 | |||
483 | #define NFS4_SVC_XDRSIZE sizeof(struct nfsd4_compoundargs) | 495 | #define NFS4_SVC_XDRSIZE sizeof(struct nfsd4_compoundargs) |
484 | 496 | ||
485 | static inline void | 497 | static inline void |
@@ -510,7 +522,8 @@ extern __be32 nfsd4_setclientid_confirm(struct svc_rqst *rqstp, | |||
510 | struct nfsd4_compound_state *, | 522 | struct nfsd4_compound_state *, |
511 | struct nfsd4_setclientid_confirm *setclientid_confirm); | 523 | struct nfsd4_setclientid_confirm *setclientid_confirm); |
512 | extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp); | 524 | extern void nfsd4_store_cache_entry(struct nfsd4_compoundres *resp); |
513 | extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp); | 525 | extern __be32 nfsd4_replay_cache_entry(struct nfsd4_compoundres *resp, |
526 | struct nfsd4_sequence *seq); | ||
514 | extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp, | 527 | extern __be32 nfsd4_exchange_id(struct svc_rqst *rqstp, |
515 | struct nfsd4_compound_state *, | 528 | struct nfsd4_compound_state *, |
516 | struct nfsd4_exchange_id *); | 529 | struct nfsd4_exchange_id *); |