Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 15 Dec 2010 12:46:53 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r216454 - head/sys/nfsserver
Message-ID:  <201012151246.oBFCkrdR052668@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Wed Dec 15 12:46:53 2010
New Revision: 216454
URL: http://svn.freebsd.org/changeset/base/216454

Log:
  VOP_ISLOCKED() should not be used to determine if the vnode is locked.
  Explicitely track the locked status of the vnode.
  
  Reviewed by:	pjd
  Tested by:	avg
  MFC after:	1 week

Modified:
  head/sys/nfsserver/nfs_serv.c

Modified: head/sys/nfsserver/nfs_serv.c
==============================================================================
--- head/sys/nfsserver/nfs_serv.c	Wed Dec 15 12:45:28 2010	(r216453)
+++ head/sys/nfsserver/nfs_serv.c	Wed Dec 15 12:46:53 2010	(r216454)
@@ -3037,6 +3037,7 @@ nfsrv_readdirplus(struct nfsrv_descript 
 	struct vattr va, at, *vap = &va;
 	struct nfs_fattr *fp;
 	int len, nlen, rem, xfer, tsiz, i, error = 0, error1, getret = 1;
+	int vp_locked;
 	int siz, cnt, fullsiz, eofflag, rdonly, dirlen, ncookies;
 	u_quad_t off, toff, verf;
 	u_long *cookies = NULL, *cookiep; /* needs to be int64_t or off_t */
@@ -3067,10 +3068,12 @@ nfsrv_readdirplus(struct nfsrv_descript 
 	fullsiz = siz;
 	error = nfsrv_fhtovp(fhp, 1, &vp, &vfslocked, nfsd, slp,
 	    nam, &rdonly, TRUE);
+	vp_locked = 1;
 	if (!error && vp->v_type != VDIR) {
 		error = ENOTDIR;
 		vput(vp);
 		vp = NULL;
+		vp_locked = 0;
 	}
 	if (error) {
 		nfsm_reply(NFSX_UNSIGNED);
@@ -3090,6 +3093,7 @@ nfsrv_readdirplus(struct nfsrv_descript 
 		error = nfsrv_access(vp, VEXEC, cred, rdonly, 0);
 	if (error) {
 		vput(vp);
+		vp_locked = 0;
 		vp = NULL;
 		nfsm_reply(NFSX_V3POSTOPATTR);
 		nfsm_srvpostop_attr(getret, &at);
@@ -3097,6 +3101,7 @@ nfsrv_readdirplus(struct nfsrv_descript 
 		goto nfsmout;
 	}
 	VOP_UNLOCK(vp, 0);
+	vp_locked = 0;
 	rbuf = malloc(siz, M_TEMP, M_WAITOK);
 again:
 	iv.iov_base = rbuf;
@@ -3110,6 +3115,7 @@ again:
 	io.uio_td = NULL;
 	eofflag = 0;
 	vn_lock(vp, LK_SHARED | LK_RETRY);
+	vp_locked = 1;
 	if (cookies) {
 		free((caddr_t)cookies, M_TEMP);
 		cookies = NULL;
@@ -3118,6 +3124,7 @@ again:
 	off = (u_quad_t)io.uio_offset;
 	getret = VOP_GETATTR(vp, &at, cred);
 	VOP_UNLOCK(vp, 0);
+	vp_locked = 0;
 	if (!cookies && !error)
 		error = NFSERR_PERM;
 	if (!error)
@@ -3238,8 +3245,10 @@ again:
 				} else {
 					cn.cn_flags &= ~ISDOTDOT;
 				}
-				if (!VOP_ISLOCKED(vp))
+				if (!vp_locked) {
 					vn_lock(vp, LK_SHARED | LK_RETRY);
+					vp_locked = 1;
+				}
 				if ((vp->v_vflag & VV_ROOT) != 0 &&
 				    (cn.cn_flags & ISDOTDOT) != 0) {
 					vref(vp);
@@ -3342,7 +3351,7 @@ invalid:
 		cookiep++;
 		ncookies--;
 	}
-	if (!usevget && VOP_ISLOCKED(vp))
+	if (!usevget && vp_locked)
 		vput(vp);
 	else
 		vrele(vp);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201012151246.oBFCkrdR052668>