Index: sys/fs/nullfs/null_subr.c =================================================================== --- sys/fs/nullfs/null_subr.c (revision 243249) +++ sys/fs/nullfs/null_subr.c (working copy) @@ -186,6 +186,8 @@ null_insmntque_dtr(struct vnode *vp, void *xp) { + ASSERT_VOP_ELOCKED(vp, "null_insmntque_dtr: non-locked vp"); + vput(((struct null_node *)xp)->null_lowervp); null_destroy_proto(vp, xp); } Index: sys/fs/devfs/devfs_vnops.c =================================================================== --- sys/fs/devfs/devfs_vnops.c (revision 243249) +++ sys/fs/devfs/devfs_vnops.c (working copy) @@ -371,6 +371,8 @@ { struct devfs_dirent *de; + ASSERT_VOP_ELOCKED(vp, "devfs_insmntque_dtr: non-locked vp"); + de = (struct devfs_dirent *)arg; mtx_lock(&devfs_de_interlock); vp->v_data = NULL; Index: sys/fs/fdescfs/fdesc_vnops.c =================================================================== --- sys/fs/fdescfs/fdesc_vnops.c (revision 243249) +++ sys/fs/fdescfs/fdesc_vnops.c (working copy) @@ -121,6 +121,8 @@ fdesc_insmntque_dtr(struct vnode *vp, void *arg) { + ASSERT_VOP_ELOCKED(vp, "fdesc_insmntque_dtr: non-locked vp"); + vgone(vp); vput(vp); } Index: sys/kern/vfs_subr.c =================================================================== --- sys/kern/vfs_subr.c (revision 243249) +++ sys/kern/vfs_subr.c (working copy) @@ -1109,12 +1109,10 @@ insmntque_stddtr(struct vnode *vp, void *dtr_arg) { + ASSERT_VOP_ELOCKED(vp, "insmntque_stddtr: non-locked vp"); + vp->v_data = NULL; vp->v_op = &dead_vnodeops; - /* XXX non mp-safe fs may still call insmntque with vnode - unlocked */ - if (!VOP_ISLOCKED(vp)) - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); vgone(vp); vput(vp); } @@ -1126,7 +1124,6 @@ insmntque1(struct vnode *vp, struct mount *mp, void (*dtr)(struct vnode *, void *), void *dtr_arg) { - int locked; KASSERT(vp->v_mount == NULL, ("insmntque: vnode already on per mount vnode list")); @@ -1144,18 +1141,15 @@ */ MNT_ILOCK(mp); VI_LOCK(vp); - if ((mp->mnt_kern_flag & MNTK_NOINSMNTQ) != 0 && + if (((mp->mnt_kern_flag & MNTK_NOINSMNTQ) != 0 && ((mp->mnt_kern_flag & MNTK_UNMOUNTF) != 0 || - mp->mnt_nvnodelistsize == 0)) { - locked = VOP_ISLOCKED(vp); - if (!locked || (locked == LK_EXCLUSIVE && - (vp->v_vflag & VV_FORCEINSMQ) == 0)) { - VI_UNLOCK(vp); - MNT_IUNLOCK(mp); - if (dtr != NULL) - dtr(vp, dtr_arg); - return (EBUSY); - } + mp->mnt_nvnodelistsize == 0)) && + (vp->v_vflag & VV_FORCEINSMQ) == 0) { + VI_UNLOCK(vp); + MNT_IUNLOCK(mp); + if (dtr != NULL) + dtr(vp, dtr_arg); + return (EBUSY); } vp->v_mount = mp; MNT_REF(mp);