1 // SPDX-License-Identifier: GPL-2.0-only
3 * Syscall interface to knfsd.
5 * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>
8 #include <linux/slab.h>
9 #include <linux/namei.h>
10 #include <linux/ctype.h>
11 #include <linux/fs_context.h>
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/gss_krb5_enctypes.h>
18 #include <linux/sunrpc/rpc_pipe_fs.h>
19 #include <linux/module.h>
20 #include <linux/fsnotify.h>
30 * We have a single directory with several nodes in it.
42 NFSD_Reply_Cache_Stats
,
47 NFSD_SupportedEnctypes
,
49 * The below MUST come last. Otherwise we leave a hole in nfsd_files[]
50 * with !CONFIG_NFSD_V4 and simple_fill_super() goes oops
62 * write() for these nodes.
64 static ssize_t
write_filehandle(struct file
*file
, char *buf
, size_t size
);
65 static ssize_t
write_unlock_ip(struct file
*file
, char *buf
, size_t size
);
66 static ssize_t
write_unlock_fs(struct file
*file
, char *buf
, size_t size
);
67 static ssize_t
write_threads(struct file
*file
, char *buf
, size_t size
);
68 static ssize_t
write_pool_threads(struct file
*file
, char *buf
, size_t size
);
69 static ssize_t
write_versions(struct file
*file
, char *buf
, size_t size
);
70 static ssize_t
write_ports(struct file
*file
, char *buf
, size_t size
);
71 static ssize_t
write_maxblksize(struct file
*file
, char *buf
, size_t size
);
72 static ssize_t
write_maxconn(struct file
*file
, char *buf
, size_t size
);
74 static ssize_t
write_leasetime(struct file
*file
, char *buf
, size_t size
);
75 static ssize_t
write_gracetime(struct file
*file
, char *buf
, size_t size
);
76 static ssize_t
write_recoverydir(struct file
*file
, char *buf
, size_t size
);
77 static ssize_t
write_v4_end_grace(struct file
*file
, char *buf
, size_t size
);
80 static ssize_t (*const write_op
[])(struct file
*, char *, size_t) = {
81 [NFSD_Fh
] = write_filehandle
,
82 [NFSD_FO_UnlockIP
] = write_unlock_ip
,
83 [NFSD_FO_UnlockFS
] = write_unlock_fs
,
84 [NFSD_Threads
] = write_threads
,
85 [NFSD_Pool_Threads
] = write_pool_threads
,
86 [NFSD_Versions
] = write_versions
,
87 [NFSD_Ports
] = write_ports
,
88 [NFSD_MaxBlkSize
] = write_maxblksize
,
89 [NFSD_MaxConnections
] = write_maxconn
,
91 [NFSD_Leasetime
] = write_leasetime
,
92 [NFSD_Gracetime
] = write_gracetime
,
93 [NFSD_RecoveryDir
] = write_recoverydir
,
94 [NFSD_V4EndGrace
] = write_v4_end_grace
,
98 static ssize_t
nfsctl_transaction_write(struct file
*file
, const char __user
*buf
, size_t size
, loff_t
*pos
)
100 ino_t ino
= file_inode(file
)->i_ino
;
104 if (ino
>= ARRAY_SIZE(write_op
) || !write_op
[ino
])
107 data
= simple_transaction_get(file
, buf
, size
);
109 return PTR_ERR(data
);
111 rv
= write_op
[ino
](file
, data
, size
);
113 simple_transaction_set(file
, rv
);
119 static ssize_t
nfsctl_transaction_read(struct file
*file
, char __user
*buf
, size_t size
, loff_t
*pos
)
121 if (! file
->private_data
) {
122 /* An attempt to read a transaction file without writing
123 * causes a 0-byte write so that the file can return
126 ssize_t rv
= nfsctl_transaction_write(file
, buf
, 0, pos
);
130 return simple_transaction_read(file
, buf
, size
, pos
);
133 static const struct file_operations transaction_ops
= {
134 .write
= nfsctl_transaction_write
,
135 .read
= nfsctl_transaction_read
,
136 .release
= simple_transaction_release
,
137 .llseek
= default_llseek
,
140 static int exports_net_open(struct net
*net
, struct file
*file
)
143 struct seq_file
*seq
;
144 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
146 err
= seq_open(file
, &nfs_exports_op
);
150 seq
= file
->private_data
;
151 seq
->private = nn
->svc_export_cache
;
155 static int exports_proc_open(struct inode
*inode
, struct file
*file
)
157 return exports_net_open(current
->nsproxy
->net_ns
, file
);
160 static const struct proc_ops exports_proc_ops
= {
161 .proc_open
= exports_proc_open
,
162 .proc_read
= seq_read
,
163 .proc_lseek
= seq_lseek
,
164 .proc_release
= seq_release
,
167 static int exports_nfsd_open(struct inode
*inode
, struct file
*file
)
169 return exports_net_open(inode
->i_sb
->s_fs_info
, file
);
172 static const struct file_operations exports_nfsd_operations
= {
173 .open
= exports_nfsd_open
,
176 .release
= seq_release
,
179 static int export_features_show(struct seq_file
*m
, void *v
)
181 seq_printf(m
, "0x%x 0x%x\n", NFSEXP_ALLFLAGS
, NFSEXP_SECINFO_FLAGS
);
185 static int export_features_open(struct inode
*inode
, struct file
*file
)
187 return single_open(file
, export_features_show
, NULL
);
190 static const struct file_operations export_features_operations
= {
191 .open
= export_features_open
,
194 .release
= single_release
,
197 #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE)
198 static int supported_enctypes_show(struct seq_file
*m
, void *v
)
200 seq_printf(m
, KRB5_SUPPORTED_ENCTYPES
);
204 static int supported_enctypes_open(struct inode
*inode
, struct file
*file
)
206 return single_open(file
, supported_enctypes_show
, NULL
);
209 static const struct file_operations supported_enctypes_ops
= {
210 .open
= supported_enctypes_open
,
213 .release
= single_release
,
215 #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */
217 static const struct file_operations pool_stats_operations
= {
218 .open
= nfsd_pool_stats_open
,
221 .release
= nfsd_pool_stats_release
,
224 static const struct file_operations reply_cache_stats_operations
= {
225 .open
= nfsd_reply_cache_stats_open
,
228 .release
= single_release
,
231 /*----------------------------------------------------------------------------*/
233 * payload - write methods
236 static inline struct net
*netns(struct file
*file
)
238 return file_inode(file
)->i_sb
->s_fs_info
;
242 * write_unlock_ip - Release all locks used by a client
247 * buf: '\n'-terminated C string containing a
248 * presentation format IP address
249 * size: length of C string in @buf
251 * On success: returns zero if all specified locks were released;
252 * returns one if one or more locks were not released
253 * On error: return code is negative errno value
255 static ssize_t
write_unlock_ip(struct file
*file
, char *buf
, size_t size
)
257 struct sockaddr_storage address
;
258 struct sockaddr
*sap
= (struct sockaddr
*)&address
;
259 size_t salen
= sizeof(address
);
261 struct net
*net
= netns(file
);
267 if (buf
[size
-1] != '\n')
271 if (qword_get(&buf
, fo_path
, size
) < 0)
274 if (rpc_pton(net
, fo_path
, size
, sap
, salen
) == 0)
277 return nlmsvc_unlock_all_by_ip(sap
);
281 * write_unlock_fs - Release all locks on a local file system
286 * buf: '\n'-terminated C string containing the
287 * absolute pathname of a local file system
288 * size: length of C string in @buf
290 * On success: returns zero if all specified locks were released;
291 * returns one if one or more locks were not released
292 * On error: return code is negative errno value
294 static ssize_t
write_unlock_fs(struct file
*file
, char *buf
, size_t size
)
304 if (buf
[size
-1] != '\n')
308 if (qword_get(&buf
, fo_path
, size
) < 0)
311 error
= kern_path(fo_path
, 0, &path
);
316 * XXX: Needs better sanity checking. Otherwise we could end up
317 * releasing locks on the wrong file system.
320 * 1. Does the path refer to a directory?
321 * 2. Is that directory a mount point, or
322 * 3. Is that directory the root of an exported file system?
324 error
= nlmsvc_unlock_all_by_sb(path
.dentry
->d_sb
);
331 * write_filehandle - Get a variable-length NFS file handle by path
333 * On input, the buffer contains a '\n'-terminated C string comprised of
334 * three alphanumeric words separated by whitespace. The string may
335 * contain escape sequences.
339 * domain: client domain name
340 * path: export pathname
341 * maxsize: numeric maximum size of
343 * size: length of C string in @buf
345 * On success: passed-in buffer filled with '\n'-terminated C
346 * string containing a ASCII hex text version
347 * of the NFS file handle;
348 * return code is the size in bytes of the string
349 * On error: return code is negative errno value
351 static ssize_t
write_filehandle(struct file
*file
, char *buf
, size_t size
)
357 struct auth_domain
*dom
;
363 if (buf
[size
-1] != '\n')
368 len
= qword_get(&mesg
, dname
, size
);
373 len
= qword_get(&mesg
, path
, size
);
377 len
= get_int(&mesg
, &maxsize
);
381 if (maxsize
< NFS_FHSIZE
)
383 maxsize
= min(maxsize
, NFS3_FHSIZE
);
385 if (qword_get(&mesg
, mesg
, size
)>0)
388 /* we have all the words, they are in buf.. */
389 dom
= unix_domain_find(dname
);
393 len
= exp_rootfh(netns(file
), dom
, path
, &fh
, maxsize
);
394 auth_domain_put(dom
);
399 len
= SIMPLE_TRANSACTION_LIMIT
;
400 qword_addhex(&mesg
, &len
, (char*)&fh
.fh_base
, fh
.fh_size
);
406 * write_threads - Start NFSD, or report the current number of running threads
412 * On success: passed-in buffer filled with '\n'-terminated C
413 * string numeric value representing the number of
414 * running NFSD threads;
415 * return code is the size in bytes of the string
416 * On error: return code is zero
421 * buf: C string containing an unsigned
422 * integer value representing the
423 * number of NFSD threads to start
424 * size: non-zero length of C string in @buf
426 * On success: NFS service is started;
427 * passed-in buffer filled with '\n'-terminated C
428 * string numeric value representing the number of
429 * running NFSD threads;
430 * return code is the size in bytes of the string
431 * On error: return code is zero or a negative errno value
433 static ssize_t
write_threads(struct file
*file
, char *buf
, size_t size
)
437 struct net
*net
= netns(file
);
441 rv
= get_int(&mesg
, &newthreads
);
446 rv
= nfsd_svc(newthreads
, net
, file
->f_cred
);
450 rv
= nfsd_nrthreads(net
);
452 return scnprintf(buf
, SIMPLE_TRANSACTION_LIMIT
, "%d\n", rv
);
456 * write_pool_threads - Set or report the current number of threads per pool
465 * buf: C string containing whitespace-
466 * separated unsigned integer values
467 * representing the number of NFSD
468 * threads to start in each pool
469 * size: non-zero length of C string in @buf
471 * On success: passed-in buffer filled with '\n'-terminated C
472 * string containing integer values representing the
473 * number of NFSD threads in each pool;
474 * return code is the size in bytes of the string
475 * On error: return code is zero or a negative errno value
477 static ssize_t
write_pool_threads(struct file
*file
, char *buf
, size_t size
)
479 /* if size > 0, look for an array of number of threads per node
480 * and apply them then write out number of threads per node as reply
488 struct net
*net
= netns(file
);
490 mutex_lock(&nfsd_mutex
);
491 npools
= nfsd_nrpools(net
);
494 * NFS is shut down. The admin can start it by
495 * writing to the threads file but NOT the pool_threads
496 * file, sorry. Report zero threads.
498 mutex_unlock(&nfsd_mutex
);
503 nthreads
= kcalloc(npools
, sizeof(int), GFP_KERNEL
);
505 if (nthreads
== NULL
)
509 for (i
= 0; i
< npools
; i
++) {
510 rv
= get_int(&mesg
, &nthreads
[i
]);
512 break; /* fewer numbers than pools */
514 goto out_free
; /* syntax error */
519 rv
= nfsd_set_nrthreads(i
, nthreads
, net
);
524 rv
= nfsd_get_nrthreads(npools
, nthreads
, net
);
529 size
= SIMPLE_TRANSACTION_LIMIT
;
530 for (i
= 0; i
< npools
&& size
> 0; i
++) {
531 snprintf(mesg
, size
, "%d%c", nthreads
[i
], (i
== npools
-1 ? '\n' : ' '));
539 mutex_unlock(&nfsd_mutex
);
544 nfsd_print_version_support(struct nfsd_net
*nn
, char *buf
, int remaining
,
545 const char *sep
, unsigned vers
, int minor
)
547 const char *format
= minor
< 0 ? "%s%c%u" : "%s%c%u.%u";
548 bool supported
= !!nfsd_vers(nn
, vers
, NFSD_TEST
);
550 if (vers
== 4 && minor
>= 0 &&
551 !nfsd_minorversion(nn
, minor
, NFSD_TEST
))
553 if (minor
== 0 && supported
)
555 * special case for backward compatability.
556 * +4.0 is never reported, it is implied by
557 * +4, unless -4.0 is present.
560 return snprintf(buf
, remaining
, format
, sep
,
561 supported
? '+' : '-', vers
, minor
);
564 static ssize_t
__write_versions(struct file
*file
, char *buf
, size_t size
)
567 char *vers
, *minorp
, sign
;
568 int len
, num
, remaining
;
571 struct nfsd_net
*nn
= net_generic(netns(file
), nfsd_net_id
);
575 /* Cannot change versions without updating
576 * nn->nfsd_serv->sv_xdrsize, and reallocing
577 * rq_argp and rq_resp
580 if (buf
[size
-1] != '\n')
585 len
= qword_get(&mesg
, vers
, size
);
586 if (len
<= 0) return -EINVAL
;
591 if (sign
== '+' || sign
== '-')
592 num
= simple_strtol((vers
+1), &minorp
, 0);
594 num
= simple_strtol(vers
, &minorp
, 0);
595 if (*minorp
== '.') {
598 if (kstrtouint(minorp
+1, 0, &minor
) < 0)
602 cmd
= sign
== '-' ? NFSD_CLEAR
: NFSD_SET
;
606 nfsd_vers(nn
, num
, cmd
);
609 if (*minorp
== '.') {
610 if (nfsd_minorversion(nn
, minor
, cmd
) < 0)
612 } else if ((cmd
== NFSD_SET
) != nfsd_vers(nn
, num
, NFSD_TEST
)) {
614 * Either we have +4 and no minors are enabled,
615 * or we have -4 and at least one minor is enabled.
616 * In either case, propagate 'cmd' to all minors.
619 while (nfsd_minorversion(nn
, minor
, cmd
) >= 0)
627 } while ((len
= qword_get(&mesg
, vers
, size
)) > 0);
628 /* If all get turned off, turn them back on, as
629 * having no versions is BAD
631 nfsd_reset_versions(nn
);
634 /* Now write current state into reply buffer */
637 remaining
= SIMPLE_TRANSACTION_LIMIT
;
638 for (num
=2 ; num
<= 4 ; num
++) {
640 if (!nfsd_vers(nn
, num
, NFSD_AVAIL
))
645 len
= nfsd_print_version_support(nn
, buf
, remaining
,
647 if (len
>= remaining
)
655 } while (num
== 4 && minor
<= NFSD_SUPPORTED_MINOR_VERSION
);
658 len
= snprintf(buf
, remaining
, "\n");
659 if (len
>= remaining
)
665 * write_versions - Set or report the available NFS protocol versions
671 * On success: passed-in buffer filled with '\n'-terminated C
672 * string containing positive or negative integer
673 * values representing the current status of each
675 * return code is the size in bytes of the string
676 * On error: return code is zero or a negative errno value
681 * buf: C string containing whitespace-
682 * separated positive or negative
683 * integer values representing NFS
684 * protocol versions to enable ("+n")
686 * size: non-zero length of C string in @buf
688 * On success: status of zero or more protocol versions has
689 * been updated; passed-in buffer filled with
690 * '\n'-terminated C string containing positive
691 * or negative integer values representing the
692 * current status of each protocol version;
693 * return code is the size in bytes of the string
694 * On error: return code is zero or a negative errno value
696 static ssize_t
write_versions(struct file
*file
, char *buf
, size_t size
)
700 mutex_lock(&nfsd_mutex
);
701 rv
= __write_versions(file
, buf
, size
);
702 mutex_unlock(&nfsd_mutex
);
707 * Zero-length write. Return a list of NFSD's current listener
710 static ssize_t
__write_ports_names(char *buf
, struct net
*net
)
712 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
714 if (nn
->nfsd_serv
== NULL
)
716 return svc_xprt_names(nn
->nfsd_serv
, buf
, SIMPLE_TRANSACTION_LIMIT
);
720 * A single 'fd' number was written, in which case it must be for
721 * a socket of a supported family/protocol, and we use it as an
724 static ssize_t
__write_ports_addfd(char *buf
, struct net
*net
, const struct cred
*cred
)
728 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
730 err
= get_int(&mesg
, &fd
);
731 if (err
!= 0 || fd
< 0)
734 if (svc_alien_sock(net
, fd
)) {
735 printk(KERN_ERR
"%s: socket net is different to NFSd's one\n", __func__
);
739 err
= nfsd_create_serv(net
);
743 err
= svc_addsock(nn
->nfsd_serv
, fd
, buf
, SIMPLE_TRANSACTION_LIMIT
, cred
);
749 /* Decrease the count, but don't shut down the service */
750 nn
->nfsd_serv
->sv_nrthreads
--;
755 * A transport listener is added by writing it's transport name and
758 static ssize_t
__write_ports_addxprt(char *buf
, struct net
*net
, const struct cred
*cred
)
761 struct svc_xprt
*xprt
;
763 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
765 if (sscanf(buf
, "%15s %5u", transport
, &port
) != 2)
768 if (port
< 1 || port
> USHRT_MAX
)
771 err
= nfsd_create_serv(net
);
775 err
= svc_create_xprt(nn
->nfsd_serv
, transport
, net
,
776 PF_INET
, port
, SVC_SOCK_ANONYMOUS
, cred
);
780 err
= svc_create_xprt(nn
->nfsd_serv
, transport
, net
,
781 PF_INET6
, port
, SVC_SOCK_ANONYMOUS
, cred
);
782 if (err
< 0 && err
!= -EAFNOSUPPORT
)
785 /* Decrease the count, but don't shut down the service */
786 nn
->nfsd_serv
->sv_nrthreads
--;
789 xprt
= svc_find_xprt(nn
->nfsd_serv
, transport
, net
, PF_INET
, port
);
791 svc_close_xprt(xprt
);
799 static ssize_t
__write_ports(struct file
*file
, char *buf
, size_t size
,
803 return __write_ports_names(buf
, net
);
806 return __write_ports_addfd(buf
, net
, file
->f_cred
);
809 return __write_ports_addxprt(buf
, net
, file
->f_cred
);
815 * write_ports - Pass a socket file descriptor or transport name to listen on
821 * On success: passed-in buffer filled with a '\n'-terminated C
822 * string containing a whitespace-separated list of
823 * named NFSD listeners;
824 * return code is the size in bytes of the string
825 * On error: return code is zero or a negative errno value
830 * buf: C string containing an unsigned
831 * integer value representing a bound
832 * but unconnected socket that is to be
833 * used as an NFSD listener; listen(3)
834 * must be called for a SOCK_STREAM
835 * socket, otherwise it is ignored
836 * size: non-zero length of C string in @buf
838 * On success: NFS service is started;
839 * passed-in buffer filled with a '\n'-terminated C
840 * string containing a unique alphanumeric name of
842 * return code is the size in bytes of the string
843 * On error: return code is a negative errno value
848 * buf: C string containing a transport
849 * name and an unsigned integer value
850 * representing the port to listen on,
851 * separated by whitespace
852 * size: non-zero length of C string in @buf
854 * On success: returns zero; NFS service is started
855 * On error: return code is a negative errno value
857 static ssize_t
write_ports(struct file
*file
, char *buf
, size_t size
)
861 mutex_lock(&nfsd_mutex
);
862 rv
= __write_ports(file
, buf
, size
, netns(file
));
863 mutex_unlock(&nfsd_mutex
);
868 int nfsd_max_blksize
;
871 * write_maxblksize - Set or report the current NFS blksize
880 * buf: C string containing an unsigned
881 * integer value representing the new
883 * size: non-zero length of C string in @buf
885 * On success: passed-in buffer filled with '\n'-terminated C string
886 * containing numeric value of the current NFS blksize
888 * return code is the size in bytes of the string
889 * On error: return code is zero or a negative errno value
891 static ssize_t
write_maxblksize(struct file
*file
, char *buf
, size_t size
)
894 struct nfsd_net
*nn
= net_generic(netns(file
), nfsd_net_id
);
898 int rv
= get_int(&mesg
, &bsize
);
901 /* force bsize into allowed range and
902 * required alignment.
904 bsize
= max_t(int, bsize
, 1024);
905 bsize
= min_t(int, bsize
, NFSSVC_MAXBLKSIZE
);
907 mutex_lock(&nfsd_mutex
);
909 mutex_unlock(&nfsd_mutex
);
912 nfsd_max_blksize
= bsize
;
913 mutex_unlock(&nfsd_mutex
);
916 return scnprintf(buf
, SIMPLE_TRANSACTION_LIMIT
, "%d\n",
921 * write_maxconn - Set or report the current max number of connections
929 * buf: C string containing an unsigned
930 * integer value representing the new
931 * number of max connections
932 * size: non-zero length of C string in @buf
934 * On success: passed-in buffer filled with '\n'-terminated C string
935 * containing numeric value of max_connections setting
936 * for this net namespace;
937 * return code is the size in bytes of the string
938 * On error: return code is zero or a negative errno value
940 static ssize_t
write_maxconn(struct file
*file
, char *buf
, size_t size
)
943 struct nfsd_net
*nn
= net_generic(netns(file
), nfsd_net_id
);
944 unsigned int maxconn
= nn
->max_connections
;
947 int rv
= get_uint(&mesg
, &maxconn
);
951 nn
->max_connections
= maxconn
;
954 return scnprintf(buf
, SIMPLE_TRANSACTION_LIMIT
, "%u\n", maxconn
);
957 #ifdef CONFIG_NFSD_V4
958 static ssize_t
__nfsd4_write_time(struct file
*file
, char *buf
, size_t size
,
959 time64_t
*time
, struct nfsd_net
*nn
)
967 rv
= get_int(&mesg
, &i
);
971 * Some sanity checking. We don't have a reason for
972 * these particular numbers, but problems with the
974 * - Too short: the briefest network outage may
975 * cause clients to lose all their locks. Also,
976 * the frequent polling may be wasteful.
977 * - Too long: do you really want reboot recovery
978 * to take more than an hour? Or to make other
979 * clients wait an hour before being able to
980 * revoke a dead client's locks?
982 if (i
< 10 || i
> 3600)
987 return scnprintf(buf
, SIMPLE_TRANSACTION_LIMIT
, "%lld\n", *time
);
990 static ssize_t
nfsd4_write_time(struct file
*file
, char *buf
, size_t size
,
991 time64_t
*time
, struct nfsd_net
*nn
)
995 mutex_lock(&nfsd_mutex
);
996 rv
= __nfsd4_write_time(file
, buf
, size
, time
, nn
);
997 mutex_unlock(&nfsd_mutex
);
1002 * write_leasetime - Set or report the current NFSv4 lease time
1011 * buf: C string containing an unsigned
1012 * integer value representing the new
1013 * NFSv4 lease expiry time
1014 * size: non-zero length of C string in @buf
1016 * On success: passed-in buffer filled with '\n'-terminated C
1017 * string containing unsigned integer value of the
1018 * current lease expiry time;
1019 * return code is the size in bytes of the string
1020 * On error: return code is zero or a negative errno value
1022 static ssize_t
write_leasetime(struct file
*file
, char *buf
, size_t size
)
1024 struct nfsd_net
*nn
= net_generic(netns(file
), nfsd_net_id
);
1025 return nfsd4_write_time(file
, buf
, size
, &nn
->nfsd4_lease
, nn
);
1029 * write_gracetime - Set or report current NFSv4 grace period time
1031 * As above, but sets the time of the NFSv4 grace period.
1033 * Note this should never be set to less than the *previous*
1034 * lease-period time, but we don't try to enforce this. (In the common
1035 * case (a new boot), we don't know what the previous lease time was
1038 static ssize_t
write_gracetime(struct file
*file
, char *buf
, size_t size
)
1040 struct nfsd_net
*nn
= net_generic(netns(file
), nfsd_net_id
);
1041 return nfsd4_write_time(file
, buf
, size
, &nn
->nfsd4_grace
, nn
);
1044 static ssize_t
__write_recoverydir(struct file
*file
, char *buf
, size_t size
,
1045 struct nfsd_net
*nn
)
1054 if (size
> PATH_MAX
|| buf
[size
-1] != '\n')
1059 len
= qword_get(&mesg
, recdir
, size
);
1063 status
= nfs4_reset_recoverydir(recdir
);
1068 return scnprintf(buf
, SIMPLE_TRANSACTION_LIMIT
, "%s\n",
1069 nfs4_recoverydir());
1073 * write_recoverydir - Set or report the pathname of the recovery directory
1082 * buf: C string containing the pathname
1083 * of the directory on a local file
1084 * system containing permanent NFSv4
1086 * size: non-zero length of C string in @buf
1088 * On success: passed-in buffer filled with '\n'-terminated C string
1089 * containing the current recovery pathname setting;
1090 * return code is the size in bytes of the string
1091 * On error: return code is zero or a negative errno value
1093 static ssize_t
write_recoverydir(struct file
*file
, char *buf
, size_t size
)
1096 struct nfsd_net
*nn
= net_generic(netns(file
), nfsd_net_id
);
1098 mutex_lock(&nfsd_mutex
);
1099 rv
= __write_recoverydir(file
, buf
, size
, nn
);
1100 mutex_unlock(&nfsd_mutex
);
1105 * write_v4_end_grace - release grace period for nfsd's v4.x lock manager
1114 * size: non-zero length of C string in @buf
1116 * passed-in buffer filled with "Y" or "N" with a newline
1117 * and NULL-terminated C string. This indicates whether
1118 * the grace period has ended in the current net
1119 * namespace. Return code is the size in bytes of the
1120 * string. Writing a string that starts with 'Y', 'y', or
1121 * '1' to the file will end the grace period for nfsd's v4
1124 static ssize_t
write_v4_end_grace(struct file
*file
, char *buf
, size_t size
)
1126 struct nfsd_net
*nn
= net_generic(netns(file
), nfsd_net_id
);
1135 nfsd4_end_grace(nn
);
1142 return scnprintf(buf
, SIMPLE_TRANSACTION_LIMIT
, "%c\n",
1143 nn
->grace_ended
? 'Y' : 'N');
1148 /*----------------------------------------------------------------------------*/
1150 * populating the filesystem.
1153 /* Basically copying rpc_get_inode. */
1154 static struct inode
*nfsd_get_inode(struct super_block
*sb
, umode_t mode
)
1156 struct inode
*inode
= new_inode(sb
);
1159 /* Following advice from simple_fill_super documentation: */
1160 inode
->i_ino
= iunique(sb
, NFSD_MaxReserved
);
1161 inode
->i_mode
= mode
;
1162 inode
->i_atime
= inode
->i_mtime
= inode
->i_ctime
= current_time(inode
);
1163 switch (mode
& S_IFMT
) {
1165 inode
->i_fop
= &simple_dir_operations
;
1166 inode
->i_op
= &simple_dir_inode_operations
;
1174 static int __nfsd_mkdir(struct inode
*dir
, struct dentry
*dentry
, umode_t mode
, struct nfsdfs_client
*ncl
)
1176 struct inode
*inode
;
1178 inode
= nfsd_get_inode(dir
->i_sb
, mode
);
1182 inode
->i_private
= ncl
;
1183 kref_get(&ncl
->cl_ref
);
1185 d_add(dentry
, inode
);
1187 fsnotify_mkdir(dir
, dentry
);
1191 static struct dentry
*nfsd_mkdir(struct dentry
*parent
, struct nfsdfs_client
*ncl
, char *name
)
1193 struct inode
*dir
= parent
->d_inode
;
1194 struct dentry
*dentry
;
1198 dentry
= d_alloc_name(parent
, name
);
1201 ret
= __nfsd_mkdir(d_inode(parent
), dentry
, S_IFDIR
| 0600, ncl
);
1209 dentry
= ERR_PTR(ret
);
1213 static void clear_ncl(struct inode
*inode
)
1215 struct nfsdfs_client
*ncl
= inode
->i_private
;
1217 inode
->i_private
= NULL
;
1218 kref_put(&ncl
->cl_ref
, ncl
->cl_release
);
1221 static struct nfsdfs_client
*__get_nfsdfs_client(struct inode
*inode
)
1223 struct nfsdfs_client
*nc
= inode
->i_private
;
1226 kref_get(&nc
->cl_ref
);
1230 struct nfsdfs_client
*get_nfsdfs_client(struct inode
*inode
)
1232 struct nfsdfs_client
*nc
;
1234 inode_lock_shared(inode
);
1235 nc
= __get_nfsdfs_client(inode
);
1236 inode_unlock_shared(inode
);
1239 /* from __rpc_unlink */
1240 static void nfsdfs_remove_file(struct inode
*dir
, struct dentry
*dentry
)
1244 clear_ncl(d_inode(dentry
));
1246 ret
= simple_unlink(dir
, dentry
);
1252 static void nfsdfs_remove_files(struct dentry
*root
)
1254 struct dentry
*dentry
, *tmp
;
1256 list_for_each_entry_safe(dentry
, tmp
, &root
->d_subdirs
, d_child
) {
1257 if (!simple_positive(dentry
)) {
1258 WARN_ON_ONCE(1); /* I think this can't happen? */
1261 nfsdfs_remove_file(d_inode(root
), dentry
);
1265 /* XXX: cut'n'paste from simple_fill_super; figure out if we could share
1267 static int nfsdfs_create_files(struct dentry
*root
,
1268 const struct tree_descr
*files
)
1270 struct inode
*dir
= d_inode(root
);
1271 struct inode
*inode
;
1272 struct dentry
*dentry
;
1276 for (i
= 0; files
->name
&& files
->name
[0]; i
++, files
++) {
1279 dentry
= d_alloc_name(root
, files
->name
);
1282 inode
= nfsd_get_inode(d_inode(root
)->i_sb
,
1283 S_IFREG
| files
->mode
);
1288 inode
->i_fop
= files
->ops
;
1289 inode
->i_private
= __get_nfsdfs_client(dir
);
1290 d_add(dentry
, inode
);
1291 fsnotify_create(dir
, dentry
);
1296 nfsdfs_remove_files(root
);
1301 /* on success, returns positive number unique to that client. */
1302 struct dentry
*nfsd_client_mkdir(struct nfsd_net
*nn
,
1303 struct nfsdfs_client
*ncl
, u32 id
,
1304 const struct tree_descr
*files
)
1306 struct dentry
*dentry
;
1310 sprintf(name
, "%u", id
);
1312 dentry
= nfsd_mkdir(nn
->nfsd_client_dir
, ncl
, name
);
1313 if (IS_ERR(dentry
)) /* XXX: tossing errors? */
1315 ret
= nfsdfs_create_files(dentry
, files
);
1317 nfsd_client_rmdir(dentry
);
1323 /* Taken from __rpc_rmdir: */
1324 void nfsd_client_rmdir(struct dentry
*dentry
)
1326 struct inode
*dir
= d_inode(dentry
->d_parent
);
1327 struct inode
*inode
= d_inode(dentry
);
1331 nfsdfs_remove_files(dentry
);
1334 ret
= simple_rmdir(dir
, dentry
);
1336 fsnotify_rmdir(dir
, dentry
);
1342 static int nfsd_fill_super(struct super_block
*sb
, struct fs_context
*fc
)
1344 struct nfsd_net
*nn
= net_generic(current
->nsproxy
->net_ns
,
1346 struct dentry
*dentry
;
1349 static const struct tree_descr nfsd_files
[] = {
1350 [NFSD_List
] = {"exports", &exports_nfsd_operations
, S_IRUGO
},
1351 [NFSD_Export_features
] = {"export_features",
1352 &export_features_operations
, S_IRUGO
},
1353 [NFSD_FO_UnlockIP
] = {"unlock_ip",
1354 &transaction_ops
, S_IWUSR
|S_IRUSR
},
1355 [NFSD_FO_UnlockFS
] = {"unlock_filesystem",
1356 &transaction_ops
, S_IWUSR
|S_IRUSR
},
1357 [NFSD_Fh
] = {"filehandle", &transaction_ops
, S_IWUSR
|S_IRUSR
},
1358 [NFSD_Threads
] = {"threads", &transaction_ops
, S_IWUSR
|S_IRUSR
},
1359 [NFSD_Pool_Threads
] = {"pool_threads", &transaction_ops
, S_IWUSR
|S_IRUSR
},
1360 [NFSD_Pool_Stats
] = {"pool_stats", &pool_stats_operations
, S_IRUGO
},
1361 [NFSD_Reply_Cache_Stats
] = {"reply_cache_stats", &reply_cache_stats_operations
, S_IRUGO
},
1362 [NFSD_Versions
] = {"versions", &transaction_ops
, S_IWUSR
|S_IRUSR
},
1363 [NFSD_Ports
] = {"portlist", &transaction_ops
, S_IWUSR
|S_IRUGO
},
1364 [NFSD_MaxBlkSize
] = {"max_block_size", &transaction_ops
, S_IWUSR
|S_IRUGO
},
1365 [NFSD_MaxConnections
] = {"max_connections", &transaction_ops
, S_IWUSR
|S_IRUGO
},
1366 #if defined(CONFIG_SUNRPC_GSS) || defined(CONFIG_SUNRPC_GSS_MODULE)
1367 [NFSD_SupportedEnctypes
] = {"supported_krb5_enctypes", &supported_enctypes_ops
, S_IRUGO
},
1368 #endif /* CONFIG_SUNRPC_GSS or CONFIG_SUNRPC_GSS_MODULE */
1369 #ifdef CONFIG_NFSD_V4
1370 [NFSD_Leasetime
] = {"nfsv4leasetime", &transaction_ops
, S_IWUSR
|S_IRUSR
},
1371 [NFSD_Gracetime
] = {"nfsv4gracetime", &transaction_ops
, S_IWUSR
|S_IRUSR
},
1372 [NFSD_RecoveryDir
] = {"nfsv4recoverydir", &transaction_ops
, S_IWUSR
|S_IRUSR
},
1373 [NFSD_V4EndGrace
] = {"v4_end_grace", &transaction_ops
, S_IWUSR
|S_IRUGO
},
1378 ret
= simple_fill_super(sb
, 0x6e667364, nfsd_files
);
1381 dentry
= nfsd_mkdir(sb
->s_root
, NULL
, "clients");
1383 return PTR_ERR(dentry
);
1384 nn
->nfsd_client_dir
= dentry
;
1388 static int nfsd_fs_get_tree(struct fs_context
*fc
)
1390 return get_tree_keyed(fc
, nfsd_fill_super
, get_net(fc
->net_ns
));
1393 static void nfsd_fs_free_fc(struct fs_context
*fc
)
1396 put_net(fc
->s_fs_info
);
1399 static const struct fs_context_operations nfsd_fs_context_ops
= {
1400 .free
= nfsd_fs_free_fc
,
1401 .get_tree
= nfsd_fs_get_tree
,
1404 static int nfsd_init_fs_context(struct fs_context
*fc
)
1406 put_user_ns(fc
->user_ns
);
1407 fc
->user_ns
= get_user_ns(fc
->net_ns
->user_ns
);
1408 fc
->ops
= &nfsd_fs_context_ops
;
1412 static void nfsd_umount(struct super_block
*sb
)
1414 struct net
*net
= sb
->s_fs_info
;
1416 kill_litter_super(sb
);
1420 static struct file_system_type nfsd_fs_type
= {
1421 .owner
= THIS_MODULE
,
1423 .init_fs_context
= nfsd_init_fs_context
,
1424 .kill_sb
= nfsd_umount
,
1426 MODULE_ALIAS_FS("nfsd");
1428 int get_nfsdfs(struct net
*net
)
1430 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
1431 struct vfsmount
*mnt
;
1433 mnt
= vfs_kern_mount(&nfsd_fs_type
, SB_KERNMOUNT
, "nfsd", NULL
);
1435 return PTR_ERR(mnt
);
1440 #ifdef CONFIG_PROC_FS
1441 static int create_proc_exports_entry(void)
1443 struct proc_dir_entry
*entry
;
1445 entry
= proc_mkdir("fs/nfs", NULL
);
1448 entry
= proc_create("exports", 0, entry
, &exports_proc_ops
);
1450 remove_proc_entry("fs/nfs", NULL
);
1455 #else /* CONFIG_PROC_FS */
1456 static int create_proc_exports_entry(void)
1462 unsigned int nfsd_net_id
;
1464 static __net_init
int nfsd_init_net(struct net
*net
)
1467 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
1469 retval
= nfsd_export_init(net
);
1471 goto out_export_error
;
1472 retval
= nfsd_idmap_init(net
);
1474 goto out_idmap_error
;
1475 nn
->nfsd_versions
= NULL
;
1476 nn
->nfsd4_minorversions
= NULL
;
1477 retval
= nfsd_reply_cache_init(nn
);
1480 nn
->nfsd4_lease
= 90; /* default lease time */
1481 nn
->nfsd4_grace
= 90;
1482 nn
->somebody_reclaimed
= false;
1483 nn
->track_reclaim_completes
= false;
1484 nn
->clverifier_counter
= prandom_u32();
1485 nn
->clientid_base
= prandom_u32();
1486 nn
->clientid_counter
= nn
->clientid_base
+ 1;
1487 nn
->s2s_cp_cl_id
= nn
->clientid_counter
++;
1489 atomic_set(&nn
->ntf_refcnt
, 0);
1490 init_waitqueue_head(&nn
->ntf_wq
);
1491 seqlock_init(&nn
->boot_lock
);
1496 nfsd_idmap_shutdown(net
);
1498 nfsd_export_shutdown(net
);
1503 static __net_exit
void nfsd_exit_net(struct net
*net
)
1505 struct nfsd_net
*nn
= net_generic(net
, nfsd_net_id
);
1507 nfsd_reply_cache_shutdown(nn
);
1508 nfsd_idmap_shutdown(net
);
1509 nfsd_export_shutdown(net
);
1510 nfsd_netns_free_versions(net_generic(net
, nfsd_net_id
));
1513 static struct pernet_operations nfsd_net_ops
= {
1514 .init
= nfsd_init_net
,
1515 .exit
= nfsd_exit_net
,
1517 .size
= sizeof(struct nfsd_net
),
1520 static int __init
init_nfsd(void)
1523 printk(KERN_INFO
"Installing knfsd (copyright (C) 1996 okir@monad.swb.de).\n");
1525 retval
= register_pernet_subsys(&nfsd_net_ops
);
1528 retval
= register_cld_notifier();
1530 goto out_unregister_pernet
;
1531 retval
= nfsd4_init_slabs();
1533 goto out_unregister_notifier
;
1534 retval
= nfsd4_init_pnfs();
1536 goto out_free_slabs
;
1537 nfsd_stat_init(); /* Statistics */
1538 retval
= nfsd_drc_slab_create();
1541 nfsd_lockd_init(); /* lockd->nfsd callbacks */
1542 retval
= create_proc_exports_entry();
1544 goto out_free_lockd
;
1545 retval
= register_filesystem(&nfsd_fs_type
);
1550 remove_proc_entry("fs/nfs/exports", NULL
);
1551 remove_proc_entry("fs/nfs", NULL
);
1553 nfsd_lockd_shutdown();
1554 nfsd_drc_slab_free();
1556 nfsd_stat_shutdown();
1560 out_unregister_notifier
:
1561 unregister_cld_notifier();
1562 out_unregister_pernet
:
1563 unregister_pernet_subsys(&nfsd_net_ops
);
1567 static void __exit
exit_nfsd(void)
1569 nfsd_drc_slab_free();
1570 remove_proc_entry("fs/nfs/exports", NULL
);
1571 remove_proc_entry("fs/nfs", NULL
);
1572 nfsd_stat_shutdown();
1573 nfsd_lockd_shutdown();
1576 unregister_filesystem(&nfsd_fs_type
);
1577 unregister_cld_notifier();
1578 unregister_pernet_subsys(&nfsd_net_ops
);
1581 MODULE_AUTHOR("Olaf Kirch <okir@monad.swb.de>");
1582 MODULE_LICENSE("GPL");
1583 module_init(init_nfsd
)
1584 module_exit(exit_nfsd
)