xref: /openbmc/linux/fs/nfsd/netns.h (revision e2028c8e)
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  
14  /* Hash tables for nfs4_clientid state */
15  #define CLIENT_HASH_BITS                 4
16  #define CLIENT_HASH_SIZE                (1 << CLIENT_HASH_BITS)
17  #define CLIENT_HASH_MASK                (CLIENT_HASH_SIZE - 1)
18  
19  #define SESSION_HASH_SIZE	512
20  
21  struct cld_net;
22  struct nfsd4_client_tracking_ops;
23  
24  /*
25   * Represents a nfsd "container". With respect to nfsv4 state tracking, the
26   * fields of interest are the *_id_hashtbls and the *_name_tree. These track
27   * the nfs4_client objects by either short or long form clientid.
28   *
29   * Each nfsd_net runs a nfs4_laundromat workqueue job when necessary to clean
30   * up expired clients and delegations within the container.
31   */
32  struct nfsd_net {
33  	struct cld_net *cld_net;
34  
35  	struct cache_detail *svc_expkey_cache;
36  	struct cache_detail *svc_export_cache;
37  
38  	struct cache_detail *idtoname_cache;
39  	struct cache_detail *nametoid_cache;
40  
41  	struct lock_manager nfsd4_manager;
42  	bool grace_ended;
43  	time64_t boot_time;
44  
45  	/* internal mount of the "nfsd" pseudofilesystem: */
46  	struct vfsmount *nfsd_mnt;
47  
48  	struct dentry *nfsd_client_dir;
49  
50  	/*
51  	 * reclaim_str_hashtbl[] holds known client info from previous reset/reboot
52  	 * used in reboot/reset lease grace period processing
53  	 *
54  	 * conf_id_hashtbl[], and conf_name_tree hold confirmed
55  	 * setclientid_confirmed info.
56  	 *
57  	 * unconf_str_hastbl[] and unconf_name_tree hold unconfirmed
58  	 * setclientid info.
59  	 */
60  	struct list_head *reclaim_str_hashtbl;
61  	int reclaim_str_hashtbl_size;
62  	struct list_head *conf_id_hashtbl;
63  	struct rb_root conf_name_tree;
64  	struct list_head *unconf_id_hashtbl;
65  	struct rb_root unconf_name_tree;
66  	struct list_head *sessionid_hashtbl;
67  	/*
68  	 * client_lru holds client queue ordered by nfs4_client.cl_time
69  	 * for lease renewal.
70  	 *
71  	 * close_lru holds (open) stateowner queue ordered by nfs4_stateowner.so_time
72  	 * for last close replay.
73  	 *
74  	 * All of the above fields are protected by the client_mutex.
75  	 */
76  	struct list_head client_lru;
77  	struct list_head close_lru;
78  	struct list_head del_recall_lru;
79  
80  	/* protected by blocked_locks_lock */
81  	struct list_head blocked_locks_lru;
82  
83  	struct delayed_work laundromat_work;
84  
85  	/* client_lock protects the client lru list and session hash table */
86  	spinlock_t client_lock;
87  
88  	/* protects blocked_locks_lru */
89  	spinlock_t blocked_locks_lock;
90  
91  	struct file *rec_file;
92  	bool in_grace;
93  	const struct nfsd4_client_tracking_ops *client_tracking_ops;
94  
95  	time64_t nfsd4_lease;
96  	time64_t nfsd4_grace;
97  	bool somebody_reclaimed;
98  
99  	bool track_reclaim_completes;
100  	atomic_t nr_reclaim_complete;
101  
102  	bool nfsd_net_up;
103  	bool lockd_up;
104  
105  	/* Time of server startup */
106  	struct timespec64 nfssvc_boot;
107  	seqlock_t boot_lock;
108  
109  	/*
110  	 * Max number of connections this nfsd container will allow. Defaults
111  	 * to '0' which is means that it bases this on the number of threads.
112  	 */
113  	unsigned int max_connections;
114  
115  	u32 clientid_base;
116  	u32 clientid_counter;
117  	u32 clverifier_counter;
118  
119  	struct svc_serv *nfsd_serv;
120  
121  	wait_queue_head_t ntf_wq;
122  	atomic_t ntf_refcnt;
123  
124  	/*
125  	 * clientid and stateid data for construction of net unique COPY
126  	 * stateids.
127  	 */
128  	u32		s2s_cp_cl_id;
129  	struct idr	s2s_cp_stateids;
130  	spinlock_t	s2s_cp_lock;
131  
132  	/*
133  	 * Version information
134  	 */
135  	bool *nfsd_versions;
136  	bool *nfsd4_minorversions;
137  
138  	/*
139  	 * Duplicate reply cache
140  	 */
141  	struct nfsd_drc_bucket   *drc_hashtbl;
142  
143  	/* max number of entries allowed in the cache */
144  	unsigned int             max_drc_entries;
145  
146  	/* number of significant bits in the hash value */
147  	unsigned int             maskbits;
148  	unsigned int             drc_hashsize;
149  
150  	/*
151  	 * Stats and other tracking of on the duplicate reply cache.
152  	 * These fields and the "rc" fields in nfsdstats are modified
153  	 * with only the per-bucket cache lock, which isn't really safe
154  	 * and should be fixed if we want the statistics to be
155  	 * completely accurate.
156  	 */
157  
158  	/* total number of entries */
159  	atomic_t                 num_drc_entries;
160  
161  	/* cache misses due only to checksum comparison failures */
162  	unsigned int             payload_misses;
163  
164  	/* amount of memory (in bytes) currently consumed by the DRC */
165  	unsigned int             drc_mem_usage;
166  
167  	/* longest hash chain seen */
168  	unsigned int             longest_chain;
169  
170  	/* size of cache when we saw the longest hash chain */
171  	unsigned int             longest_chain_cachesize;
172  
173  	struct shrinker		nfsd_reply_cache_shrinker;
174  	/* utsname taken from the process that starts the server */
175  	char			nfsd_name[UNX_MAXNODENAME+1];
176  };
177  
178  /* Simple check to find out if a given net was properly initialized */
179  #define nfsd_netns_ready(nn) ((nn)->sessionid_hashtbl)
180  
181  extern void nfsd_netns_free_versions(struct nfsd_net *nn);
182  
183  extern unsigned int nfsd_net_id;
184  
185  void nfsd_copy_boot_verifier(__be32 verf[2], struct nfsd_net *nn);
186  void nfsd_reset_boot_verifier(struct nfsd_net *nn);
187  #endif /* __NFSD_NETNS_H__ */
188