xref: /openbmc/linux/fs/nfsd/netns.h (revision d5a9588c)
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /*
3  * per net namespace data structures for nfsd
4  *
5  * Copyright (C) 2012, Jeff Layton <jlayton@redhat.com>
6  */
7 
8 #ifndef __NFSD_NETNS_H__
9 #define __NFSD_NETNS_H__
10 
11 #include <net/net_namespace.h>
12 #include <net/netns/generic.h>
13 #include <linux/filelock.h>
14 #include <linux/nfs4.h>
15 #include <linux/percpu_counter.h>
16 #include <linux/siphash.h>
17 #include <linux/sunrpc/stats.h>
18 
19 /* Hash tables for nfs4_clientid state */
20 #define CLIENT_HASH_BITS                 4
21 #define CLIENT_HASH_SIZE                (1 << CLIENT_HASH_BITS)
22 #define CLIENT_HASH_MASK                (CLIENT_HASH_SIZE - 1)
23 
24 #define SESSION_HASH_SIZE	512
25 
26 struct cld_net;
27 struct nfsd4_client_tracking_ops;
28 
29 enum {
30 	/* cache misses due only to checksum comparison failures */
31 	NFSD_STATS_PAYLOAD_MISSES,
32 	/* amount of memory (in bytes) currently consumed by the DRC */
33 	NFSD_STATS_DRC_MEM_USAGE,
34 	NFSD_STATS_RC_HITS,		/* repcache hits */
35 	NFSD_STATS_RC_MISSES,		/* repcache misses */
36 	NFSD_STATS_RC_NOCACHE,		/* uncached reqs */
37 	NFSD_STATS_FH_STALE,		/* FH stale error */
38 	NFSD_STATS_IO_READ,		/* bytes returned to read requests */
39 	NFSD_STATS_IO_WRITE,		/* bytes passed in write requests */
40 #ifdef CONFIG_NFSD_V4
41 	NFSD_STATS_FIRST_NFS4_OP,	/* count of individual nfsv4 operations */
42 	NFSD_STATS_LAST_NFS4_OP = NFSD_STATS_FIRST_NFS4_OP + LAST_NFS4_OP,
43 #define NFSD_STATS_NFS4_OP(op)	(NFSD_STATS_FIRST_NFS4_OP + (op))
44 	NFSD_STATS_WDELEG_GETATTR,	/* count of getattr conflict with wdeleg */
45 #endif
46 	NFSD_STATS_COUNTERS_NUM
47 };
48 
49 /*
50  * Represents a nfsd "container". With respect to nfsv4 state tracking, the
51  * fields of interest are the *_id_hashtbls and the *_name_tree. These track
52  * the nfs4_client objects by either short or long form clientid.
53  *
54  * Each nfsd_net runs a nfs4_laundromat workqueue job when necessary to clean
55  * up expired clients and delegations within the container.
56  */
57 struct nfsd_net {
58 	struct cld_net *cld_net;
59 
60 	struct cache_detail *svc_expkey_cache;
61 	struct cache_detail *svc_export_cache;
62 
63 	struct cache_detail *idtoname_cache;
64 	struct cache_detail *nametoid_cache;
65 
66 	struct lock_manager nfsd4_manager;
67 	bool grace_ended;
68 	time64_t boot_time;
69 
70 	struct dentry *nfsd_client_dir;
71 
72 	/*
73 	 * reclaim_str_hashtbl[] holds known client info from previous reset/reboot
74 	 * used in reboot/reset lease grace period processing
75 	 *
76 	 * conf_id_hashtbl[], and conf_name_tree hold confirmed
77 	 * setclientid_confirmed info.
78 	 *
79 	 * unconf_str_hastbl[] and unconf_name_tree hold unconfirmed
80 	 * setclientid info.
81 	 */
82 	struct list_head *reclaim_str_hashtbl;
83 	int reclaim_str_hashtbl_size;
84 	struct list_head *conf_id_hashtbl;
85 	struct rb_root conf_name_tree;
86 	struct list_head *unconf_id_hashtbl;
87 	struct rb_root unconf_name_tree;
88 	struct list_head *sessionid_hashtbl;
89 	/*
90 	 * client_lru holds client queue ordered by nfs4_client.cl_time
91 	 * for lease renewal.
92 	 *
93 	 * close_lru holds (open) stateowner queue ordered by nfs4_stateowner.so_time
94 	 * for last close replay.
95 	 *
96 	 * All of the above fields are protected by the client_mutex.
97 	 */
98 	struct list_head client_lru;
99 	struct list_head close_lru;
100 	struct list_head del_recall_lru;
101 
102 	/* protected by blocked_locks_lock */
103 	struct list_head blocked_locks_lru;
104 
105 	struct delayed_work laundromat_work;
106 
107 	/* client_lock protects the client lru list and session hash table */
108 	spinlock_t client_lock;
109 
110 	/* protects blocked_locks_lru */
111 	spinlock_t blocked_locks_lock;
112 
113 	struct file *rec_file;
114 	bool in_grace;
115 	const struct nfsd4_client_tracking_ops *client_tracking_ops;
116 
117 	time64_t nfsd4_lease;
118 	time64_t nfsd4_grace;
119 	bool somebody_reclaimed;
120 
121 	bool track_reclaim_completes;
122 	atomic_t nr_reclaim_complete;
123 
124 	bool nfsd_net_up;
125 	bool lockd_up;
126 
127 	seqlock_t writeverf_lock;
128 	unsigned char writeverf[8];
129 
130 	/*
131 	 * Max number of connections this nfsd container will allow. Defaults
132 	 * to '0' which is means that it bases this on the number of threads.
133 	 */
134 	unsigned int max_connections;
135 
136 	u32 clientid_base;
137 	u32 clientid_counter;
138 	u32 clverifier_counter;
139 
140 	struct svc_serv *nfsd_serv;
141 	/* When a listening socket is added to nfsd, keep_active is set
142 	 * and this justifies a reference on nfsd_serv.  This stops
143 	 * nfsd_serv from being freed.  When the number of threads is
144 	 * set, keep_active is cleared and the reference is dropped.  So
145 	 * when the last thread exits, the service will be destroyed.
146 	 */
147 	int keep_active;
148 
149 	/*
150 	 * clientid and stateid data for construction of net unique COPY
151 	 * stateids.
152 	 */
153 	u32		s2s_cp_cl_id;
154 	struct idr	s2s_cp_stateids;
155 	spinlock_t	s2s_cp_lock;
156 
157 	/*
158 	 * Version information
159 	 */
160 	bool *nfsd_versions;
161 	bool *nfsd4_minorversions;
162 
163 	/*
164 	 * Duplicate reply cache
165 	 */
166 	struct nfsd_drc_bucket   *drc_hashtbl;
167 
168 	/* max number of entries allowed in the cache */
169 	unsigned int             max_drc_entries;
170 
171 	/* number of significant bits in the hash value */
172 	unsigned int             maskbits;
173 	unsigned int             drc_hashsize;
174 
175 	/*
176 	 * Stats and other tracking of on the duplicate reply cache.
177 	 * The longest_chain* fields are modified with only the per-bucket
178 	 * cache lock, which isn't really safe and should be fixed if we want
179 	 * these statistics to be completely accurate.
180 	 */
181 
182 	/* total number of entries */
183 	atomic_t                 num_drc_entries;
184 
185 	/* Per-netns stats counters */
186 	struct percpu_counter    counter[NFSD_STATS_COUNTERS_NUM];
187 
188 	/* sunrpc svc stats */
189 	struct svc_stat          nfsd_svcstats;
190 
191 	/* longest hash chain seen */
192 	unsigned int             longest_chain;
193 
194 	/* size of cache when we saw the longest hash chain */
195 	unsigned int             longest_chain_cachesize;
196 
197 	struct shrinker		nfsd_reply_cache_shrinker;
198 
199 	/* tracking server-to-server copy mounts */
200 	spinlock_t              nfsd_ssc_lock;
201 	struct list_head        nfsd_ssc_mount_list;
202 	wait_queue_head_t       nfsd_ssc_waitq;
203 
204 	/* utsname taken from the process that starts the server */
205 	char			nfsd_name[UNX_MAXNODENAME+1];
206 
207 	struct nfsd_fcache_disposal *fcache_disposal;
208 
209 	siphash_key_t		siphash_key;
210 
211 	atomic_t		nfs4_client_count;
212 	int			nfs4_max_clients;
213 
214 	atomic_t		nfsd_courtesy_clients;
215 	struct shrinker		nfsd_client_shrinker;
216 	struct work_struct	nfsd_shrinker_work;
217 };
218 
219 /* Simple check to find out if a given net was properly initialized */
220 #define nfsd_netns_ready(nn) ((nn)->sessionid_hashtbl)
221 
222 extern void nfsd_netns_free_versions(struct nfsd_net *nn);
223 
224 extern unsigned int nfsd_net_id;
225 
226 void nfsd_copy_write_verifier(__be32 verf[2], struct nfsd_net *nn);
227 void nfsd_reset_write_verifier(struct nfsd_net *nn);
228 #endif /* __NFSD_NETNS_H__ */
229