Author: mjg
Date: Sun Aug 25 05:13:15 2019
New Revision: 351472
URL: https://svnweb.freebsd.org/changeset/base/351472

Log:
  nullfs: reduce areas protected by vnode interlock
  
  Some places only take the interlock to hold the vnode, which was a requiremnt
  before they started being manipulated with atomics. Use the newly introduced
  vholdnz to bump the count.
  
  Reviewed by:  kib
  Tested by:    pho
  Sponsored by: The FreeBSD Foundation
  Differential Revision:        https://reviews.freebsd.org/D21358

Modified:
  head/sys/fs/nullfs/null_vnops.c

Modified: head/sys/fs/nullfs/null_vnops.c
==============================================================================
--- head/sys/fs/nullfs/null_vnops.c     Sun Aug 25 05:11:43 2019        
(r351471)
+++ head/sys/fs/nullfs/null_vnops.c     Sun Aug 25 05:13:15 2019        
(r351472)
@@ -668,7 +668,7 @@ null_lock(struct vop_lock1_args *ap)
                 * We prevent it from being recycled by holding the vnode
                 * here.
                 */
-               vholdl(lvp);
+               vholdnz(lvp);
                error = VOP_LOCK(lvp, flags);
 
                /*
@@ -710,31 +710,16 @@ static int
 null_unlock(struct vop_unlock_args *ap)
 {
        struct vnode *vp = ap->a_vp;
-       int flags = ap->a_flags;
-       int mtxlkflag = 0;
        struct null_node *nn;
        struct vnode *lvp;
        int error;
 
-       if ((flags & LK_INTERLOCK) != 0)
-               mtxlkflag = 1;
-       else if (mtx_owned(VI_MTX(vp)) == 0) {
-               VI_LOCK(vp);
-               mtxlkflag = 2;
-       }
        nn = VTONULL(vp);
        if (nn != NULL && (lvp = NULLVPTOLOWERVP(vp)) != NULL) {
-               VI_LOCK_FLAGS(lvp, MTX_DUPOK);
-               flags |= LK_INTERLOCK;
-               vholdl(lvp);
-               VI_UNLOCK(vp);
-               error = VOP_UNLOCK(lvp, flags);
+               vholdnz(lvp);
+               error = VOP_UNLOCK(lvp, 0);
                vdrop(lvp);
-               if (mtxlkflag == 0)
-                       VI_LOCK(vp);
        } else {
-               if (mtxlkflag == 2)
-                       VI_UNLOCK(vp);
                error = vop_stdunlock(ap);
        }
 
@@ -845,10 +830,8 @@ null_getwritemount(struct vop_getwritemount_args *ap)
        VI_LOCK(vp);
        xp = VTONULL(vp);
        if (xp && (lowervp = xp->null_lowervp)) {
-               VI_LOCK_FLAGS(lowervp, MTX_DUPOK);
+               vholdnz(lowervp);
                VI_UNLOCK(vp);
-               vholdl(lowervp);
-               VI_UNLOCK(lowervp);
                VOP_GETWRITEMOUNT(lowervp, ap->a_mpp);
                vdrop(lowervp);
        } else {
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to