On August 24, 2019 10:13:15 PM PDT, Mateusz Guzik <m...@freebsd.org> wrote:
>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 {

Hi mjg@,

This causes trap 12 a few seconds after mountlate during boot. Reverting this 
commit allowed it to boot.

Sorry for no backtrace. I managed to 
 revert and test just prior to rushing out to catch the bus, with no time to 
craft a proper email. I'll post the backtrace when I arrive at work.


-- 
Pardon the typos and autocorrect, small keyboard in use.
Cheers,
Cy Schubert <cy.schub...@cschubert.com>
FreeBSD UNIX: <c...@freebsd.org> Web: http://www.FreeBSD.org

        The need of the many outweighs the greed of the few.
_______________________________________________
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