Author: rmacklem
Date: Fri Dec 24 20:24:07 2010
New Revision: 216692
URL: http://svn.freebsd.org/changeset/base/216692

Log:
  Simplify vnode locking in the expeimental NFS server's
  readdir functions. In particular, get rid of two bogus
  VOP_ISLOCKED() calls. Removing the VOP_ISLOCKED() calls
  is the only actual bug fixed by this patch.
  
  Reviewed by:  kib
  MFC after:    2 weeks

Modified:
  head/sys/fs/nfsserver/nfs_nfsdport.c

Modified: head/sys/fs/nfsserver/nfs_nfsdport.c
==============================================================================
--- head/sys/fs/nfsserver/nfs_nfsdport.c        Fri Dec 24 18:46:44 2010        
(r216691)
+++ head/sys/fs/nfsserver/nfs_nfsdport.c        Fri Dec 24 20:24:07 2010        
(r216692)
@@ -1486,7 +1486,6 @@ nfsrvd_readdir(struct nfsrv_descript *nd
                return (0);
        }
        not_zfs = strcmp(vp->v_mount->mnt_vfc->vfc_name, "zfs");
-       NFSVOPUNLOCK(vp, 0, p);
        MALLOC(rbuf, caddr_t, siz, M_TEMP, M_WAITOK);
 again:
        eofflag = 0;
@@ -1504,10 +1503,8 @@ again:
        io.uio_segflg = UIO_SYSSPACE;
        io.uio_rw = UIO_READ;
        io.uio_td = NULL;
-       NFSVOPLOCK(vp, LK_EXCLUSIVE | LK_RETRY, p);
        nd->nd_repstat = VOP_READDIR(vp, &io, nd->nd_cred, &eofflag, &ncookies,
            &cookies);
-       NFSVOPUNLOCK(vp, 0, p);
        off = (u_int64_t)io.uio_offset;
        if (io.uio_resid)
                siz -= io.uio_resid;
@@ -1524,7 +1521,7 @@ again:
         * Handles the failed cases. nd->nd_repstat == 0 past here.
         */
        if (nd->nd_repstat) {
-               vrele(vp);
+               vput(vp);
                free((caddr_t)rbuf, M_TEMP);
                if (cookies)
                        free((caddr_t)cookies, M_TEMP);
@@ -1537,7 +1534,7 @@ again:
         * rpc reply
         */
        if (siz == 0) {
-               vrele(vp);
+               vput(vp);
                if (nd->nd_flag & ND_NFSV2) {
                        NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
                } else {
@@ -1584,6 +1581,7 @@ again:
                toff = off;
                goto again;
        }
+       vput(vp);
 
        /*
         * dirlen is the size of the reply, including all XDR and must
@@ -1642,7 +1640,6 @@ again:
        }
        if (cpos < cend)
                eofflag = 0;
-       vrele(vp);
        NFSM_BUILD(tl, u_int32_t *, 2 * NFSX_UNSIGNED);
        *tl++ = newnfs_false;
        if (eofflag)
@@ -1852,7 +1849,7 @@ again:
                toff = off;
                goto again;
        }
-       NFSVOPUNLOCK(vp, 0, p);
+       VOP_UNLOCK(vp, 0);
 
        /*
         * Save this position, in case there is an error before one entry
@@ -1938,10 +1935,11 @@ again:
                                                    dp->d_name[1] == '.')
                                                        cn.cn_flags |=
                                                            ISDOTDOT;
-                                               if (!VOP_ISLOCKED(vp))
-                                                       vn_lock(vp,
-                                                           LK_EXCLUSIVE |
-                                                           LK_RETRY);
+                                               if (vn_lock(vp, LK_EXCLUSIVE)
+                                                   != 0) {
+                                                       nd->nd_repstat = EPERM;
+                                                       break;
+                                               }
                                                if ((vp->v_vflag & VV_ROOT) != 0
                                                    && (cn.cn_flags & ISDOTDOT)
                                                    != 0) {
@@ -2000,7 +1998,7 @@ again:
                                *tl = txdr_unsigned(*cookiep);
                                dirlen += nfsm_strtom(nd, dp->d_name, nlen);
                                if (nvp != NULL)
-                                       NFSVOPUNLOCK(nvp, 0, p);
+                                       VOP_UNLOCK(nvp, 0);
                                if (refp != NULL) {
                                        dirlen += nfsrv_putreferralattr(nd,
                                            &savbits, refp, 0,
@@ -2031,10 +2029,7 @@ again:
                cookiep++;
                ncookies--;
        }
-       if (!usevget && VOP_ISLOCKED(vp))
-               vput(vp);
-       else
-               vrele(vp);
+       vrele(vp);
 
        /*
         * If dirlen > cnt, we must strip off the last entry. If that
_______________________________________________
[email protected] mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "[email protected]"

Reply via email to