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, unsigned int start, 88 unsigned int len, 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