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 "netns.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_net_reply_cache_init(struct nfsd_net *nn); |
84 | void nfsd_net_reply_cache_destroy(struct nfsd_net *nn); |
85 | int nfsd_reply_cache_init(struct nfsd_net *); |
86 | void nfsd_reply_cache_shutdown(struct nfsd_net *); |
87 | int nfsd_cache_lookup(struct svc_rqst *rqstp, |
88 | struct nfsd_cacherep **cacherep); |
89 | void nfsd_cache_update(struct svc_rqst *rqstp, struct nfsd_cacherep *rp, |
90 | int cachetype, __be32 *statp); |
91 | int nfsd_reply_cache_stats_show(struct seq_file *m, void *v); |
92 | |
93 | #endif /* NFSCACHE_H */ |
94 | |