1 /* 2 * Request reply cache. This was heavily inspired by the 3 * implementation in 4.3BSD/4.4BSD. 4 * 5 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de> 6 */ 7 8 #ifndef NFSCACHE_H 9 #define NFSCACHE_H 10 11 #include <linux/sunrpc/svc.h> 12 13 /* 14 * Representation of a reply cache entry. 15 */ 16 struct svc_cacherep { 17 struct hlist_node c_hash; 18 struct list_head c_lru; 19 20 unsigned char c_state, /* unused, inprog, done */ 21 c_type, /* status, buffer */ 22 c_secure : 1; /* req came from port < 1024 */ 23 struct sockaddr_in c_addr; 24 __be32 c_xid; 25 u32 c_prot; 26 u32 c_proc; 27 u32 c_vers; 28 unsigned long c_timestamp; 29 union { 30 struct kvec u_vec; 31 __be32 u_status; 32 } c_u; 33 }; 34 35 #define c_replvec c_u.u_vec 36 #define c_replstat c_u.u_status 37 38 /* cache entry states */ 39 enum { 40 RC_UNUSED, 41 RC_INPROG, 42 RC_DONE 43 }; 44 45 /* return values */ 46 enum { 47 RC_DROPIT, 48 RC_REPLY, 49 RC_DOIT, 50 RC_INTR 51 }; 52 53 /* 54 * Cache types. 55 * We may want to add more types one day, e.g. for diropres and 56 * attrstat replies. Using cache entries with fixed length instead 57 * of buffer pointers may be more efficient. 58 */ 59 enum { 60 RC_NOCACHE, 61 RC_REPLSTAT, 62 RC_REPLBUFF, 63 }; 64 65 /* 66 * If requests are retransmitted within this interval, they're dropped. 67 */ 68 #define RC_DELAY (HZ/5) 69 70 int nfsd_reply_cache_init(void); 71 void nfsd_reply_cache_shutdown(void); 72 int nfsd_cache_lookup(struct svc_rqst *); 73 void nfsd_cache_update(struct svc_rqst *, int, __be32 *); 74 75 #ifdef CONFIG_NFSD_V4 76 void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp); 77 #else /* CONFIG_NFSD_V4 */ 78 static inline void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp) 79 { 80 } 81 #endif /* CONFIG_NFSD_V4 */ 82 83 #endif /* NFSCACHE_H */ 84