[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