xref: /linux/fs/nfsd/netns.h (revision 1a0e2cd9c4243871e534f02459ecca0ddd6ff6d5)
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_info nfsd_info;
141 #define nfsd_serv nfsd_info.serv
142 
143 
144 	/*
145 	 * clientid and stateid data for construction of net unique COPY
146 	 * stateids.
147 	 */
148 	u32		s2s_cp_cl_id;
149 	struct idr	s2s_cp_stateids;
150 	spinlock_t	s2s_cp_lock;
151 
152 	/*
153 	 * Version information
154 	 */
155 	bool *nfsd_versions;
156 	bool *nfsd4_minorversions;
157 
158 	/*
159 	 * Duplicate reply cache
160 	 */
161 	struct nfsd_drc_bucket   *drc_hashtbl;
162 
163 	/* max number of entries allowed in the cache */
164 	unsigned int             max_drc_entries;
165 
166 	/* number of significant bits in the hash value */
167 	unsigned int             maskbits;
168 	unsigned int             drc_hashsize;
169 
170 	/*
171 	 * Stats and other tracking of on the duplicate reply cache.
172 	 * The longest_chain* fields are modified with only the per-bucket
173 	 * cache lock, which isn't really safe and should be fixed if we want
174 	 * these statistics to be completely accurate.
175 	 */
176 
177 	/* total number of entries */
178 	atomic_t                 num_drc_entries;
179 
180 	/* Per-netns stats counters */
181 	struct percpu_counter    counter[NFSD_STATS_COUNTERS_NUM];
182 
183 	/* sunrpc svc stats */
184 	struct svc_stat          nfsd_svcstats;
185 
186 	/* longest hash chain seen */
187 	unsigned int             longest_chain;
188 
189 	/* size of cache when we saw the longest hash chain */
190 	unsigned int             longest_chain_cachesize;
191 
192 	struct shrinker		*nfsd_reply_cache_shrinker;
193 
194 	/* tracking server-to-server copy mounts */
195 	spinlock_t              nfsd_ssc_lock;
196 	struct list_head        nfsd_ssc_mount_list;
197 	wait_queue_head_t       nfsd_ssc_waitq;
198 
199 	/* utsname taken from the process that starts the server */
200 	char			nfsd_name[UNX_MAXNODENAME+1];
201 
202 	struct nfsd_fcache_disposal *fcache_disposal;
203 
204 	siphash_key_t		siphash_key;
205 
206 	atomic_t		nfs4_client_count;
207 	int			nfs4_max_clients;
208 
209 	atomic_t		nfsd_courtesy_clients;
210 	struct shrinker		*nfsd_client_shrinker;
211 	struct work_struct	nfsd_shrinker_work;
212 
213 	/* last time an admin-revoke happened for NFSv4.0 */
214 	time64_t		nfs40_last_revoke;
215 
216 };
217 
218 /* Simple check to find out if a given net was properly initialized */
219 #define nfsd_netns_ready(nn) ((nn)->sessionid_hashtbl)
220 
221 extern bool nfsd_support_version(int vers);
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