Index: vfs_mount.c =================================================================== --- vfs_mount.c (revision 185942) +++ vfs_mount.c (working copy) @@ -1200,6 +1200,7 @@ mtx_assert(&Giant, MA_OWNED); +coverpath: if ((coveredvp = mp->mnt_vnodecovered) != NULL) { mnt_gen_r = mp->mnt_gen; VI_LOCK(coveredvp); @@ -1240,6 +1241,8 @@ mp->mnt_kern_flag |= MNTK_UNMOUNTF; error = 0; if (mp->mnt_lockref) { + if (coveredvp) + VOP_UNLOCK(coveredvp, 0); if ((flags & MNT_FORCE) == 0) { mp->mnt_kern_flag &= ~(MNTK_UNMOUNT | MNTK_NOINSMNTQ | MNTK_UNMOUNTF); @@ -1248,13 +1251,13 @@ wakeup(mp); } MNT_IUNLOCK(mp); - if (coveredvp) - VOP_UNLOCK(coveredvp, 0); return (EBUSY); } mp->mnt_kern_flag |= MNTK_DRAINING; error = msleep(&mp->mnt_lockref, MNT_MTX(mp), PVFS, "mount drain", 0); + if (coveredvp) + goto coverpath; } MNT_IUNLOCK(mp); KASSERT(mp->mnt_lockref == 0,