summaryrefslogtreecommitdiffstats
path: root/sys/nfs
diff options
context:
space:
mode:
authorrmacklem <rmacklem@FreeBSD.org>2009-04-07 19:06:51 +0000
committerrmacklem <rmacklem@FreeBSD.org>2009-04-07 19:06:51 +0000
commite716acd50bb631d8b1563cc620e4db9bcff31f25 (patch)
tree21d5ec5def55d9c82c5f0579ec9ada37f63e632f /sys/nfs
parentf85239012864f6d182a68850423faca7a116834b (diff)
downloadFreeBSD-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.c153
-rw-r--r--sys/nfs/nfssvc.h67
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 */
OpenPOWER on IntegriCloud