Author: kib
Date: Sun Dec 26 15:13:28 2010
New Revision: 216712
URL: http://svn.freebsd.org/changeset/base/216712

Log:
  MFC r216454:
  VOP_ISLOCKED() should not be used to determine if the vnode is locked.
  Explicitely track the locked status of the vnode.
  
  Approved by:  re (bz)

Modified:
  releng/8.2/sys/nfsserver/nfs_serv.c
Directory Properties:
  releng/8.2/sys/   (props changed)
  releng/8.2/sys/amd64/include/xen/   (props changed)
  releng/8.2/sys/cddl/contrib/opensolaris/   (props changed)
  releng/8.2/sys/contrib/dev/acpica/   (props changed)
  releng/8.2/sys/contrib/pf/   (props changed)

Modified: releng/8.2/sys/nfsserver/nfs_serv.c
==============================================================================
--- releng/8.2/sys/nfsserver/nfs_serv.c Sun Dec 26 15:00:14 2010        
(r216711)
+++ releng/8.2/sys/nfsserver/nfs_serv.c Sun Dec 26 15:13:28 2010        
(r216712)
@@ -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);
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to