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"