diff options
author | rmacklem <rmacklem@FreeBSD.org> | 2009-04-07 19:06:51 +0000 |
---|---|---|
committer | rmacklem <rmacklem@FreeBSD.org> | 2009-04-07 19:06:51 +0000 |
commit | e716acd50bb631d8b1563cc620e4db9bcff31f25 (patch) | |
tree | 21d5ec5def55d9c82c5f0579ec9ada37f63e632f /sys/nfs | |
parent | f85239012864f6d182a68850423faca7a116834b (diff) | |
download | FreeBSD-src-e716acd50bb631d8b1563cc620e4db9bcff31f25.zip FreeBSD-src-e716acd50bb631d8b1563cc620e4db9bcff31f25.tar.gz |
Adding sys/nfs/nfssvc.h and sys/nfs/nfs_nfssvc.c in preparation for
sharing of the nfssvc() system call between nfsserver and the nfsv4
server. Building of nfs_nfssvc.c will be committed later, at the time
the .c files in sys/nfsserver are updated. To do so now would result in
nfssvc() multiply defined.
Submitted by: rmacklem
Reviewed by: dfr
Approved by: kib (mentor)
Diffstat (limited to 'sys/nfs')
-rw-r--r-- | sys/nfs/nfs_nfssvc.c | 153 | ||||
-rw-r--r-- | sys/nfs/nfssvc.h | 67 |
2 files changed, 220 insertions, 0 deletions
diff --git a/sys/nfs/nfs_nfssvc.c b/sys/nfs/nfs_nfssvc.c new file mode 100644 index 0000000..9379fbe --- /dev/null +++ b/sys/nfs/nfs_nfssvc.c @@ -0,0 +1,153 @@ +/*- + * Copyright (c) 1989, 1993 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Rick Macklem at The University of Guelph. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + */ + +#include <sys/cdefs.h> +__FBSDID("$FreeBSD$"); + +#include "opt_nfs.h" + +#include <sys/param.h> +#include <sys/systm.h> +#include <sys/sysproto.h> +#include <sys/kernel.h> +#include <sys/sysctl.h> +#include <sys/priv.h> +#include <sys/proc.h> +#include <sys/lock.h> +#include <sys/mutex.h> +#include <sys/module.h> +#include <sys/sysent.h> +#include <sys/syscall.h> +#include <sys/sysproto.h> + +#include <security/audit/audit.h> + +#include <nfs/nfssvc.h> + +static int nfssvc_offset = SYS_nfssvc; +static struct sysent nfssvc_prev_sysent; +MAKE_SYSENT(nfssvc); + +/* + * This tiny module simply handles the nfssvc() system call. The other + * nfs modules that use the system call register themselves by setting + * the nfsd_call_xxx function pointers non-NULL. + */ + +int (*nfsd_call_nfsserver)(struct thread *, struct nfssvc_args *) = NULL; +int (*nfsd_call_nfscommon)(struct thread *, struct nfssvc_args *) = NULL; +int (*nfsd_call_nfscl)(struct thread *, struct nfssvc_args *) = NULL; +int (*nfsd_call_nfsd)(struct thread *, struct nfssvc_args *) = NULL; + +/* + * Nfs server psuedo system call for the nfsd's + */ +int +nfssvc(struct thread *td, struct nfssvc_args *uap) +{ + int error; + + KASSERT(!mtx_owned(&Giant), ("nfssvc(): called with Giant")); + + AUDIT_ARG(cmd, uap->flag); + + error = priv_check(td, PRIV_NFS_DAEMON); + if (error) + return (error); + error = EINVAL; + if ((uap->flag & (NFSSVC_ADDSOCK | NFSSVC_OLDNFSD | NFSSVC_NFSD)) && + nfsd_call_nfsserver != NULL) + error = (*nfsd_call_nfsserver)(td, uap); + else if ((uap->flag & (NFSSVC_CBADDSOCK | NFSSVC_NFSCBD)) && + nfsd_call_nfscl != NULL) + error = (*nfsd_call_nfscl)(td, uap); + else if ((uap->flag & (NFSSVC_IDNAME | NFSSVC_GETSTATS | + NFSSVC_GSSDADDPORT | NFSSVC_GSSDADDFIRST | NFSSVC_GSSDDELETEALL | + NFSSVC_NFSUSERDPORT | NFSSVC_NFSUSERDDELPORT)) && + nfsd_call_nfscommon != NULL) + error = (*nfsd_call_nfscommon)(td, uap); + else if ((uap->flag & (NFSSVC_NFSDNFSD | NFSSVC_NFSDADDSOCK | + NFSSVC_PUBLICFH | NFSSVC_V4ROOTEXPORT | NFSSVC_NOPUBLICFH | + NFSSVC_STABLERESTART | NFSSVC_ADMINREVOKE | + NFSSVC_DUMPCLIENTS | NFSSVC_DUMPLOCKS)) && + nfsd_call_nfsd != NULL) + error = (*nfsd_call_nfsd)(td, uap); + if (error == EINTR || error == ERESTART) + error = 0; + return (error); +} + +/* + * Called once to initialize data structures... + */ +static int +nfssvc_modevent(module_t mod, int type, void *data) +{ + static int registered; + int error = 0; + + switch (type) { + case MOD_LOAD: + error = syscall_register(&nfssvc_offset, &nfssvc_sysent, + &nfssvc_prev_sysent); + if (error) + break; + registered = 1; + break; + + case MOD_UNLOAD: + if (nfsd_call_nfsserver != NULL || nfsd_call_nfscommon != NULL + || nfsd_call_nfscl != NULL || nfsd_call_nfsd != NULL) { + error = EBUSY; + break; + } + if (registered) + syscall_deregister(&nfssvc_offset, &nfssvc_prev_sysent); + registered = 0; + break; + default: + error = EOPNOTSUPP; + break; + } + return error; +} +static moduledata_t nfssvc_mod = { + "nfssvc", + nfssvc_modevent, + NULL, +}; +DECLARE_MODULE(nfssvc, nfssvc_mod, SI_SUB_VFS, SI_ORDER_ANY); + +/* So that loader and kldload(2) can find us, wherever we are.. */ +MODULE_VERSION(nfssvc, 1); + diff --git a/sys/nfs/nfssvc.h b/sys/nfs/nfssvc.h new file mode 100644 index 0000000..5578240 --- /dev/null +++ b/sys/nfs/nfssvc.h @@ -0,0 +1,67 @@ +/*- + * Copyright (c) 1989, 1993, 1995 + * The Regents of the University of California. All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Rick Macklem at The University of Guelph. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * $FreeBSD$ + */ + +#ifndef _NFS_NFSSVC_H_ +#define _NFS_NFSSVC_H_ + +/* + * Flags for nfssvc() system call. + */ +#define NFSSVC_OLDNFSD 0x004 +#define NFSSVC_ADDSOCK 0x008 +#define NFSSVC_NFSD 0x010 + +/* + * and ones for nfsv4. + */ +#define NFSSVC_NOPUBLICFH 0x00000020 +#define NFSSVC_STABLERESTART 0x00000040 +#define NFSSVC_NFSDNFSD 0x00000080 +#define NFSSVC_NFSDADDSOCK 0x00000100 +#define NFSSVC_IDNAME 0x00000200 +#define NFSSVC_GSSDDELETEALL 0x00000400 +#define NFSSVC_GSSDADDPORT 0x00000800 +#define NFSSVC_NFSUSERDPORT 0x00001000 +#define NFSSVC_NFSUSERDDELPORT 0x00002000 +#define NFSSVC_V4ROOTEXPORT 0x00004000 +#define NFSSVC_ADMINREVOKE 0x00008000 +#define NFSSVC_DUMPCLIENTS 0x00010000 +#define NFSSVC_DUMPLOCKS 0x00020000 +#define NFSSVC_GSSDADDFIRST 0x00040000 +#define NFSSVC_PUBLICFH 0x00080000 +#define NFSSVC_NFSCBD 0x00100000 +#define NFSSVC_CBADDSOCK 0x00200000 +#define NFSSVC_GETSTATS 0x00400000 + +#endif /* _NFS_NFSSVC_H */ |