| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * Request reply cache. This was heavily inspired by the | 
					
						
							|  |  |  |  * implementation in 4.3BSD/4.4BSD. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de> | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #ifndef NFSCACHE_H
 | 
					
						
							|  |  |  | #define NFSCACHE_H
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-12-03 20:28:59 +02:00
										 |  |  | #include <linux/sunrpc/svc.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2009-04-01 07:28:13 +11:00
										 |  |  |  * Representation of a reply cache entry. | 
					
						
							| 
									
										
										
										
											2013-01-28 14:41:07 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Note that we use a sockaddr_in6 to hold the address instead of the more | 
					
						
							|  |  |  |  * typical sockaddr_storage. This is for space reasons, since sockaddr_storage | 
					
						
							|  |  |  |  * is much larger than a sockaddr_in6. | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  */ | 
					
						
							|  |  |  | struct svc_cacherep { | 
					
						
							|  |  |  | 	struct hlist_node	c_hash; | 
					
						
							|  |  |  | 	struct list_head	c_lru; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	unsigned char		c_state,	/* unused, inprog, done */ | 
					
						
							|  |  |  | 				c_type,		/* status, buffer */ | 
					
						
							|  |  |  | 				c_secure : 1;	/* req came from port < 1024 */ | 
					
						
							| 
									
										
										
										
											2013-01-28 14:41:07 -05:00
										 |  |  | 	struct sockaddr_in6	c_addr; | 
					
						
							| 
									
										
										
										
											2006-10-19 23:29:02 -07:00
										 |  |  | 	__be32			c_xid; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	u32			c_prot; | 
					
						
							|  |  |  | 	u32			c_proc; | 
					
						
							|  |  |  | 	u32			c_vers; | 
					
						
							| 
									
										
										
										
											2013-02-04 11:57:27 -05:00
										 |  |  | 	unsigned int		c_len; | 
					
						
							|  |  |  | 	__wsum			c_csum; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	unsigned long		c_timestamp; | 
					
						
							|  |  |  | 	union { | 
					
						
							|  |  |  | 		struct kvec	u_vec; | 
					
						
							| 
									
										
										
										
											2006-10-19 23:29:02 -07:00
										 |  |  | 		__be32		u_status; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	}			c_u; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define c_replvec		c_u.u_vec
 | 
					
						
							|  |  |  | #define c_replstat		c_u.u_status
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* cache entry states */ | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  | 	RC_UNUSED, | 
					
						
							|  |  |  | 	RC_INPROG, | 
					
						
							|  |  |  | 	RC_DONE | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* return values */ | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  | 	RC_DROPIT, | 
					
						
							|  |  |  | 	RC_REPLY, | 
					
						
							| 
									
										
										
										
											2013-01-28 14:41:09 -05:00
										 |  |  | 	RC_DOIT | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * Cache types. | 
					
						
							|  |  |  |  * We may want to add more types one day, e.g. for diropres and | 
					
						
							|  |  |  |  * attrstat replies. Using cache entries with fixed length instead | 
					
						
							|  |  |  |  * of buffer pointers may be more efficient. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | enum { | 
					
						
							|  |  |  | 	RC_NOCACHE, | 
					
						
							|  |  |  | 	RC_REPLSTAT, | 
					
						
							|  |  |  | 	RC_REPLBUFF, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  |  * If requests are retransmitted within this interval, they're dropped. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | #define RC_DELAY		(HZ/5)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 14:41:13 -05:00
										 |  |  | /* Cache entries expire after this time period */ | 
					
						
							|  |  |  | #define RC_EXPIRE		(120 * HZ)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-04 11:57:27 -05:00
										 |  |  | /* Checksum this amount of the request */ | 
					
						
							|  |  |  | #define RC_CSUMLEN		(256U)
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-11-09 14:10:56 -05:00
										 |  |  | int	nfsd_reply_cache_init(void); | 
					
						
							|  |  |  | void	nfsd_reply_cache_shutdown(void); | 
					
						
							| 
									
										
										
										
											2011-01-24 12:11:02 -05:00
										 |  |  | int	nfsd_cache_lookup(struct svc_rqst *); | 
					
						
							| 
									
										
										
										
											2006-10-19 23:29:02 -07:00
										 |  |  | void	nfsd_cache_update(struct svc_rqst *, int, __be32 *); | 
					
						
							| 
									
										
										
										
											2009-04-06 12:00:49 +03:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef CONFIG_NFSD_V4
 | 
					
						
							| 
									
										
										
										
											2009-04-03 08:28:15 +03:00
										 |  |  | void	nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp); | 
					
						
							| 
									
										
										
										
											2009-04-06 12:00:49 +03:00
										 |  |  | #else  /* CONFIG_NFSD_V4 */
 | 
					
						
							|  |  |  | static inline void nfsd4_set_statp(struct svc_rqst *rqstp, __be32 *statp) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif /* CONFIG_NFSD_V4 */
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | #endif /* NFSCACHE_H */
 |