xref: /kernel/linux/linux-6.6/fs/nfsd/nfsctl.c (revision 62306a36)
1// SPDX-License-Identifier: GPL-2.0-only
2/*
3 * Syscall interface to knfsd.
4 *
5 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
6 */
7
8#include <linux/slab.h>
9#include <linux/namei.h>
10#include <linux/ctype.h>
11#include <linux/fs_context.h>
12
13#include <linux/sunrpc/svcsock.h>
14#include <linux/lockd/lockd.h>
15#include <linux/sunrpc/addr.h>
16#include <linux/sunrpc/gss_api.h>
17#include <linux/sunrpc/rpc_pipe_fs.h>
18#include <linux/module.h>
19#include <linux/fsnotify.h>
20
21#include "idmap.h"
22#include "nfsd.h"
23#include "cache.h"
24#include "state.h"
25#include "netns.h"
26#include "pnfs.h"
27#include "filecache.h"
28#include "trace.h"
29
30/*
31 *	We have a single directory with several nodes in it.
32 */
33enum {
34	NFSD_Root = 1,
35	NFSD_List,
36	NFSD_Export_Stats,
37	NFSD_Export_features,
38	NFSD_Fh,
39	NFSD_FO_UnlockIP,
40	NFSD_FO_UnlockFS,
41	NFSD_Threads,
42	NFSD_Pool_Threads,
43	NFSD_Pool_Stats,
44	NFSD_Reply_Cache_Stats,
45	NFSD_Versions,
46	NFSD_Ports,
47	NFSD_MaxBlkSize,
48	NFSD_MaxConnections,
49	NFSD_Filecache,
50	/*
51	 * The below MUST come last.  Otherwise we leave a hole in nfsd_files[]
52	 * with !CONFIG_NFSD_V4 and simple_fill_super() goes oops
53	 */
54#ifdef CONFIG_NFSD_V4
55	NFSD_Leasetime,
56	NFSD_Gracetime,
57	NFSD_RecoveryDir,
58	NFSD_V4EndGrace,
59#endif
60	NFSD_MaxReserved
61};
62
63/*
64 * write() for these nodes.
65 */
66static ssize_t write_filehandle(struct file *file, char *buf, size_t size);
67static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size);
68static ssize_t write_unlock_fs(struct file *file, char *buf, size_t size);
69static ssize_t write_threads(struct file *file, char *buf, size_t size);
70static ssize_t write_pool_threads(struct file *file, char *buf, size_t size);
71static ssize_t write_versions(struct file *file, char *buf, size_t size);
72static ssize_t write_ports(struct file *file, char *buf, size_t size);
73static ssize_t write_maxblksize(struct file *file, char *buf, size_t size);
74static ssize_t write_maxconn(struct file *file, char *buf, size_t size);
75#ifdef CONFIG_NFSD_V4
76static ssize_t write_leasetime(struct file *file, char *buf, size_t size);
77static ssize_t write_gracetime(struct file *file, char *buf, size_t size);
78static ssize_t write_recoverydir(struct file *file, char *buf, size_t size);
79static ssize_t write_v4_end_grace(struct file *file, char *buf, size_t size);
80#endif
81
82static ssize_t (*const write_op[])(struct file *, char *, size_t) = {
83	[NFSD_Fh] = write_filehandle,
84	[NFSD_FO_UnlockIP] = write_unlock_ip,
85	[NFSD_FO_UnlockFS] = write_unlock_fs,
86	[NFSD_Threads] = write_threads,
87	[NFSD_Pool_Threads] = write_pool_threads,
88	[NFSD_Versions] = write_versions,
89	[NFSD_Ports] = write_ports,
90	[NFSD_MaxBlkSize] = write_maxblksize,
91	[NFSD_MaxConnections] = write_maxconn,
92#ifdef CONFIG_NFSD_V4
93	[NFSD_Leasetime] = write_leasetime,
94	[NFSD_Gracetime] = write_gracetime,
95	[NFSD_RecoveryDir] = write_recoverydir,
96	[NFSD_V4EndGrace] = write_v4_end_grace,
97#endif
98};
99
100static ssize_t nfsctl_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos)
101{
102	ino_t ino =  file_inode(file)->i_ino;
103	char *data;
104	ssize_t rv;
105
106	if (ino >= ARRAY_SIZE(write_op) || !write_op[ino])
107		return -EINVAL;
108
109	data = simple_transaction_get(file, buf, size);
110	if (IS_ERR(data))
111		return PTR_ERR(data);
112
113	rv = write_op[ino](file, data, size);
114	if (rv < 0)
115		return rv;
116
117	simple_transaction_set(file, rv);
118	return size;
119}
120
121static ssize_t nfsctl_transaction_read(struct file *file, char __user *buf, size_t size, loff_t *pos)
122{
123	if (! file->private_data) {
124		/* An attempt to read a transaction file without writing
125		 * causes a 0-byte write so that the file can return
126		 * state information
127		 */
128		ssize_t rv = nfsctl_transaction_write(file, buf, 0, pos);
129		if (rv < 0)
130			return rv;
131	}
132	return simple_transaction_read(file, buf, size, pos);
133}
134
135static const struct file_operations transaction_ops = {
136	.write		= nfsctl_transaction_write,
137	.read		= nfsctl_transaction_read,
138	.release	= simple_transaction_release,
139	.llseek		= default_llseek,
140};
141
142static int exports_net_open(struct net *net, struct file *file)
143{
144	int err;
145	struct seq_file *seq;
146	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
147
148	err = seq_open(file, &nfs_exports_op);
149	if (err)
150		return err;
151
152	seq = file->private_data;
153	seq->private = nn->svc_export_cache;
154	return 0;
155}
156
157static int exports_nfsd_open(struct inode *inode, struct file *file)
158{
159	return exports_net_open(inode->i_sb->s_fs_info, file);
160}
161
162static const struct file_operations exports_nfsd_operations = {
163	.open		= exports_nfsd_open,
164	.read		= seq_read,
165	.llseek		= seq_lseek,
166	.release	= seq_release,
167};
168
169static int export_features_show(struct seq_file *m, void *v)
170{
171	seq_printf(m, "0x%x 0x%x\n", NFSEXP_ALLFLAGS, NFSEXP_SECINFO_FLAGS);
172	return 0;
173}
174
175DEFINE_SHOW_ATTRIBUTE(export_features);
176
177static const struct file_operations pool_stats_operations = {
178	.open		= nfsd_pool_stats_open,
179	.read		= seq_read,
180	.llseek		= seq_lseek,
181	.release	= nfsd_pool_stats_release,
182};
183
184DEFINE_SHOW_ATTRIBUTE(nfsd_reply_cache_stats);
185
186DEFINE_SHOW_ATTRIBUTE(nfsd_file_cache_stats);
187
188/*----------------------------------------------------------------------------*/
189/*
190 * payload - write methods
191 */
192
193static inline struct net *netns(struct file *file)
194{
195	return file_inode(file)->i_sb->s_fs_info;
196}
197
198/*
199 * write_unlock_ip - Release all locks used by a client
200 *
201 * Experimental.
202 *
203 * Input:
204 *			buf:	'\n'-terminated C string containing a
205 *				presentation format IP address
206 *			size:	length of C string in @buf
207 * Output:
208 *	On success:	returns zero if all specified locks were released;
209 *			returns one if one or more locks were not released
210 *	On error:	return code is negative errno value
211 */
212static ssize_t write_unlock_ip(struct file *file, char *buf, size_t size)
213{
214	struct sockaddr_storage address;
215	struct sockaddr *sap = (struct sockaddr *)&address;
216	size_t salen = sizeof(address);
217	char *fo_path;
218	struct net *net = netns(file);
219
220	/* sanity check */
221	if (size == 0)
222		return -EINVAL;
223
224	if (buf[size-1] != '\n')
225		return -EINVAL;
226
227	fo_path = buf;
228	if (qword_get(&buf, fo_path, size) < 0)
229		return -EINVAL;
230
231	if (rpc_pton(net, fo_path, size, sap, salen) == 0)
232		return -EINVAL;
233
234	trace_nfsd_ctl_unlock_ip(net, buf);
235	return nlmsvc_unlock_all_by_ip(sap);
236}
237
238/*
239 * write_unlock_fs - Release all locks on a local file system
240 *
241 * Experimental.
242 *
243 * Input:
244 *			buf:	'\n'-terminated C string containing the
245 *				absolute pathname of a local file system
246 *			size:	length of C string in @buf
247 * Output:
248 *	On success:	returns zero if all specified locks were released;
249 *			returns one if one or more locks were not released
250 *	On error:	return code is negative errno value
251 */
252static ssize_t write_unlock_fs(struct file *file, char *buf, size_t size)
253{
254	struct path path;
255	char *fo_path;
256	int error;
257
258	/* sanity check */
259	if (size == 0)
260		return -EINVAL;
261
262	if (buf[size-1] != '\n')
263		return -EINVAL;
264
265	fo_path = buf;
266	if (qword_get(&buf, fo_path, size) < 0)
267		return -EINVAL;
268	trace_nfsd_ctl_unlock_fs(netns(file), fo_path);
269	error = kern_path(fo_path, 0, &path);
270	if (error)
271		return error;
272
273	/*
274	 * XXX: Needs better sanity checking.  Otherwise we could end up
275	 * releasing locks on the wrong file system.
276	 *
277	 * For example:
278	 * 1.  Does the path refer to a directory?
279	 * 2.  Is that directory a mount point, or
280	 * 3.  Is that directory the root of an exported file system?
281	 */
282	error = nlmsvc_unlock_all_by_sb(path.dentry->d_sb);
283
284	path_put(&path);
285	return error;
286}
287
288/*
289 * write_filehandle - Get a variable-length NFS file handle by path
290 *
291 * On input, the buffer contains a '\n'-terminated C string comprised of
292 * three alphanumeric words separated by whitespace.  The string may
293 * contain escape sequences.
294 *
295 * Input:
296 *			buf:
297 *				domain:		client domain name
298 *				path:		export pathname
299 *				maxsize:	numeric maximum size of
300 *						@buf
301 *			size:	length of C string in @buf
302 * Output:
303 *	On success:	passed-in buffer filled with '\n'-terminated C
304 *			string containing a ASCII hex text version
305 *			of the NFS file handle;
306 *			return code is the size in bytes of the string
307 *	On error:	return code is negative errno value
308 */
309static ssize_t write_filehandle(struct file *file, char *buf, size_t size)
310{
311	char *dname, *path;
312	int maxsize;
313	char *mesg = buf;
314	int len;
315	struct auth_domain *dom;
316	struct knfsd_fh fh;
317
318	if (size == 0)
319		return -EINVAL;
320
321	if (buf[size-1] != '\n')
322		return -EINVAL;
323	buf[size-1] = 0;
324
325	dname = mesg;
326	len = qword_get(&mesg, dname, size);
327	if (len <= 0)
328		return -EINVAL;
329
330	path = dname+len+1;
331	len = qword_get(&mesg, path, size);
332	if (len <= 0)
333		return -EINVAL;
334
335	len = get_int(&mesg, &maxsize);
336	if (len)
337		return len;
338
339	if (maxsize < NFS_FHSIZE)
340		return -EINVAL;
341	maxsize = min(maxsize, NFS3_FHSIZE);
342
343	if (qword_get(&mesg, mesg, size) > 0)
344		return -EINVAL;
345
346	trace_nfsd_ctl_filehandle(netns(file), dname, path, maxsize);
347
348	/* we have all the words, they are in buf.. */
349	dom = unix_domain_find(dname);
350	if (!dom)
351		return -ENOMEM;
352
353	len = exp_rootfh(netns(file), dom, path, &fh, maxsize);
354	auth_domain_put(dom);
355	if (len)
356		return len;
357
358	mesg = buf;
359	len = SIMPLE_TRANSACTION_LIMIT;
360	qword_addhex(&mesg, &len, fh.fh_raw, fh.fh_size);
361	mesg[-1] = '\n';
362	return mesg - buf;
363}
364
365/*
366 * write_threads - Start NFSD, or report the current number of running threads
367 *
368 * Input:
369 *			buf:		ignored
370 *			size:		zero
371 * Output:
372 *	On success:	passed-in buffer filled with '\n'-terminated C
373 *			string numeric value representing the number of
374 *			running NFSD threads;
375 *			return code is the size in bytes of the string
376 *	On error:	return code is zero
377 *
378 * OR
379 *
380 * Input:
381 *			buf:		C string containing an unsigned
382 *					integer value representing the
383 *					number of NFSD threads to start
384 *			size:		non-zero length of C string in @buf
385 * Output:
386 *	On success:	NFS service is started;
387 *			passed-in buffer filled with '\n'-terminated C
388 *			string numeric value representing the number of
389 *			running NFSD threads;
390 *			return code is the size in bytes of the string
391 *	On error:	return code is zero or a negative errno value
392 */
393static ssize_t write_threads(struct file *file, char *buf, size_t size)
394{
395	char *mesg = buf;
396	int rv;
397	struct net *net = netns(file);
398
399	if (size > 0) {
400		int newthreads;
401		rv = get_int(&mesg, &newthreads);
402		if (rv)
403			return rv;
404		if (newthreads < 0)
405			return -EINVAL;
406		trace_nfsd_ctl_threads(net, newthreads);
407		rv = nfsd_svc(newthreads, net, file->f_cred);
408		if (rv < 0)
409			return rv;
410	} else
411		rv = nfsd_nrthreads(net);
412
413	return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%d\n", rv);
414}
415
416/*
417 * write_pool_threads - Set or report the current number of threads per pool
418 *
419 * Input:
420 *			buf:		ignored
421 *			size:		zero
422 *
423 * OR
424 *
425 * Input:
426 *			buf:		C string containing whitespace-
427 *					separated unsigned integer values
428 *					representing the number of NFSD
429 *					threads to start in each pool
430 *			size:		non-zero length of C string in @buf
431 * Output:
432 *	On success:	passed-in buffer filled with '\n'-terminated C
433 *			string containing integer values representing the
434 *			number of NFSD threads in each pool;
435 *			return code is the size in bytes of the string
436 *	On error:	return code is zero or a negative errno value
437 */
438static ssize_t write_pool_threads(struct file *file, char *buf, size_t size)
439{
440	/* if size > 0, look for an array of number of threads per node
441	 * and apply them  then write out number of threads per node as reply
442	 */
443	char *mesg = buf;
444	int i;
445	int rv;
446	int len;
447	int npools;
448	int *nthreads;
449	struct net *net = netns(file);
450
451	mutex_lock(&nfsd_mutex);
452	npools = nfsd_nrpools(net);
453	if (npools == 0) {
454		/*
455		 * NFS is shut down.  The admin can start it by
456		 * writing to the threads file but NOT the pool_threads
457		 * file, sorry.  Report zero threads.
458		 */
459		mutex_unlock(&nfsd_mutex);
460		strcpy(buf, "0\n");
461		return strlen(buf);
462	}
463
464	nthreads = kcalloc(npools, sizeof(int), GFP_KERNEL);
465	rv = -ENOMEM;
466	if (nthreads == NULL)
467		goto out_free;
468
469	if (size > 0) {
470		for (i = 0; i < npools; i++) {
471			rv = get_int(&mesg, &nthreads[i]);
472			if (rv == -ENOENT)
473				break;		/* fewer numbers than pools */
474			if (rv)
475				goto out_free;	/* syntax error */
476			rv = -EINVAL;
477			if (nthreads[i] < 0)
478				goto out_free;
479			trace_nfsd_ctl_pool_threads(net, i, nthreads[i]);
480		}
481		rv = nfsd_set_nrthreads(i, nthreads, net);
482		if (rv)
483			goto out_free;
484	}
485
486	rv = nfsd_get_nrthreads(npools, nthreads, net);
487	if (rv)
488		goto out_free;
489
490	mesg = buf;
491	size = SIMPLE_TRANSACTION_LIMIT;
492	for (i = 0; i < npools && size > 0; i++) {
493		snprintf(mesg, size, "%d%c", nthreads[i], (i == npools-1 ? '\n' : ' '));
494		len = strlen(mesg);
495		size -= len;
496		mesg += len;
497	}
498	rv = mesg - buf;
499out_free:
500	kfree(nthreads);
501	mutex_unlock(&nfsd_mutex);
502	return rv;
503}
504
505static ssize_t
506nfsd_print_version_support(struct nfsd_net *nn, char *buf, int remaining,
507		const char *sep, unsigned vers, int minor)
508{
509	const char *format = minor < 0 ? "%s%c%u" : "%s%c%u.%u";
510	bool supported = !!nfsd_vers(nn, vers, NFSD_TEST);
511
512	if (vers == 4 && minor >= 0 &&
513	    !nfsd_minorversion(nn, minor, NFSD_TEST))
514		supported = false;
515	if (minor == 0 && supported)
516		/*
517		 * special case for backward compatability.
518		 * +4.0 is never reported, it is implied by
519		 * +4, unless -4.0 is present.
520		 */
521		return 0;
522	return snprintf(buf, remaining, format, sep,
523			supported ? '+' : '-', vers, minor);
524}
525
526static ssize_t __write_versions(struct file *file, char *buf, size_t size)
527{
528	char *mesg = buf;
529	char *vers, *minorp, sign;
530	int len, num, remaining;
531	ssize_t tlen = 0;
532	char *sep;
533	struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
534
535	if (size > 0) {
536		if (nn->nfsd_serv)
537			/* Cannot change versions without updating
538			 * nn->nfsd_serv->sv_xdrsize, and reallocing
539			 * rq_argp and rq_resp
540			 */
541			return -EBUSY;
542		if (buf[size-1] != '\n')
543			return -EINVAL;
544		buf[size-1] = 0;
545		trace_nfsd_ctl_version(netns(file), buf);
546
547		vers = mesg;
548		len = qword_get(&mesg, vers, size);
549		if (len <= 0) return -EINVAL;
550		do {
551			enum vers_op cmd;
552			unsigned minor;
553			sign = *vers;
554			if (sign == '+' || sign == '-')
555				num = simple_strtol((vers+1), &minorp, 0);
556			else
557				num = simple_strtol(vers, &minorp, 0);
558			if (*minorp == '.') {
559				if (num != 4)
560					return -EINVAL;
561				if (kstrtouint(minorp+1, 0, &minor) < 0)
562					return -EINVAL;
563			}
564
565			cmd = sign == '-' ? NFSD_CLEAR : NFSD_SET;
566			switch(num) {
567#ifdef CONFIG_NFSD_V2
568			case 2:
569#endif
570			case 3:
571				nfsd_vers(nn, num, cmd);
572				break;
573			case 4:
574				if (*minorp == '.') {
575					if (nfsd_minorversion(nn, minor, cmd) < 0)
576						return -EINVAL;
577				} else if ((cmd == NFSD_SET) != nfsd_vers(nn, num, NFSD_TEST)) {
578					/*
579					 * Either we have +4 and no minors are enabled,
580					 * or we have -4 and at least one minor is enabled.
581					 * In either case, propagate 'cmd' to all minors.
582					 */
583					minor = 0;
584					while (nfsd_minorversion(nn, minor, cmd) >= 0)
585						minor++;
586				}
587				break;
588			default:
589				/* Ignore requests to disable non-existent versions */
590				if (cmd == NFSD_SET)
591					return -EINVAL;
592			}
593			vers += len + 1;
594		} while ((len = qword_get(&mesg, vers, size)) > 0);
595		/* If all get turned off, turn them back on, as
596		 * having no versions is BAD
597		 */
598		nfsd_reset_versions(nn);
599	}
600
601	/* Now write current state into reply buffer */
602	sep = "";
603	remaining = SIMPLE_TRANSACTION_LIMIT;
604	for (num=2 ; num <= 4 ; num++) {
605		int minor;
606		if (!nfsd_vers(nn, num, NFSD_AVAIL))
607			continue;
608
609		minor = -1;
610		do {
611			len = nfsd_print_version_support(nn, buf, remaining,
612					sep, num, minor);
613			if (len >= remaining)
614				goto out;
615			remaining -= len;
616			buf += len;
617			tlen += len;
618			minor++;
619			if (len)
620				sep = " ";
621		} while (num == 4 && minor <= NFSD_SUPPORTED_MINOR_VERSION);
622	}
623out:
624	len = snprintf(buf, remaining, "\n");
625	if (len >= remaining)
626		return -EINVAL;
627	return tlen + len;
628}
629
630/*
631 * write_versions - Set or report the available NFS protocol versions
632 *
633 * Input:
634 *			buf:		ignored
635 *			size:		zero
636 * Output:
637 *	On success:	passed-in buffer filled with '\n'-terminated C
638 *			string containing positive or negative integer
639 *			values representing the current status of each
640 *			protocol version;
641 *			return code is the size in bytes of the string
642 *	On error:	return code is zero or a negative errno value
643 *
644 * OR
645 *
646 * Input:
647 *			buf:		C string containing whitespace-
648 *					separated positive or negative
649 *					integer values representing NFS
650 *					protocol versions to enable ("+n")
651 *					or disable ("-n")
652 *			size:		non-zero length of C string in @buf
653 * Output:
654 *	On success:	status of zero or more protocol versions has
655 *			been updated; passed-in buffer filled with
656 *			'\n'-terminated C string containing positive
657 *			or negative integer values representing the
658 *			current status of each protocol version;
659 *			return code is the size in bytes of the string
660 *	On error:	return code is zero or a negative errno value
661 */
662static ssize_t write_versions(struct file *file, char *buf, size_t size)
663{
664	ssize_t rv;
665
666	mutex_lock(&nfsd_mutex);
667	rv = __write_versions(file, buf, size);
668	mutex_unlock(&nfsd_mutex);
669	return rv;
670}
671
672/*
673 * Zero-length write.  Return a list of NFSD's current listener
674 * transports.
675 */
676static ssize_t __write_ports_names(char *buf, struct net *net)
677{
678	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
679
680	if (nn->nfsd_serv == NULL)
681		return 0;
682	return svc_xprt_names(nn->nfsd_serv, buf, SIMPLE_TRANSACTION_LIMIT);
683}
684
685/*
686 * A single 'fd' number was written, in which case it must be for
687 * a socket of a supported family/protocol, and we use it as an
688 * nfsd listener.
689 */
690static ssize_t __write_ports_addfd(char *buf, struct net *net, const struct cred *cred)
691{
692	char *mesg = buf;
693	int fd, err;
694	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
695	struct svc_serv *serv;
696
697	err = get_int(&mesg, &fd);
698	if (err != 0 || fd < 0)
699		return -EINVAL;
700	trace_nfsd_ctl_ports_addfd(net, fd);
701
702	err = nfsd_create_serv(net);
703	if (err != 0)
704		return err;
705
706	serv = nn->nfsd_serv;
707	err = svc_addsock(serv, net, fd, buf, SIMPLE_TRANSACTION_LIMIT, cred);
708
709	if (err < 0 && !serv->sv_nrthreads && !nn->keep_active)
710		nfsd_last_thread(net);
711	else if (err >= 0 && !serv->sv_nrthreads && !xchg(&nn->keep_active, 1))
712		svc_get(serv);
713
714	svc_put(serv);
715	return err;
716}
717
718/*
719 * A transport listener is added by writing its transport name and
720 * a port number.
721 */
722static ssize_t __write_ports_addxprt(char *buf, struct net *net, const struct cred *cred)
723{
724	char transport[16];
725	struct svc_xprt *xprt;
726	int port, err;
727	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
728	struct svc_serv *serv;
729
730	if (sscanf(buf, "%15s %5u", transport, &port) != 2)
731		return -EINVAL;
732
733	if (port < 1 || port > USHRT_MAX)
734		return -EINVAL;
735	trace_nfsd_ctl_ports_addxprt(net, transport, port);
736
737	err = nfsd_create_serv(net);
738	if (err != 0)
739		return err;
740
741	serv = nn->nfsd_serv;
742	err = svc_xprt_create(serv, transport, net,
743			      PF_INET, port, SVC_SOCK_ANONYMOUS, cred);
744	if (err < 0)
745		goto out_err;
746
747	err = svc_xprt_create(serv, transport, net,
748			      PF_INET6, port, SVC_SOCK_ANONYMOUS, cred);
749	if (err < 0 && err != -EAFNOSUPPORT)
750		goto out_close;
751
752	if (!serv->sv_nrthreads && !xchg(&nn->keep_active, 1))
753		svc_get(serv);
754
755	svc_put(serv);
756	return 0;
757out_close:
758	xprt = svc_find_xprt(serv, transport, net, PF_INET, port);
759	if (xprt != NULL) {
760		svc_xprt_close(xprt);
761		svc_xprt_put(xprt);
762	}
763out_err:
764	if (!serv->sv_nrthreads && !nn->keep_active)
765		nfsd_last_thread(net);
766
767	svc_put(serv);
768	return err;
769}
770
771static ssize_t __write_ports(struct file *file, char *buf, size_t size,
772			     struct net *net)
773{
774	if (size == 0)
775		return __write_ports_names(buf, net);
776
777	if (isdigit(buf[0]))
778		return __write_ports_addfd(buf, net, file->f_cred);
779
780	if (isalpha(buf[0]))
781		return __write_ports_addxprt(buf, net, file->f_cred);
782
783	return -EINVAL;
784}
785
786/*
787 * write_ports - Pass a socket file descriptor or transport name to listen on
788 *
789 * Input:
790 *			buf:		ignored
791 *			size:		zero
792 * Output:
793 *	On success:	passed-in buffer filled with a '\n'-terminated C
794 *			string containing a whitespace-separated list of
795 *			named NFSD listeners;
796 *			return code is the size in bytes of the string
797 *	On error:	return code is zero or a negative errno value
798 *
799 * OR
800 *
801 * Input:
802 *			buf:		C string containing an unsigned
803 *					integer value representing a bound
804 *					but unconnected socket that is to be
805 *					used as an NFSD listener; listen(3)
806 *					must be called for a SOCK_STREAM
807 *					socket, otherwise it is ignored
808 *			size:		non-zero length of C string in @buf
809 * Output:
810 *	On success:	NFS service is started;
811 *			passed-in buffer filled with a '\n'-terminated C
812 *			string containing a unique alphanumeric name of
813 *			the listener;
814 *			return code is the size in bytes of the string
815 *	On error:	return code is a negative errno value
816 *
817 * OR
818 *
819 * Input:
820 *			buf:		C string containing a transport
821 *					name and an unsigned integer value
822 *					representing the port to listen on,
823 *					separated by whitespace
824 *			size:		non-zero length of C string in @buf
825 * Output:
826 *	On success:	returns zero; NFS service is started
827 *	On error:	return code is a negative errno value
828 */
829static ssize_t write_ports(struct file *file, char *buf, size_t size)
830{
831	ssize_t rv;
832
833	mutex_lock(&nfsd_mutex);
834	rv = __write_ports(file, buf, size, netns(file));
835	mutex_unlock(&nfsd_mutex);
836	return rv;
837}
838
839
840int nfsd_max_blksize;
841
842/*
843 * write_maxblksize - Set or report the current NFS blksize
844 *
845 * Input:
846 *			buf:		ignored
847 *			size:		zero
848 *
849 * OR
850 *
851 * Input:
852 *			buf:		C string containing an unsigned
853 *					integer value representing the new
854 *					NFS blksize
855 *			size:		non-zero length of C string in @buf
856 * Output:
857 *	On success:	passed-in buffer filled with '\n'-terminated C string
858 *			containing numeric value of the current NFS blksize
859 *			setting;
860 *			return code is the size in bytes of the string
861 *	On error:	return code is zero or a negative errno value
862 */
863static ssize_t write_maxblksize(struct file *file, char *buf, size_t size)
864{
865	char *mesg = buf;
866	struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
867
868	if (size > 0) {
869		int bsize;
870		int rv = get_int(&mesg, &bsize);
871		if (rv)
872			return rv;
873		trace_nfsd_ctl_maxblksize(netns(file), bsize);
874
875		/* force bsize into allowed range and
876		 * required alignment.
877		 */
878		bsize = max_t(int, bsize, 1024);
879		bsize = min_t(int, bsize, NFSSVC_MAXBLKSIZE);
880		bsize &= ~(1024-1);
881		mutex_lock(&nfsd_mutex);
882		if (nn->nfsd_serv) {
883			mutex_unlock(&nfsd_mutex);
884			return -EBUSY;
885		}
886		nfsd_max_blksize = bsize;
887		mutex_unlock(&nfsd_mutex);
888	}
889
890	return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%d\n",
891							nfsd_max_blksize);
892}
893
894/*
895 * write_maxconn - Set or report the current max number of connections
896 *
897 * Input:
898 *			buf:		ignored
899 *			size:		zero
900 * OR
901 *
902 * Input:
903 *			buf:		C string containing an unsigned
904 *					integer value representing the new
905 *					number of max connections
906 *			size:		non-zero length of C string in @buf
907 * Output:
908 *	On success:	passed-in buffer filled with '\n'-terminated C string
909 *			containing numeric value of max_connections setting
910 *			for this net namespace;
911 *			return code is the size in bytes of the string
912 *	On error:	return code is zero or a negative errno value
913 */
914static ssize_t write_maxconn(struct file *file, char *buf, size_t size)
915{
916	char *mesg = buf;
917	struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
918	unsigned int maxconn = nn->max_connections;
919
920	if (size > 0) {
921		int rv = get_uint(&mesg, &maxconn);
922
923		if (rv)
924			return rv;
925		trace_nfsd_ctl_maxconn(netns(file), maxconn);
926		nn->max_connections = maxconn;
927	}
928
929	return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%u\n", maxconn);
930}
931
932#ifdef CONFIG_NFSD_V4
933static ssize_t __nfsd4_write_time(struct file *file, char *buf, size_t size,
934				  time64_t *time, struct nfsd_net *nn)
935{
936	struct dentry *dentry = file_dentry(file);
937	char *mesg = buf;
938	int rv, i;
939
940	if (size > 0) {
941		if (nn->nfsd_serv)
942			return -EBUSY;
943		rv = get_int(&mesg, &i);
944		if (rv)
945			return rv;
946		trace_nfsd_ctl_time(netns(file), dentry->d_name.name,
947				    dentry->d_name.len, i);
948
949		/*
950		 * Some sanity checking.  We don't have a reason for
951		 * these particular numbers, but problems with the
952		 * extremes are:
953		 *	- Too short: the briefest network outage may
954		 *	  cause clients to lose all their locks.  Also,
955		 *	  the frequent polling may be wasteful.
956		 *	- Too long: do you really want reboot recovery
957		 *	  to take more than an hour?  Or to make other
958		 *	  clients wait an hour before being able to
959		 *	  revoke a dead client's locks?
960		 */
961		if (i < 10 || i > 3600)
962			return -EINVAL;
963		*time = i;
964	}
965
966	return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%lld\n", *time);
967}
968
969static ssize_t nfsd4_write_time(struct file *file, char *buf, size_t size,
970				time64_t *time, struct nfsd_net *nn)
971{
972	ssize_t rv;
973
974	mutex_lock(&nfsd_mutex);
975	rv = __nfsd4_write_time(file, buf, size, time, nn);
976	mutex_unlock(&nfsd_mutex);
977	return rv;
978}
979
980/*
981 * write_leasetime - Set or report the current NFSv4 lease time
982 *
983 * Input:
984 *			buf:		ignored
985 *			size:		zero
986 *
987 * OR
988 *
989 * Input:
990 *			buf:		C string containing an unsigned
991 *					integer value representing the new
992 *					NFSv4 lease expiry time
993 *			size:		non-zero length of C string in @buf
994 * Output:
995 *	On success:	passed-in buffer filled with '\n'-terminated C
996 *			string containing unsigned integer value of the
997 *			current lease expiry time;
998 *			return code is the size in bytes of the string
999 *	On error:	return code is zero or a negative errno value
1000 */
1001static ssize_t write_leasetime(struct file *file, char *buf, size_t size)
1002{
1003	struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
1004	return nfsd4_write_time(file, buf, size, &nn->nfsd4_lease, nn);
1005}
1006
1007/*
1008 * write_gracetime - Set or report current NFSv4 grace period time
1009 *
1010 * As above, but sets the time of the NFSv4 grace period.
1011 *
1012 * Note this should never be set to less than the *previous*
1013 * lease-period time, but we don't try to enforce this.  (In the common
1014 * case (a new boot), we don't know what the previous lease time was
1015 * anyway.)
1016 */
1017static ssize_t write_gracetime(struct file *file, char *buf, size_t size)
1018{
1019	struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
1020	return nfsd4_write_time(file, buf, size, &nn->nfsd4_grace, nn);
1021}
1022
1023static ssize_t __write_recoverydir(struct file *file, char *buf, size_t size,
1024				   struct nfsd_net *nn)
1025{
1026	char *mesg = buf;
1027	char *recdir;
1028	int len, status;
1029
1030	if (size > 0) {
1031		if (nn->nfsd_serv)
1032			return -EBUSY;
1033		if (size > PATH_MAX || buf[size-1] != '\n')
1034			return -EINVAL;
1035		buf[size-1] = 0;
1036
1037		recdir = mesg;
1038		len = qword_get(&mesg, recdir, size);
1039		if (len <= 0)
1040			return -EINVAL;
1041		trace_nfsd_ctl_recoverydir(netns(file), recdir);
1042
1043		status = nfs4_reset_recoverydir(recdir);
1044		if (status)
1045			return status;
1046	}
1047
1048	return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%s\n",
1049							nfs4_recoverydir());
1050}
1051
1052/*
1053 * write_recoverydir - Set or report the pathname of the recovery directory
1054 *
1055 * Input:
1056 *			buf:		ignored
1057 *			size:		zero
1058 *
1059 * OR
1060 *
1061 * Input:
1062 *			buf:		C string containing the pathname
1063 *					of the directory on a local file
1064 *					system containing permanent NFSv4
1065 *					recovery data
1066 *			size:		non-zero length of C string in @buf
1067 * Output:
1068 *	On success:	passed-in buffer filled with '\n'-terminated C string
1069 *			containing the current recovery pathname setting;
1070 *			return code is the size in bytes of the string
1071 *	On error:	return code is zero or a negative errno value
1072 */
1073static ssize_t write_recoverydir(struct file *file, char *buf, size_t size)
1074{
1075	ssize_t rv;
1076	struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
1077
1078	mutex_lock(&nfsd_mutex);
1079	rv = __write_recoverydir(file, buf, size, nn);
1080	mutex_unlock(&nfsd_mutex);
1081	return rv;
1082}
1083
1084/*
1085 * write_v4_end_grace - release grace period for nfsd's v4.x lock manager
1086 *
1087 * Input:
1088 *			buf:		ignored
1089 *			size:		zero
1090 * OR
1091 *
1092 * Input:
1093 *			buf:		any value
1094 *			size:		non-zero length of C string in @buf
1095 * Output:
1096 *			passed-in buffer filled with "Y" or "N" with a newline
1097 *			and NULL-terminated C string. This indicates whether
1098 *			the grace period has ended in the current net
1099 *			namespace. Return code is the size in bytes of the
1100 *			string. Writing a string that starts with 'Y', 'y', or
1101 *			'1' to the file will end the grace period for nfsd's v4
1102 *			lock manager.
1103 */
1104static ssize_t write_v4_end_grace(struct file *file, char *buf, size_t size)
1105{
1106	struct nfsd_net *nn = net_generic(netns(file), nfsd_net_id);
1107
1108	if (size > 0) {
1109		switch(buf[0]) {
1110		case 'Y':
1111		case 'y':
1112		case '1':
1113			if (!nn->nfsd_serv)
1114				return -EBUSY;
1115			trace_nfsd_end_grace(netns(file));
1116			nfsd4_end_grace(nn);
1117			break;
1118		default:
1119			return -EINVAL;
1120		}
1121	}
1122
1123	return scnprintf(buf, SIMPLE_TRANSACTION_LIMIT, "%c\n",
1124			 nn->grace_ended ? 'Y' : 'N');
1125}
1126
1127#endif
1128
1129/*----------------------------------------------------------------------------*/
1130/*
1131 *	populating the filesystem.
1132 */
1133
1134/* Basically copying rpc_get_inode. */
1135static struct inode *nfsd_get_inode(struct super_block *sb, umode_t mode)
1136{
1137	struct inode *inode = new_inode(sb);
1138	if (!inode)
1139		return NULL;
1140	/* Following advice from simple_fill_super documentation: */
1141	inode->i_ino = iunique(sb, NFSD_MaxReserved);
1142	inode->i_mode = mode;
1143	inode->i_atime = inode->i_mtime = inode_set_ctime_current(inode);
1144	switch (mode & S_IFMT) {
1145	case S_IFDIR:
1146		inode->i_fop = &simple_dir_operations;
1147		inode->i_op = &simple_dir_inode_operations;
1148		inc_nlink(inode);
1149		break;
1150	case S_IFLNK:
1151		inode->i_op = &simple_symlink_inode_operations;
1152		break;
1153	default:
1154		break;
1155	}
1156	return inode;
1157}
1158
1159static int __nfsd_mkdir(struct inode *dir, struct dentry *dentry, umode_t mode, struct nfsdfs_client *ncl)
1160{
1161	struct inode *inode;
1162
1163	inode = nfsd_get_inode(dir->i_sb, mode);
1164	if (!inode)
1165		return -ENOMEM;
1166	if (ncl) {
1167		inode->i_private = ncl;
1168		kref_get(&ncl->cl_ref);
1169	}
1170	d_add(dentry, inode);
1171	inc_nlink(dir);
1172	fsnotify_mkdir(dir, dentry);
1173	return 0;
1174}
1175
1176static struct dentry *nfsd_mkdir(struct dentry *parent, struct nfsdfs_client *ncl, char *name)
1177{
1178	struct inode *dir = parent->d_inode;
1179	struct dentry *dentry;
1180	int ret = -ENOMEM;
1181
1182	inode_lock(dir);
1183	dentry = d_alloc_name(parent, name);
1184	if (!dentry)
1185		goto out_err;
1186	ret = __nfsd_mkdir(d_inode(parent), dentry, S_IFDIR | 0600, ncl);
1187	if (ret)
1188		goto out_err;
1189out:
1190	inode_unlock(dir);
1191	return dentry;
1192out_err:
1193	dput(dentry);
1194	dentry = ERR_PTR(ret);
1195	goto out;
1196}
1197
1198#if IS_ENABLED(CONFIG_SUNRPC_GSS)
1199static int __nfsd_symlink(struct inode *dir, struct dentry *dentry,
1200			  umode_t mode, const char *content)
1201{
1202	struct inode *inode;
1203
1204	inode = nfsd_get_inode(dir->i_sb, mode);
1205	if (!inode)
1206		return -ENOMEM;
1207
1208	inode->i_link = (char *)content;
1209	inode->i_size = strlen(content);
1210
1211	d_add(dentry, inode);
1212	inc_nlink(dir);
1213	fsnotify_create(dir, dentry);
1214	return 0;
1215}
1216
1217/*
1218 * @content is assumed to be a NUL-terminated string that lives
1219 * longer than the symlink itself.
1220 */
1221static void _nfsd_symlink(struct dentry *parent, const char *name,
1222			  const char *content)
1223{
1224	struct inode *dir = parent->d_inode;
1225	struct dentry *dentry;
1226	int ret;
1227
1228	inode_lock(dir);
1229	dentry = d_alloc_name(parent, name);
1230	if (!dentry)
1231		goto out;
1232	ret = __nfsd_symlink(d_inode(parent), dentry, S_IFLNK | 0777, content);
1233	if (ret)
1234		dput(dentry);
1235out:
1236	inode_unlock(dir);
1237}
1238#else
1239static inline void _nfsd_symlink(struct dentry *parent, const char *name,
1240				 const char *content)
1241{
1242}
1243
1244#endif
1245
1246static void clear_ncl(struct inode *inode)
1247{
1248	struct nfsdfs_client *ncl = inode->i_private;
1249
1250	inode->i_private = NULL;
1251	kref_put(&ncl->cl_ref, ncl->cl_release);
1252}
1253
1254static struct nfsdfs_client *__get_nfsdfs_client(struct inode *inode)
1255{
1256	struct nfsdfs_client *nc = inode->i_private;
1257
1258	if (nc)
1259		kref_get(&nc->cl_ref);
1260	return nc;
1261}
1262
1263struct nfsdfs_client *get_nfsdfs_client(struct inode *inode)
1264{
1265	struct nfsdfs_client *nc;
1266
1267	inode_lock_shared(inode);
1268	nc = __get_nfsdfs_client(inode);
1269	inode_unlock_shared(inode);
1270	return nc;
1271}
1272/* from __rpc_unlink */
1273static void nfsdfs_remove_file(struct inode *dir, struct dentry *dentry)
1274{
1275	int ret;
1276
1277	clear_ncl(d_inode(dentry));
1278	dget(dentry);
1279	ret = simple_unlink(dir, dentry);
1280	d_drop(dentry);
1281	fsnotify_unlink(dir, dentry);
1282	dput(dentry);
1283	WARN_ON_ONCE(ret);
1284}
1285
1286static void nfsdfs_remove_files(struct dentry *root)
1287{
1288	struct dentry *dentry, *tmp;
1289
1290	list_for_each_entry_safe(dentry, tmp, &root->d_subdirs, d_child) {
1291		if (!simple_positive(dentry)) {
1292			WARN_ON_ONCE(1); /* I think this can't happen? */
1293			continue;
1294		}
1295		nfsdfs_remove_file(d_inode(root), dentry);
1296	}
1297}
1298
1299/* XXX: cut'n'paste from simple_fill_super; figure out if we could share
1300 * code instead. */
1301static  int nfsdfs_create_files(struct dentry *root,
1302				const struct tree_descr *files,
1303				struct dentry **fdentries)
1304{
1305	struct inode *dir = d_inode(root);
1306	struct inode *inode;
1307	struct dentry *dentry;
1308	int i;
1309
1310	inode_lock(dir);
1311	for (i = 0; files->name && files->name[0]; i++, files++) {
1312		dentry = d_alloc_name(root, files->name);
1313		if (!dentry)
1314			goto out;
1315		inode = nfsd_get_inode(d_inode(root)->i_sb,
1316					S_IFREG | files->mode);
1317		if (!inode) {
1318			dput(dentry);
1319			goto out;
1320		}
1321		inode->i_fop = files->ops;
1322		inode->i_private = __get_nfsdfs_client(dir);
1323		d_add(dentry, inode);
1324		fsnotify_create(dir, dentry);
1325		if (fdentries)
1326			fdentries[i] = dentry;
1327	}
1328	inode_unlock(dir);
1329	return 0;
1330out:
1331	nfsdfs_remove_files(root);
1332	inode_unlock(dir);
1333	return -ENOMEM;
1334}
1335
1336/* on success, returns positive number unique to that client. */
1337struct dentry *nfsd_client_mkdir(struct nfsd_net *nn,
1338				 struct nfsdfs_client *ncl, u32 id,
1339				 const struct tree_descr *files,
1340				 struct dentry **fdentries)
1341{
1342	struct dentry *dentry;
1343	char name[11];
1344	int ret;
1345
1346	sprintf(name, "%u", id);
1347
1348	dentry = nfsd_mkdir(nn->nfsd_client_dir, ncl, name);
1349	if (IS_ERR(dentry)) /* XXX: tossing errors? */
1350		return NULL;
1351	ret = nfsdfs_create_files(dentry, files, fdentries);
1352	if (ret) {
1353		nfsd_client_rmdir(dentry);
1354		return NULL;
1355	}
1356	return dentry;
1357}
1358
1359/* Taken from __rpc_rmdir: */
1360void nfsd_client_rmdir(struct dentry *dentry)
1361{
1362	struct inode *dir = d_inode(dentry->d_parent);
1363	struct inode *inode = d_inode(dentry);
1364	int ret;
1365
1366	inode_lock(dir);
1367	nfsdfs_remove_files(dentry);
1368	clear_ncl(inode);
1369	dget(dentry);
1370	ret = simple_rmdir(dir, dentry);
1371	WARN_ON_ONCE(ret);
1372	d_drop(dentry);
1373	fsnotify_rmdir(dir, dentry);
1374	dput(dentry);
1375	inode_unlock(dir);
1376}
1377
1378static int nfsd_fill_super(struct super_block *sb, struct fs_context *fc)
1379{
1380	struct nfsd_net *nn = net_generic(current->nsproxy->net_ns,
1381							nfsd_net_id);
1382	struct dentry *dentry;
1383	int ret;
1384
1385	static const struct tree_descr nfsd_files[] = {
1386		[NFSD_List] = {"exports", &exports_nfsd_operations, S_IRUGO},
1387		/* Per-export io stats use same ops as exports file */
1388		[NFSD_Export_Stats] = {"export_stats", &exports_nfsd_operations, S_IRUGO},
1389		[NFSD_Export_features] = {"export_features",
1390					&export_features_fops, S_IRUGO},
1391		[NFSD_FO_UnlockIP] = {"unlock_ip",
1392					&transaction_ops, S_IWUSR|S_IRUSR},
1393		[NFSD_FO_UnlockFS] = {"unlock_filesystem",
1394					&transaction_ops, S_IWUSR|S_IRUSR},
1395		[NFSD_Fh] = {"filehandle", &transaction_ops, S_IWUSR|S_IRUSR},
1396		[NFSD_Threads] = {"threads", &transaction_ops, S_IWUSR|S_IRUSR},
1397		[NFSD_Pool_Threads] = {"pool_threads", &transaction_ops, S_IWUSR|S_IRUSR},
1398		[NFSD_Pool_Stats] = {"pool_stats", &pool_stats_operations, S_IRUGO},
1399		[NFSD_Reply_Cache_Stats] = {"reply_cache_stats",
1400					&nfsd_reply_cache_stats_fops, S_IRUGO},
1401		[NFSD_Versions] = {"versions", &transaction_ops, S_IWUSR|S_IRUSR},
1402		[NFSD_Ports] = {"portlist", &transaction_ops, S_IWUSR|S_IRUGO},
1403		[NFSD_MaxBlkSize] = {"max_block_size", &transaction_ops, S_IWUSR|S_IRUGO},
1404		[NFSD_MaxConnections] = {"max_connections", &transaction_ops, S_IWUSR|S_IRUGO},
1405		[NFSD_Filecache] = {"filecache", &nfsd_file_cache_stats_fops, S_IRUGO},
1406#ifdef CONFIG_NFSD_V4
1407		[NFSD_Leasetime] = {"nfsv4leasetime", &transaction_ops, S_IWUSR|S_IRUSR},
1408		[NFSD_Gracetime] = {"nfsv4gracetime", &transaction_ops, S_IWUSR|S_IRUSR},
1409		[NFSD_RecoveryDir] = {"nfsv4recoverydir", &transaction_ops, S_IWUSR|S_IRUSR},
1410		[NFSD_V4EndGrace] = {"v4_end_grace", &transaction_ops, S_IWUSR|S_IRUGO},
1411#endif
1412		/* last one */ {""}
1413	};
1414
1415	ret = simple_fill_super(sb, 0x6e667364, nfsd_files);
1416	if (ret)
1417		return ret;
1418	_nfsd_symlink(sb->s_root, "supported_krb5_enctypes",
1419		      "/proc/net/rpc/gss_krb5_enctypes");
1420	dentry = nfsd_mkdir(sb->s_root, NULL, "clients");
1421	if (IS_ERR(dentry))
1422		return PTR_ERR(dentry);
1423	nn->nfsd_client_dir = dentry;
1424	return 0;
1425}
1426
1427static int nfsd_fs_get_tree(struct fs_context *fc)
1428{
1429	return get_tree_keyed(fc, nfsd_fill_super, get_net(fc->net_ns));
1430}
1431
1432static void nfsd_fs_free_fc(struct fs_context *fc)
1433{
1434	if (fc->s_fs_info)
1435		put_net(fc->s_fs_info);
1436}
1437
1438static const struct fs_context_operations nfsd_fs_context_ops = {
1439	.free		= nfsd_fs_free_fc,
1440	.get_tree	= nfsd_fs_get_tree,
1441};
1442
1443static int nfsd_init_fs_context(struct fs_context *fc)
1444{
1445	put_user_ns(fc->user_ns);
1446	fc->user_ns = get_user_ns(fc->net_ns->user_ns);
1447	fc->ops = &nfsd_fs_context_ops;
1448	return 0;
1449}
1450
1451static void nfsd_umount(struct super_block *sb)
1452{
1453	struct net *net = sb->s_fs_info;
1454
1455	nfsd_shutdown_threads(net);
1456
1457	kill_litter_super(sb);
1458	put_net(net);
1459}
1460
1461static struct file_system_type nfsd_fs_type = {
1462	.owner		= THIS_MODULE,
1463	.name		= "nfsd",
1464	.init_fs_context = nfsd_init_fs_context,
1465	.kill_sb	= nfsd_umount,
1466};
1467MODULE_ALIAS_FS("nfsd");
1468
1469#ifdef CONFIG_PROC_FS
1470
1471static int exports_proc_open(struct inode *inode, struct file *file)
1472{
1473	return exports_net_open(current->nsproxy->net_ns, file);
1474}
1475
1476static const struct proc_ops exports_proc_ops = {
1477	.proc_open	= exports_proc_open,
1478	.proc_read	= seq_read,
1479	.proc_lseek	= seq_lseek,
1480	.proc_release	= seq_release,
1481};
1482
1483static int create_proc_exports_entry(void)
1484{
1485	struct proc_dir_entry *entry;
1486
1487	entry = proc_mkdir("fs/nfs", NULL);
1488	if (!entry)
1489		return -ENOMEM;
1490	entry = proc_create("exports", 0, entry, &exports_proc_ops);
1491	if (!entry) {
1492		remove_proc_entry("fs/nfs", NULL);
1493		return -ENOMEM;
1494	}
1495	return 0;
1496}
1497#else /* CONFIG_PROC_FS */
1498static int create_proc_exports_entry(void)
1499{
1500	return 0;
1501}
1502#endif
1503
1504unsigned int nfsd_net_id;
1505
1506/**
1507 * nfsd_net_init - Prepare the nfsd_net portion of a new net namespace
1508 * @net: a freshly-created network namespace
1509 *
1510 * This information stays around as long as the network namespace is
1511 * alive whether or not there is an NFSD instance running in the
1512 * namespace.
1513 *
1514 * Returns zero on success, or a negative errno otherwise.
1515 */
1516static __net_init int nfsd_net_init(struct net *net)
1517{
1518	int retval;
1519	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
1520
1521	retval = nfsd_export_init(net);
1522	if (retval)
1523		goto out_export_error;
1524	retval = nfsd_idmap_init(net);
1525	if (retval)
1526		goto out_idmap_error;
1527	retval = nfsd_net_reply_cache_init(nn);
1528	if (retval)
1529		goto out_repcache_error;
1530	nn->nfsd_versions = NULL;
1531	nn->nfsd4_minorversions = NULL;
1532	nfsd4_init_leases_net(nn);
1533	get_random_bytes(&nn->siphash_key, sizeof(nn->siphash_key));
1534	seqlock_init(&nn->writeverf_lock);
1535
1536	return 0;
1537
1538out_repcache_error:
1539	nfsd_idmap_shutdown(net);
1540out_idmap_error:
1541	nfsd_export_shutdown(net);
1542out_export_error:
1543	return retval;
1544}
1545
1546/**
1547 * nfsd_net_exit - Release the nfsd_net portion of a net namespace
1548 * @net: a network namespace that is about to be destroyed
1549 *
1550 */
1551static __net_exit void nfsd_net_exit(struct net *net)
1552{
1553	struct nfsd_net *nn = net_generic(net, nfsd_net_id);
1554
1555	nfsd_net_reply_cache_destroy(nn);
1556	nfsd_idmap_shutdown(net);
1557	nfsd_export_shutdown(net);
1558	nfsd_netns_free_versions(nn);
1559}
1560
1561static struct pernet_operations nfsd_net_ops = {
1562	.init = nfsd_net_init,
1563	.exit = nfsd_net_exit,
1564	.id   = &nfsd_net_id,
1565	.size = sizeof(struct nfsd_net),
1566};
1567
1568static int __init init_nfsd(void)
1569{
1570	int retval;
1571
1572	retval = nfsd4_init_slabs();
1573	if (retval)
1574		return retval;
1575	retval = nfsd4_init_pnfs();
1576	if (retval)
1577		goto out_free_slabs;
1578	retval = nfsd_stat_init();	/* Statistics */
1579	if (retval)
1580		goto out_free_pnfs;
1581	retval = nfsd_drc_slab_create();
1582	if (retval)
1583		goto out_free_stat;
1584	nfsd_lockd_init();	/* lockd->nfsd callbacks */
1585	retval = create_proc_exports_entry();
1586	if (retval)
1587		goto out_free_lockd;
1588	retval = register_pernet_subsys(&nfsd_net_ops);
1589	if (retval < 0)
1590		goto out_free_exports;
1591	retval = register_cld_notifier();
1592	if (retval)
1593		goto out_free_subsys;
1594	retval = nfsd4_create_laundry_wq();
1595	if (retval)
1596		goto out_free_cld;
1597	retval = register_filesystem(&nfsd_fs_type);
1598	if (retval)
1599		goto out_free_all;
1600	return 0;
1601out_free_all:
1602	nfsd4_destroy_laundry_wq();
1603out_free_cld:
1604	unregister_cld_notifier();
1605out_free_subsys:
1606	unregister_pernet_subsys(&nfsd_net_ops);
1607out_free_exports:
1608	remove_proc_entry("fs/nfs/exports", NULL);
1609	remove_proc_entry("fs/nfs", NULL);
1610out_free_lockd:
1611	nfsd_lockd_shutdown();
1612	nfsd_drc_slab_free();
1613out_free_stat:
1614	nfsd_stat_shutdown();
1615out_free_pnfs:
1616	nfsd4_exit_pnfs();
1617out_free_slabs:
1618	nfsd4_free_slabs();
1619	return retval;
1620}
1621
1622static void __exit exit_nfsd(void)
1623{
1624	unregister_filesystem(&nfsd_fs_type);
1625	nfsd4_destroy_laundry_wq();
1626	unregister_cld_notifier();
1627	unregister_pernet_subsys(&nfsd_net_ops);
1628	nfsd_drc_slab_free();
1629	remove_proc_entry("fs/nfs/exports", NULL);
1630	remove_proc_entry("fs/nfs", NULL);
1631	nfsd_stat_shutdown();
1632	nfsd_lockd_shutdown();
1633	nfsd4_free_slabs();
1634	nfsd4_exit_pnfs();
1635}
1636
1637MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>");
1638MODULE_DESCRIPTION("In-kernel NFS server");
1639MODULE_LICENSE("GPL");
1640module_init(init_nfsd)
1641module_exit(exit_nfsd)
1642