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