[Midnightbsd-cvs] src [9921] trunk/sys/nfsserver: tag

laffer1 at midnightbsd.org laffer1 at midnightbsd.org
Fri May 25 09:03:02 EDT 2018


Revision: 9921
          http://svnweb.midnightbsd.org/src/?rev=9921
Author:   laffer1
Date:     2018-05-25 09:03:01 -0400 (Fri, 25 May 2018)
Log Message:
-----------
tag

Modified Paths:
--------------
    trunk/sys/nfsserver/nfs.h
    trunk/sys/nfsserver/nfs_fha_old.c
    trunk/sys/nfsserver/nfs_fha_old.h
    trunk/sys/nfsserver/nfs_serv.c
    trunk/sys/nfsserver/nfs_srvkrpc.c
    trunk/sys/nfsserver/nfs_srvsubs.c
    trunk/sys/nfsserver/nfsm_subs.h
    trunk/sys/nfsserver/nfsrvcache.h
    trunk/sys/nfsserver/nfsrvstats.h

Modified: trunk/sys/nfsserver/nfs.h
===================================================================
--- trunk/sys/nfsserver/nfs.h	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfs.h	2018-05-25 13:03:01 UTC (rev 9921)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1989, 1993, 1995
  *	The Regents of the University of California.  All rights reserved.
@@ -30,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)nfs.h	8.4 (Berkeley) 5/1/95
- * $MidnightBSD$
+ * $FreeBSD: stable/10/sys/nfsserver/nfs.h 241896 2012-10-22 17:50:54Z kib $
  */
 
 #ifndef _NFSSERVER_NFS_H_
@@ -268,7 +269,7 @@
 	    struct mbuf **mrq);
 int	nfsrv_create(struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
 	    struct mbuf **mrq);
