svn commit: r190815 - head/sys/nfs

Rick Macklem rmacklem at FreeBSD.org
Tue Apr 7 12:06:53 PDT 2009


Author: rmacklem
Date: Tue Apr  7 19:06:51 2009
New Revision: 190815
URL: http://svn.freebsd.org/changeset/base/190815

Log:
  	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)

Added:
  head/sys/nfs/nfs_nfssvc.c   (contents, props changed)
  head/sys/nfs/nfssvc.h   (contents, props changed)

Added: head/sys/nfs/nfs_nfssvc.c
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/nfs/nfs_nfssvc.c	Tue Apr  7 19:06:51 2009	(r190815)
@@ -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);
+

Added: head/sys/nfs/nfssvc.h
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/sys/nfs/nfssvc.h	Tue Apr  7 19:06:51 2009	(r190815)
@@ -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 */


More information about the svn-src-head mailing list