diff --git a/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c b/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
index 464bf0019009..aef2cb29fb7e 100644
--- a/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
+++ b/external/cddl/osnet/dist/uts/common/fs/zfs/zfs_vfsops.c
@@ -2428,12 +2428,26 @@ zfs_umount(vfs_t *vfsp, int fflag)
 	 */
 #ifdef __FreeBSD_kernel__
 	ret = vflush(vfsp, 0, (fflag & MS_FORCE) ? FORCECLOSE : 0, td);
+	if (ret != 0)
+		return (ret);
 #endif
 #ifdef __NetBSD__
-	ret = vflush(vfsp, NULL, (fflag & MS_FORCE) ? FORCECLOSE : 0);
+	/*
+	 * we loop here because zil_commit can bring some vnodes
+	 * back to mnt_vnodelist via zfs_get_data.
+	 */
+	mutex_enter(vfsp->mnt_vnodelock);
+	while (!TAILQ_EMPTY(&vfsp->mnt_vnodelist)) {
+		mutex_exit(vfsp->mnt_vnodelock);
+		ret = vflush(vfsp, NULL, (fflag & MS_FORCE) ? FORCECLOSE : 0);
+		if (ret != 0)
+			return (ret);
+		if (zfsvfs->z_log)
+			zil_commit(zfsvfs->z_log, 0);
+		mutex_enter(vfsp->mnt_vnodelock);
+	}
+	mutex_exit(vfsp->mnt_vnodelock);
 #endif
-	if (ret != 0)
-		return (ret);
 
 #ifdef illumos
 	if (!(fflag & MS_FORCE)) {
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index 7a69b58632c9..9e9d358f0c09 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -542,7 +542,7 @@ vfs_insmntque(vnode_t *vp, struct mount *mp)
 	struct mount *omp;
 	kmutex_t *lock;
 
-	KASSERT(mp == NULL || (mp->mnt_iflag & IMNT_UNMOUNT) == 0 ||
+	KASSERT(mp == NULL || (mp->mnt_iflag & IMNT_GONE) == 0 ||
 	    vp->v_tag == VT_VFS);
 
 	/*
@@ -1003,6 +1003,7 @@ dounmount(struct mount *mp, int flags, struct lwp *l)
 	 * vfs_busy() from succeeding.
 	 */
 	mp->mnt_iflag |= IMNT_GONE;
+	KASSERT(TAILQ_EMPTY(&mp->mnt_vnodelist));
 	if ((coveredvp = mp->mnt_vnodecovered) != NULLVP) {
 		coveredvp->v_mountedhere = NULL;
 	}
