1  /* SPDX-License-Identifier: GPL-2.0 */
2  /*
3   * Request reply cache. This was heavily inspired by the
4   * implementation in 4.3BSD/4.4BSD.
5   *
6   * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
7   */
8  
9  #ifndef NFSCACHE_H
10  #define NFSCACHE_H
11  
12  #include <linux/sunrpc/svc.h>
13  #include "nfsd.h"
14  
15  /*
16   * Representation of a reply cache entry.
17   *
18   * Note that we use a sockaddr_in6 to hold the address instead of the more
19   * typical sockaddr_storage. This is for space reasons, since sockaddr_storage
20   * is much larger than a sockaddr_in6.
21   */
22  struct nfsd_cacherep {
23  	struct {
24  		/* Keep often-read xid, csum in the same cache line: */
25  		__be32			k_xid;
26  		__wsum			k_csum;
27  		u32			k_proc;
28  		u32			k_prot;
29  		u32			k_vers;
30  		unsigned int		k_len;
31  		struct sockaddr_in6	k_addr;
32  	} c_key;
33  
34  	struct rb_node		c_node;
35  	struct list_head	c_lru;
36  	unsigned char		c_state,	/* unused, inprog, done */
37  				c_type,		/* status, buffer */
38  				c_secure : 1;	/* req came from port < 1024 */
39  	unsigned long		c_timestamp;
40  	union {
41  		struct kvec	u_vec;
42  		__be32		u_status;
43  	}			c_u;
44  };
45  
46  #define c_replvec		c_u.u_vec
47  #define c_replstat		c_u.u_status
48  
49  /* cache entry states */
50  enum {
51  	RC_UNUSED,
52  	RC_INPROG,
53  	RC_DONE
54  };
55  
56  /* return values */
57  enum {
58  	RC_DROPIT,
59  	RC_REPLY,
60  	RC_DOIT
61  };
62  
63  /*
64   * Cache types.
65   * We may want to add more types one day, e.g. for diropres and
66   * attrstat replies. Using cache entries with fixed length instead
67   * of buffer pointers may be more efficient.
68   */
69  enum {
70  	RC_NOCACHE,
71  	RC_REPLSTAT,
72  	RC_REPLBUFF,
73  };
74  
75  /* Cache entries expire after this time period */
76  #define RC_EXPIRE		(120 * HZ)
77  
78  /* Checksum this amount of the request */
79  #define RC_CSUMLEN		(256U)
80  
81  int	nfsd_drc_slab_create(void);
82  void	nfsd_drc_slab_free(void);
83  int	nfsd_reply_cache_init(struct nfsd_net *);
84  void	nfsd_reply_cache_shutdown(struct nfsd_net *);
85  int	nfsd_cache_lookup(struct svc_rqst *rqstp, unsigned int start,
86  			  unsigned int len, struct nfsd_cacherep **cacherep);
87  void	nfsd_cache_update(struct svc_rqst *rqstp, struct nfsd_cacherep *rp,
88  			  int cachetype, __be32 *statp);
89  int	nfsd_reply_cache_stats_show(struct seq_file *m, void *v);
90  
91  #endif /* NFSCACHE_H */
92