-int	nfsrv_fhtovp(fhandle_t *, int, struct vnode **, int *,
+int	nfsrv_fhtovp(fhandle_t *, int, struct vnode **,
 	    struct nfsrv_descript *, struct nfssvc_sock *, struct sockaddr *,
 	    int *);
 int	nfsrv_setpublicfs(struct mount *, struct netexport *,

Modified: trunk/sys/nfsserver/nfs_fha_old.c
===================================================================
--- trunk/sys/nfsserver/nfs_fha_old.c	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfs_fha_old.c	2018-05-25 13:03:01 UTC (rev 9921)
@@ -26,7 +26,7 @@
  */
 
 #include <sys/cdefs.h>
-__FBSDID("$FreeBSD$");
+__FBSDID("$FreeBSD: stable/10/sys/nfsserver/nfs_fha_old.c 261049 2014-01-22 23:48:15Z mav $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -50,7 +50,7 @@
 static void fhaold_uninit(void *foo);
 rpcproc_t fhaold_get_procnum(rpcproc_t procnum);
 int fhaold_realign(struct mbuf **mb, int malloc_flags);
-int fhaold_get_fh(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
+int fhaold_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos);
 int fhaold_is_read(rpcproc_t procnum);
 int fhaold_is_write(rpcproc_t procnum);
 int fhaold_get_offset(struct mbuf **md, caddr_t *dpos, int v3,
@@ -136,9 +136,33 @@
 }
 
 int
-fhaold_get_fh(fhandle_t *fh, int v3, struct mbuf **md, caddr_t *dpos)
+fhaold_get_fh(uint64_t *fh, int v3, struct mbuf **md, caddr_t *dpos)
 {
-	return (nfsm_srvmtofh_xx(fh, v3, md, dpos));
+	u_int32_t *tl;
+	uint8_t *buf;
+	uint64_t t;
+	int fhlen, i;
+
+	if (v3) {
+		tl = nfsm_dissect_xx_nonblock(NFSX_UNSIGNED, md, dpos);
+		if (tl == NULL)
+			return EBADRPC;
+		fhlen = fxdr_unsigned(int, *tl);
+		if (fhlen != 0 && fhlen != NFSX_V3FH)
+			return EBADRPC;
+	} else {
+		fhlen = NFSX_V2FH;
+	}
+	t = 0;
+	if (fhlen != 0) {
+		buf = nfsm_dissect_xx_nonblock(fhlen, md, dpos);
+		if (buf == NULL)
+			return EBADRPC;
+		for (i = 0; i < fhlen; i++)
+			t ^= ((uint64_t)buf[i] << (i & 7) * 8);
+	}
+	*fh = t;
+	return 0;
 }
 
 int

Modified: trunk/sys/nfsserver/nfs_fha_old.h
===================================================================
--- trunk/sys/nfsserver/nfs_fha_old.h	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfs_fha_old.h	2018-05-25 13:03:01 UTC (rev 9921)
@@ -24,7 +24,7 @@
  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  * SUCH DAMAGE.
  */
-/* $FreeBSD$ */
+/* $FreeBSD: stable/10/sys/nfsserver/nfs_fha_old.h 249592 2013-04-17 21:00:22Z ken $ */
 
 #ifndef	_NFS_FHA_OLD_H
 #define	_NFS_FHA_OLD_H 1
@@ -37,41 +37,3 @@
 #endif /* _KERNEL */
 
 #endif /* _NFS_FHA_OLD_H */
-/*-
- * Copyright (c) 2008 Isilon Inc http://www.isilon.com/
- * Copyright (c) 2013 Spectra Logic Corporation
- *
- * 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.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR 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 AUTHOR 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_FHA_OLD_H
-#define	_NFS_FHA_OLD_H 1
-
-#ifdef	_KERNEL
-
-#define	FHAOLD_SERVER_NAME	"nfsrv"
-
-SVCTHREAD *fhaold_assign(SVCTHREAD *this_thread, struct svc_req *req);
-#endif /* _KERNEL */
-
-#endif /* _NFS_FHA_OLD_H */

Modified: trunk/sys/nfsserver/nfs_serv.c
===================================================================
--- trunk/sys/nfsserver/nfs_serv.c	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfs_serv.c	2018-05-25 13:03:01 UTC (rev 9921)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1989, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -33,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/sys/nfsserver/nfs_serv.c 276500 2015-01-01 10:44:20Z kib $");
 
 /*
  * nfs version 2 and 3 server calls to vnode ops
@@ -87,6 +88,7 @@
 #include <sys/sysctl.h>
 #include <sys/bio.h>
 #include <sys/buf.h>
+#include <sys/rwlock.h>
 
 #include <vm/vm.h>
 #include <vm/vm_extern.h>
@@ -162,32 +164,6 @@
 }
 
 /*
- * Takes two vfslocked integers and returns with at most one
- * reference to giant.  The return value indicates whether giant
- * is held by either lock.  This simplifies nfsrv ops by allowing
- * them to track only one vfslocked var.
- */
-static __inline int
-nfsrv_lockedpair(int vfs1, int vfs2)
-{
-
-	if (vfs1 && vfs2)
-		VFS_UNLOCK_GIANT(vfs2);
-
-	return (vfs1 | vfs2);
-}
-
-static __inline int
-nfsrv_lockedpair_nd(int vfs1, struct nameidata *nd)
-{
-	int vfs2;
-
-	vfs2 = NDHASGIANT(nd);
-
-	return nfsrv_lockedpair(vfs1, vfs2);
-}
-
-/*
  * Heuristic to detect sequential operation.
  */
 static struct nfsheur *
@@ -265,16 +241,14 @@
 	struct vattr vattr, *vap = &vattr;
 	u_long testmode, nfsmode;
 	int v3 = (nfsd->nd_flag & ND_NFSV3);
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	if (!v3)
 		panic("nfsrv3_access: v3 proc called on a v2 connection");
-	vfslocked = 0;
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
 	tl = nfsm_dissect_nonblock(u_int32_t *, NFSX_UNSIGNED);
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(NFSX_UNSIGNED);
 		nfsm_srvpostop_attr(1, NULL);
@@ -310,7 +284,6 @@
 nfsmout:
 	if (vp)
 		vput(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -334,13 +307,11 @@
 	caddr_t bpos;
 	int error = 0, rdonly;
 	struct mbuf *mb, *mreq;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(0);
 		error = 0;
@@ -362,7 +333,6 @@
 nfsmout:
 	if (vp)
 		vput(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -391,11 +361,8 @@
 	struct mbuf *mb, *mreq;
 	struct timespec guard = { 0, 0 };
 	struct mount *mp = NULL;
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
 	if ((mp = vfs_getvfs(&fhp->fh_fsid)) == NULL) {
@@ -402,7 +369,6 @@
 		error = ESTALE;
 		goto out;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	VATTR_NULL(vap);
@@ -448,8 +414,7 @@
 	/*
 	 * Now that we have all the fields, lets do it.
 	 */
-	error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly);
-	vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(2 * NFSX_UNSIGNED);
 		if (v3)
@@ -519,7 +484,6 @@
 	if (vp)
 		vput(vp);
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -544,12 +508,9 @@
 	int v3 = (nfsd->nd_flag & ND_NFSV3), pubflag;
 	struct mbuf *mb, *mreq;
 	struct vattr va, dirattr, *vap = &va;
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	ndclear(&nd);
-	vfslocked = 0;
 
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
@@ -559,10 +520,9 @@
 
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = LOOKUP;
-	nd.ni_cnd.cn_flags = LOCKLEAF | SAVESTART | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKLEAF | SAVESTART;
 	error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos,
 		&dirp, v3, &dirattr, &dirattr_ret, pubflag);
-	vfslocked = NDHASGIANT(&nd);
 
 	/*
 	 * namei failure, only dirp to cleanup.  Clear out garbarge from
@@ -609,14 +569,8 @@
 			    nfs_pub.np_index;
 			ind.ni_startdir = nd.ni_vp;
 			VREF(ind.ni_startdir);
-			ind.ni_cnd.cn_flags &= ~GIANTHELD;
-			tvfslocked = VFS_LOCK_GIANT(ind.ni_startdir->v_mount);
-			if (tvfslocked)
-				nd.ni_cnd.cn_flags |= GIANTHELD;
 			error = lookup(&ind);
 			ind.ni_dvp = NULL;
-			vfslocked = nfsrv_lockedpair_nd(vfslocked, &ind);
-			ind.ni_cnd.cn_flags &= ~GIANTHELD;
 
 			if (error == 0) {
 				/*
@@ -703,7 +657,6 @@
 			vrele(ndp->ni_startdir);
 	}
 	NDFREE(&nd, NDF_ONLY_PNBUF);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -731,10 +684,8 @@
 	nfsfh_t nfh;
 	fhandle_t *fhp;
 	struct uio io, *uiop = &io;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 #ifndef nolint
 	mp = NULL;
 #endif
@@ -744,8 +695,8 @@
 	len = 0;
 	i = 0;
 	while (len < NFS_MAXPATHLEN) {
-		MGET(nmp, M_WAIT, MT_DATA);
-		MCLGET(nmp, M_WAIT);
+		MGET(nmp, M_WAITOK, MT_DATA);
+		MCLGET(nmp, M_WAITOK);
 		nmp->m_len = NFSMSIZ(nmp);
 		if (len == 0)
 			mp3 = mp = nmp;
@@ -770,7 +721,7 @@
 	uiop->uio_rw = UIO_READ;
 	uiop->uio_segflg = UIO_SYSSPACE;
 	uiop->uio_td = NULL;
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(2 * NFSX_UNSIGNED);
 		if (v3)
@@ -809,7 +760,6 @@
 		m_freem(mp3);
 	if (vp)
 		vput(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -843,11 +793,8 @@
 	struct nfsheur *nh;
 	off_t off;
 	int ioflag = 0;
-	int vfslocked;
 
-
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
 	if (v3) {
@@ -865,7 +812,7 @@
 	 * as well.
 	 */
 
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		vp = NULL;
 		nfsm_reply(2 * NFSX_UNSIGNED);
@@ -933,8 +880,8 @@
 				i++;
 			}
 			if (left > 0) {
-				MGET(m, M_WAIT, MT_DATA);
-				MCLGET(m, M_WAIT);
+				MGET(m, M_WAITOK, MT_DATA);
+				MCLGET(m, M_WAITOK);
 				m->m_len = 0;
 				m2->m_next = m;
 				m2 = m;
@@ -965,6 +912,7 @@
 		uiop->uio_resid = len;
 		uiop->uio_rw = UIO_READ;
 		uiop->uio_segflg = UIO_SYSSPACE;
+		uiop->uio_td = NULL;
 		nh = nfsrv_sequential_heuristic(uiop, vp);
 		ioflag |= nh->nh_seqcount << IO_SEQSHIFT;
 		error = VOP_READ(vp, uiop, IO_NODELOCKED | ioflag, cred);
@@ -1004,7 +952,6 @@
 nfsmout:
 	if (vp)
 		vput(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -1040,11 +987,8 @@
 	struct uio io, *uiop = &io;
 	off_t off;
 	struct mount *mntp = NULL;
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	if (mrep == NULL) {
 		*mrq = NULL;
 		error = 0;
@@ -1056,7 +1000,6 @@
 		error = ESTALE;
 		goto ereply;
 	}
-	vfslocked = VFS_LOCK_GIANT(mntp);
 	(void) vn_start_write(NULL, &mntp, V_WAIT);
 	vfs_rel(mntp);		/* The write holds a ref. */
 	if (v3) {
@@ -1112,8 +1055,7 @@
 		error = 0;
 		goto nfsmout;
 	}
-	error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly);
-	vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		vp = NULL;
 		nfsm_reply(2 * NFSX_UNSIGNED);
@@ -1226,7 +1168,6 @@
 	if (vp)
 		vput(vp);
 	vn_finished_write(mntp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -1258,11 +1199,8 @@
 	u_quad_t tempsize;
 	struct timespec cverf;
 	struct mount *mp = NULL;
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 #ifndef nolint
 	rdev = 0;
 #endif
@@ -1274,7 +1212,6 @@
 		error = ESTALE;
 		goto ereply;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvnamesiz(len);
@@ -1281,7 +1218,7 @@
 
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = CREATE;
-	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART | NOCACHE;
 
 	/*
 	 * Call namei and do initial cleanup to get a few things
@@ -1294,7 +1231,6 @@
 	 */
 	error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos,
 		&dirp, v3, &dirfor, &dirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
 	if (dirp && !v3) {
 		vrele(dirp);
 		dirp = NULL;
@@ -1430,13 +1366,8 @@
 			nd.ni_cnd.cn_flags &= ~(LOCKPARENT);
 			nd.ni_cnd.cn_thread = curthread;
 			nd.ni_cnd.cn_cred = cred;
-			tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount);
-			if (tvfslocked)
-				nd.ni_cnd.cn_flags |= GIANTHELD;
 			error = lookup(&nd);
 			nd.ni_dvp = NULL;
-			vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
-			nd.ni_cnd.cn_flags &= ~GIANTHELD;
 			if (error)
 				goto ereply;
 
@@ -1524,7 +1455,6 @@
 		vrele(dirp);
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -1554,11 +1484,8 @@
 	fhandle_t *fhp;
 	struct mount *mp = NULL;
 	int v3 = (nfsd->nd_flag & ND_NFSV3);
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	if (!v3)
 		panic("nfsrv_mknod: v3 proc called on a v2 connection");
 	ndclear(&nd);
@@ -1569,7 +1496,6 @@
 		error = ESTALE;
 		goto ereply;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvnamesiz(len);
@@ -1576,7 +1502,7 @@
 
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = CREATE;
-	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | SAVESTART | NOCACHE;
 
 	/*
 	 * Handle nfs_namei() call.  If an error occurs, the nd structure
@@ -1586,7 +1512,6 @@
 
 	error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos,
 		&dirp, v3, &dirfor, &dirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
 	if (error) {
 		nfsm_reply(NFSX_WCCDATA(1));
 		nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
@@ -1646,13 +1571,8 @@
 		nd.ni_cnd.cn_flags &= ~(LOCKPARENT);
 		nd.ni_cnd.cn_thread = td;
 		nd.ni_cnd.cn_cred = td->td_ucred;
-		tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount);
-		if (tvfslocked)
-			nd.ni_cnd.cn_flags |= GIANTHELD;
 		error = lookup(&nd);
 		nd.ni_dvp = NULL;
-		vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
-		nd.ni_cnd.cn_flags &= ~GIANTHELD;
 
 		if (error)
 			goto out;
@@ -1704,7 +1624,6 @@
 		nfsm_srvwcc_data(dirfor_ret, &dirfor, diraft_ret, &diraft);
 	}
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return (0);
 nfsmout:
 	if (nd.ni_dvp) {
@@ -1721,7 +1640,6 @@
 		vrele(nd.ni_startdir);
 	NDFREE(&nd, NDF_ONLY_PNBUF);
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -1746,11 +1664,9 @@
 	nfsfh_t nfh;
 	fhandle_t *fhp;
 	struct mount *mp = NULL;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	ndclear(&nd);
-	vfslocked = 0;
 
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
@@ -1758,7 +1674,6 @@
 		error = ESTALE;
 		goto ereply;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvnamesiz(len);
@@ -1765,10 +1680,9 @@
 
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = DELETE;
-	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF;
 	error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos,
 		&dirp, v3,  &dirfor, &dirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
 	if (dirp && !v3) {
 		vrele(dirp);
 		dirp = NULL;
@@ -1830,7 +1744,6 @@
 	if (nd.ni_vp)
 		vput(nd.ni_vp);
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -1858,10 +1771,8 @@
 	fhandle_t *ffhp, *tfhp;
 	uid_t saved_uid;
 	struct mount *mp = NULL;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 #ifndef nolint
 	fvp = NULL;
 #endif
@@ -1880,7 +1791,6 @@
 		error = ESTALE;
 		goto out1;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvnamesiz(len);
@@ -1891,10 +1801,9 @@
 	saved_uid = cred->cr_uid;
 	fromnd.ni_cnd.cn_cred = cred;
 	fromnd.ni_cnd.cn_nameiop = DELETE;
-	fromnd.ni_cnd.cn_flags = WANTPARENT | SAVESTART | MPSAFE;
+	fromnd.ni_cnd.cn_flags = WANTPARENT | SAVESTART;
 	error = nfs_namei(&fromnd, nfsd, ffhp, len, slp, nam, &md,
 		&dpos, &fdirp, v3, &fdirfor, &fdirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &fromnd);
 	if (fdirp && !v3) {
 		vrele(fdirp);
 		fdirp = NULL;
@@ -1914,10 +1823,9 @@
 	cred->cr_uid = saved_uid;
 	tond.ni_cnd.cn_cred = cred;
 	tond.ni_cnd.cn_nameiop = RENAME;
-	tond.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART | MPSAFE;
+	tond.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | NOCACHE | SAVESTART;
 	error = nfs_namei(&tond, nfsd, tfhp, len2, slp, nam, &md,
 		&dpos, &tdirp, v3, &tdirfor, &tdirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &tond);
 	if (tdirp && !v3) {
 		vrele(tdirp);
 		tdirp = NULL;
@@ -2063,7 +1971,6 @@
 		vrele(fromnd.ni_vp);
 
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -2088,12 +1995,9 @@
 	nfsfh_t nfh, dnfh;
 	fhandle_t *fhp, *dfhp;
 	struct mount *mp = NULL;
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	ndclear(&nd);
-	vfslocked = 0;
 
 	fhp = &nfh.fh_generic;
 	dfhp = &dnfh.fh_generic;
@@ -2102,14 +2006,12 @@
 		error = ESTALE;
 		goto ereply;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvmtofh(dfhp);
 	nfsm_srvnamesiz(len);
 
-	error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly);
-	vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(NFSX_POSTOPATTR(v3) + NFSX_WCCDATA(v3));
 		if (v3) {
@@ -2129,10 +2031,9 @@
 	VOP_UNLOCK(vp, 0);
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = CREATE;
-	nd.ni_cnd.cn_flags = LOCKPARENT | MPSAFE | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKPARENT | NOCACHE;
 	error = nfs_namei(&nd, nfsd, dfhp, len, slp, nam, &md, &dpos,
 		&dirp, v3, &dirfor, &dirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
 	if (dirp && !v3) {
 		vrele(dirp);
 		dirp = NULL;
@@ -2210,7 +2111,6 @@
 	if (nd.ni_vp)
 		vrele(nd.ni_vp);
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -2239,12 +2139,9 @@
 	nfsfh_t nfh;
 	fhandle_t *fhp;
 	struct mount *mp = NULL;
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	ndclear(&nd);
-	vfslocked = 0;
 
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
@@ -2252,16 +2149,14 @@
 		error = ESTALE;
 		goto out;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvnamesiz(len);
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = CREATE;
-	nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKPARENT | SAVESTART | NOCACHE;
 	error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos,
 		&dirp, v3, &dirfor, &dirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
 	if (error == 0) {
 		VATTR_NULL(vap);
 		if (v3)
@@ -2327,13 +2222,8 @@
 		nd.ni_cnd.cn_flags |= (NOFOLLOW | LOCKLEAF);
 		nd.ni_cnd.cn_thread = curthread;
 		nd.ni_cnd.cn_cred = cred;
-		tvfslocked = VFS_LOCK_GIANT(nd.ni_startdir->v_mount);
-		if (tvfslocked)
-			nd.ni_cnd.cn_flags |= GIANTHELD;
 		error = lookup(&nd);
 		nd.ni_dvp = NULL;
-		vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
-		nd.ni_cnd.cn_flags &= ~GIANTHELD;
 
 		if (error == 0) {
 			bzero((caddr_t)fhp, sizeof(nfh));
@@ -2393,7 +2283,6 @@
 		free(pathcp, M_TEMP);
 
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -2422,11 +2311,9 @@
 	nfsfh_t nfh;
 	fhandle_t *fhp;
 	struct mount *mp = NULL;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	ndclear(&nd);
-	vfslocked = 0;
 
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
@@ -2434,17 +2321,15 @@
 		error = ESTALE;
 		goto out;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvnamesiz(len);
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = CREATE;
-	nd.ni_cnd.cn_flags = LOCKPARENT | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKPARENT | NOCACHE;
 
 	error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos,
 		&dirp, v3, &dirfor, &dirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
 	if (dirp && !v3) {
 		vrele(dirp);
 		dirp = NULL;
@@ -2556,7 +2441,6 @@
 	if (dirp)
 		vrele(dirp);
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -2581,11 +2465,9 @@
 	fhandle_t *fhp;
 	struct nameidata nd;
 	struct mount *mp = NULL;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	ndclear(&nd);
-	vfslocked = 0;
 
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
@@ -2593,16 +2475,14 @@
 		error = ESTALE;
 		goto out;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	nfsm_srvnamesiz(len);
 	nd.ni_cnd.cn_cred = cred;
 	nd.ni_cnd.cn_nameiop = DELETE;
-	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF | MPSAFE;
+	nd.ni_cnd.cn_flags = LOCKPARENT | LOCKLEAF;
 	error = nfs_namei(&nd, nfsd, fhp, len, slp, nam, &md, &dpos,
 		&dirp, v3, &dirfor, &dirfor_ret, FALSE);
-	vfslocked = nfsrv_lockedpair_nd(vfslocked, &nd);
 	if (dirp && !v3) {
 		vrele(dirp);
 		dirp = NULL;
@@ -2680,7 +2560,6 @@
 		vrele(dirp);
 
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -2749,10 +2628,9 @@
 	int v3 = (nfsd->nd_flag & ND_NFSV3);
 	u_quad_t off, toff, verf;
 	u_long *cookies = NULL, *cookiep; /* needs to be int64_t or off_t */
-	int vfslocked, not_zfs;
+	int is_ufs;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
 	if (v3) {
@@ -2775,7 +2653,7 @@
 	if (siz > xfer)
 		siz = xfer;
 	fullsiz = siz;
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (!error && vp->v_type != VDIR) {
 		error = ENOTDIR;
 		vput(vp);
@@ -2813,7 +2691,7 @@
 		error = 0;
 		goto nfsmout;
 	}
-	not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs") != 0;
+	is_ufs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "ufs") == 0;
 	VOP_UNLOCK(vp, 0);
 
 	/*
@@ -2900,12 +2778,10 @@
 	 * skip over the records that precede the requested offset. This
 	 * requires the assumption that file offset cookies monotonically
 	 * increase.
-	 * Since the offset cookies don't monotonically increase for ZFS,
-	 * this is not done when ZFS is the file system.
 	 */
 	while (cpos < cend && ncookies > 0 &&
 		(dp->d_fileno == 0 || dp->d_type == DT_WHT ||
-		 (not_zfs != 0 && ((u_quad_t)(*cookiep)) <= toff))) {
+		 (is_ufs == 1 && ((u_quad_t)(*cookiep)) <= toff))) {
 		cpos += dp->d_reclen;
 		dp = (struct dirent *)cpos;
 		cookiep++;
@@ -3015,7 +2891,6 @@
 nfsmout:
 	if (vp)
 		vrele(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -3049,13 +2924,12 @@
 	u_quad_t off, toff, verf;
 	u_long *cookies = NULL, *cookiep; /* needs to be int64_t or off_t */
 	int v3 = (nfsd->nd_flag & ND_NFSV3);
-	int usevget = 1, vfslocked;
+	int usevget = 1;
 	struct componentname cn;
 	struct mount *mntp = NULL;
-	int not_zfs;
+	int is_ufs;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	vp_locked = 0;
 	if (!v3)
 		panic("nfsrv_readdirplus: v3 proc called on a v2 connection");
@@ -3076,7 +2950,7 @@
 	if (siz > xfer)
 		siz = xfer;
 	fullsiz = siz;
-	error = nfsrv_fhtovp(fhp, NFSRV_FLAG_BUSY, &vp, &vfslocked, nfsd, slp,
+	error = nfsrv_fhtovp(fhp, NFSRV_FLAG_BUSY, &vp, nfsd, slp,
 	    nam, &rdonly);
 	if (!error) {
 		vp_locked = 1;
@@ -3113,7 +2987,7 @@
 		error = 0;
 		goto nfsmout;
 	}
-	not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs") != 0;
+	is_ufs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "ufs") == 0;
 	VOP_UNLOCK(vp, 0);
 	vp_locked = 0;
 	rbuf = malloc(siz, M_TEMP, M_WAITOK);
@@ -3193,12 +3067,10 @@
 	 * skip over the records that precede the requested offset. This
 	 * requires the assumption that file offset cookies monotonically
 	 * increase.
-	 * Since the offset cookies don't monotonically increase for ZFS,
-	 * this is not done when ZFS is the file system.
 	 */
 	while (cpos < cend && ncookies > 0 &&
 		(dp->d_fileno == 0 || dp->d_type == DT_WHT ||
-		 (not_zfs != 0 && ((u_quad_t)(*cookiep)) <= toff))) {
+		 (is_ufs == 1 && ((u_quad_t)(*cookiep)) <= toff))) {
 		cpos += dp->d_reclen;
 		dp = (struct dirent *)cpos;
 		cookiep++;
@@ -3245,7 +3117,7 @@
 					usevget = 0;
 					cn.cn_nameiop = LOOKUP;
 					cn.cn_flags = ISLASTCN | NOFOLLOW | \
-					    LOCKSHARED | LOCKLEAF | MPSAFE;
+					    LOCKSHARED | LOCKLEAF;
 					cn.cn_lkflags = LK_SHARED | LK_RETRY;
 					cn.cn_cred = cred;
 					cn.cn_thread = curthread;
@@ -3393,7 +3265,6 @@
 		vrele(vp);
 	if (mntp)
 		vfs_unbusy(mntp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -3419,11 +3290,8 @@
 	u_quad_t off;
 	struct mount *mp = NULL;
 	int v3 = (nfsd->nd_flag & ND_NFSV3);
-	int tvfslocked;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	if (!v3)
 		panic("nfsrv_commit: v3 proc called on a v2 connection");
 	fhp = &nfh.fh_generic;
@@ -3432,7 +3300,6 @@
 		error = ESTALE;
 		goto ereply;
 	}
-	vfslocked = VFS_LOCK_GIANT(mp);
 	(void) vn_start_write(NULL, &mp, V_WAIT);
 	vfs_rel(mp);		/* The write holds a ref. */
 	tl = nfsm_dissect_nonblock(u_int32_t *, 3 * NFSX_UNSIGNED);
@@ -3444,8 +3311,7 @@
 	off = fxdr_hyper(tl);
 	tl += 2;
 	cnt = fxdr_unsigned(int, *tl);
-	error = nfsrv_fhtovp(fhp, 0, &vp, &tvfslocked, nfsd, slp, nam, &rdonly);
-	vfslocked = nfsrv_lockedpair(vfslocked, tvfslocked);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(2 * NFSX_UNSIGNED);
 		nfsm_srvwcc_data(for_ret, &bfor, aft_ret, &aft);
@@ -3454,15 +3320,20 @@
 	}
 	for_ret = VOP_GETATTR(vp, &bfor, cred);
 
-	if (cnt > MAX_COMMIT_COUNT) {
+	/*
+	 * RFC 1813 3.3.21: if count is 0, a flush from offset to the end of file
+	 * is done.  At this time VOP_FSYNC does not accept offset and byte count
+	 * parameters so call VOP_FSYNC the whole file for now.
+	 */
+	if (cnt == 0 || cnt > MAX_COMMIT_COUNT) {
 		/*
 		 * Give up and do the whole thing
 		 */
 		if (vp->v_object &&
 		   (vp->v_object->flags & OBJ_MIGHTBEDIRTY)) {
-			VM_OBJECT_LOCK(vp->v_object);
+			VM_OBJECT_WLOCK(vp->v_object);
 			vm_object_page_clean(vp->v_object, 0, 0, OBJPC_SYNC);
-			VM_OBJECT_UNLOCK(vp->v_object);
+			VM_OBJECT_WUNLOCK(vp->v_object);
 		}
 		error = VOP_FSYNC(vp, MNT_WAIT, curthread);
 	} else {
@@ -3491,10 +3362,10 @@
 
 		if (vp->v_object &&
 		   (vp->v_object->flags & OBJ_MIGHTBEDIRTY)) {
-			VM_OBJECT_LOCK(vp->v_object);
+			VM_OBJECT_WLOCK(vp->v_object);
 			vm_object_page_clean(vp->v_object, off, off + cnt,
 			    OBJPC_SYNC);
-			VM_OBJECT_UNLOCK(vp->v_object);
+			VM_OBJECT_WUNLOCK(vp->v_object);
 		}
 
 		bo = &vp->v_bufobj;
@@ -3514,7 +3385,7 @@
 			 */
 			if ((bp = gbincore(&vp->v_bufobj, lblkno)) != NULL) {
 				if (BUF_LOCK(bp, LK_EXCLUSIVE | LK_SLEEPFAIL |
-				    LK_INTERLOCK, BO_MTX(bo)) == ENOLCK) {
+				    LK_INTERLOCK, BO_LOCKPTR(bo)) == ENOLCK) {
 					BO_LOCK(bo);
 					continue; /* retry */
 				}
@@ -3556,7 +3427,6 @@
 	if (vp)
 		vput(vp);
 	vn_finished_write(mp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -3583,13 +3453,11 @@
 	fhandle_t *fhp;
 	struct statfs statfs;
 	u_quad_t tval;
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
-	vfslocked = 0;
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(NFSX_UNSIGNED);
 		if (v3)
@@ -3649,7 +3517,6 @@
 nfsmout:
 	if (vp)
 		vput(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -3675,15 +3542,13 @@
 	u_quad_t maxfsize;
 	struct statfs sb;
 	int v3 = (nfsd->nd_flag & ND_NFSV3);
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	if (!v3)
 		panic("nfsrv_fsinfo: v3 proc called on a v2 connection");
 	fhp = &nfh.fh_generic;
-	vfslocked = 0;
 	nfsm_srvmtofh(fhp);
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(NFSX_UNSIGNED);
 		nfsm_srvpostop_attr(getret, &at);
@@ -3724,7 +3589,6 @@
 nfsmout:
 	if (vp)
 		vput(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -3749,15 +3613,13 @@
 	nfsfh_t nfh;
 	fhandle_t *fhp;
 	int v3 = (nfsd->nd_flag & ND_NFSV3);
-	int vfslocked;
 
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 	if (!v3)
 		panic("nfsrv_pathconf: v3 proc called on a v2 connection");
-	vfslocked = 0;
 	fhp = &nfh.fh_generic;
 	nfsm_srvmtofh(fhp);
-	error = nfsrv_fhtovp(fhp, 0, &vp, &vfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &vp, nfsd, slp, nam, &rdonly);
 	if (error) {
 		nfsm_reply(NFSX_UNSIGNED);
 		nfsm_srvpostop_attr(getret, &at);
@@ -3797,7 +3659,6 @@
 nfsmout:
 	if (vp)
 		vput(vp);
-	VFS_UNLOCK_GIANT(vfslocked);
 	return(error);
 }
 
@@ -3866,8 +3727,6 @@
 	struct vattr vattr;
 	int error;
 
-	VFS_ASSERT_GIANT(vp->v_mount);
-
 	nfsdbprintf(("%s %d\n", __FILE__, __LINE__));
 
 	if (accmode & VWRITE) {

Modified: trunk/sys/nfsserver/nfs_srvkrpc.c
===================================================================
--- trunk/sys/nfsserver/nfs_srvkrpc.c	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfs_srvkrpc.c	2018-05-25 13:03:01 UTC (rev 9921)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1989, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -33,13 +34,13 @@
  */
 
 #include <sys/cdefs.h>
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/sys/nfsserver/nfs_srvkrpc.c 280258 2015-03-19 13:37:36Z rwatson $");
 
 #include "opt_inet6.h"
 #include "opt_kgssapi.h"
 
 #include <sys/param.h>
-#include <sys/capability.h>
+#include <sys/capsicum.h>
 #include <sys/systm.h>
 #include <sys/sysproto.h>
 #include <sys/kernel.h>
@@ -168,6 +169,7 @@
 	struct file *fp;
 	struct nfsd_addsock_args addsockarg;
 	struct nfsd_nfsd_args nfsdarg;
+	cap_rights_t rights;
 	int error;
 
 	if (uap->flag & NFSSVC_ADDSOCK) {
@@ -175,7 +177,9 @@
 		    sizeof(addsockarg));
 		if (error)
 			return (error);
-		if ((error = fget(td, addsockarg.sock, CAP_SOCK_ALL, &fp)) != 0)
+		error = fget(td, addsockarg.sock,
+		    cap_rights_init(&rights, CAP_SOCK_SERVER), &fp);
+		if (error)
 			return (error);
 		if (fp->f_type != DTYPE_SOCKET) {
 			fdrop(fp, td);
@@ -218,7 +222,7 @@
 	if (err && (nd->nd_flag & ND_NFSV3) == 0)	/* XXX recheck */
 		siz = 0;
 
-	MGET(mreq, M_WAIT, MT_DATA);
+	MGET(mreq, M_WAITOK, MT_DATA);
 
 	/*
 	 * If this is a big reply, use a cluster
@@ -225,7 +229,7 @@
 	 */
 	mreq->m_len = 0;
 	if (siz >= MINCLSIZE) {
-		MCLGET(mreq, M_WAIT);
+		MCLGET(mreq, M_WAITOK);
 	}
 	mb = mreq;
 	bpos = mtod(mb, caddr_t);
@@ -279,7 +283,7 @@
 	mreq = mrep = NULL;
 	mreq = rqst->rq_args;
 	rqst->rq_args = NULL;
-	(void)nfs_realign(&mreq, M_WAIT);
+	(void)nfs_realign(&mreq, M_WAITOK);
 
 	/*
 	 * Note: we want rq_addr, not svc_getrpccaller for nd_nam2 -

Modified: trunk/sys/nfsserver/nfs_srvsubs.c
===================================================================
--- trunk/sys/nfsserver/nfs_srvsubs.c	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfs_srvsubs.c	2018-05-25 13:03:01 UTC (rev 9921)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1989, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -33,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__MBSDID("$MidnightBSD$");
+__FBSDID("$FreeBSD: stable/10/sys/nfsserver/nfs_srvsubs.c 245611 2013-01-18 18:43:38Z jhb $");
 
 /*
  * These functions support the macros and help fiddle mbuf chains for
@@ -594,11 +595,7 @@
 	int error, rdonly, linklen;
 	struct componentname *cnp = &ndp->ni_cnd;
 	int lockleaf = (cnp->cn_flags & LOCKLEAF) != 0;
-	int dvfslocked;
-	int vfslocked;
 
-	vfslocked = 0;
-	dvfslocked = 0;
 	*retdirp = NULL;
 	cnp->cn_flags |= NOMACCHECK;
 	cnp->cn_pnbuf = uma_zalloc(namei_zone, M_WAITOK);
@@ -645,10 +642,9 @@
 	/*
 	 * Extract and set starting directory.
 	 */
-	error = nfsrv_fhtovp(fhp, 0, &dp, &dvfslocked, nfsd, slp, nam, &rdonly);
+	error = nfsrv_fhtovp(fhp, 0, &dp, nfsd, slp, nam, &rdonly);
 	if (error)
 		goto out;
-	vfslocked = VFS_LOCK_GIANT(dp->v_mount);
 	if (dp->v_type != VDIR) {
 		vput(dp);
 		error = ENOTDIR;
@@ -726,14 +722,9 @@
 	if (pubflag) {
 		ndp->ni_rootdir = rootvnode;
 		ndp->ni_loopcnt = 0;
-		if (cnp->cn_pnbuf[0] == '/') {
-			int tvfslocked;
 
-			tvfslocked = VFS_LOCK_GIANT(rootvnode->v_mount);
-			VFS_UNLOCK_GIANT(vfslocked);
+		if (cnp->cn_pnbuf[0] == '/')
 			dp = rootvnode;
-			vfslocked = tvfslocked;
-		}
 	} else {
 		cnp->cn_flags |= NOCROSSMOUNT;
 	}
@@ -758,11 +749,7 @@
 		 * In either case ni_startdir will be dereferenced and NULLed
 		 * out.
 		 */
-		if (vfslocked)
-			ndp->ni_cnd.cn_flags |= GIANTHELD;
 		error = lookup(ndp);
-		vfslocked = (ndp->ni_cnd.cn_flags & GIANTHELD) != 0;
-		ndp->ni_cnd.cn_flags &= ~GIANTHELD;
 		if (error)
 			break;
 
@@ -860,10 +847,6 @@
 	}
 	if (!lockleaf)
 		cnp->cn_flags &= ~LOCKLEAF;
-	if (cnp->cn_flags & GIANTHELD) {
-		mtx_unlock(&Giant);
-		cnp->cn_flags &= ~GIANTHELD;
-	}
 
 	/*
 	 * nfs_namei() guarentees that fields will not contain garbage
@@ -877,21 +860,9 @@
 		ndp->ni_dvp = NULL;
 		ndp->ni_startdir = NULL;
 		cnp->cn_flags &= ~HASBUF;
-		VFS_UNLOCK_GIANT(vfslocked);
-		vfslocked = 0;
 	} else if ((ndp->ni_cnd.cn_flags & (WANTPARENT|LOCKPARENT)) == 0) {
 		ndp->ni_dvp = NULL;
 	}
-	/*
-	 * This differs from normal namei() in that even on failure we may
-	 * return with Giant held due to the dirp return.  Make sure we only
-	 * have not recursed however.  The calling code only expects to drop
-	 * one acquire.
-	 */
-	if (vfslocked || dvfslocked)
-		ndp->ni_cnd.cn_flags |= GIANTHELD;
-	if (vfslocked && dvfslocked)
-		VFS_UNLOCK_GIANT(vfslocked);
 	return (error);
 }
 
@@ -1055,7 +1026,7 @@
  *	- if cred->cr_uid == 0 or MNT_EXPORTANON set it to credanon
  */
 int
-nfsrv_fhtovp(fhandle_t *fhp, int flags, struct vnode **vpp, int *vfslockedp,
+nfsrv_fhtovp(fhandle_t *fhp, int flags, struct vnode **vpp,
     struct nfsrv_descript *nfsd, struct nfssvc_sock *slp,
     struct sockaddr *nam, int *rdonlyp)
 {
@@ -1067,13 +1038,11 @@
 	struct sockaddr_int *saddr;
 #endif
 	int credflavor;
-	int vfslocked;
 	int numsecflavors, *secflavors;
 	int authsys;
 	int v3 = nfsd->nd_flag & ND_NFSV3;
 	int mountreq;
 
-	*vfslockedp = 0;
 	*vpp = NULL;
 
 	if (nfs_ispublicfh(fhp)) {
@@ -1085,7 +1054,6 @@
 	mp = vfs_busyfs(&fhp->fh_fsid);
 	if (!mp)
 		return (ESTALE);
-	vfslocked = VFS_LOCK_GIANT(mp);
 	error = VFS_CHECKEXP(mp, nam, &exflags, &credanon,
 	    &numsecflavors, &secflavors);
 	if (error) {
@@ -1169,10 +1137,6 @@
 	if (credanon != NULL)
 		crfree(credanon);
 
-	if (error)
-		VFS_UNLOCK_GIANT(vfslocked);
-	else
-		*vfslockedp = vfslocked;
 	return (error);
 }
 
@@ -1338,8 +1302,8 @@
 	if (*bp >= *be) {
 		if (*mp == mb)
 			(*mp)->m_len += *bp - bpos;
-		MGET(nmp, M_WAIT, MT_DATA);
-		MCLGET(nmp, M_WAIT);
+		MGET(nmp, M_WAITOK, MT_DATA);
+		MCLGET(nmp, M_WAITOK);
 		nmp->m_len = NFSMSIZ(nmp);
 		(*mp)->m_next = nmp;
 		*mp = nmp;

Modified: trunk/sys/nfsserver/nfsm_subs.h
===================================================================
--- trunk/sys/nfsserver/nfsm_subs.h	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfsm_subs.h	2018-05-25 13:03:01 UTC (rev 9921)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1989, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -30,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)nfsm_subs.h	8.2 (Berkeley) 3/30/95
- * $MidnightBSD$
+ * $FreeBSD: stable/10/sys/nfsserver/nfsm_subs.h 184588 2008-11-03 10:38:00Z dfr $
  */
 
 #ifndef _NFSSERVER_NFSM_SUBS_H_

Modified: trunk/sys/nfsserver/nfsrvcache.h
===================================================================
--- trunk/sys/nfsserver/nfsrvcache.h	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfsrvcache.h	2018-05-25 13:03:01 UTC (rev 9921)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1989, 1993
  *	The Regents of the University of California.  All rights reserved.
@@ -30,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)nfsrvcache.h	8.3 (Berkeley) 3/30/95
- * $MidnightBSD$
+ * $FreeBSD: stable/10/sys/nfsserver/nfsrvcache.h 195202 2009-06-30 19:03:27Z dfr $
  */
 
 #ifndef _NFSSERVER_NFSRVCACHE_H_

Modified: trunk/sys/nfsserver/nfsrvstats.h
===================================================================
--- trunk/sys/nfsserver/nfsrvstats.h	2018-05-25 13:02:30 UTC (rev 9920)
+++ trunk/sys/nfsserver/nfsrvstats.h	2018-05-25 13:03:01 UTC (rev 9921)
@@ -1,3 +1,4 @@
+/* $MidnightBSD$ */
 /*-
  * Copyright (c) 1989, 1993, 1995
  *	The Regents of the University of California.  All rights reserved.
@@ -30,7 +31,7 @@
  * SUCH DAMAGE.
  *
  *	@(#)nfs.h	8.4 (Berkeley) 5/1/95
- * $MidnightBSD$
+ * $FreeBSD: stable/10/sys/nfsserver/nfsrvstats.h 139823 2005-01-07 01:45:51Z imp $
  */
 
 #ifndef _NFSSERVER_NFSRVSTATS_H_



More information about the Midnightbsd-cvs mailing list