File Index
Files and directories
Sign in
FILE

netns.h

File preview with syntax highlighting.

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