diff --git a/sys/ufs/ffs/ffs_vfsops.c b/sys/ufs/ffs/ffs_vfsops.c index 0b3110c955f..52b9b860f81 100644 --- a/sys/ufs/ffs/ffs_vfsops.c +++ b/sys/ufs/ffs/ffs_vfsops.c @@ -1546,7 +1546,14 @@ ffs_unmount(mp, mntflags) BO_UNLOCK(&ump->um_odevvp->v_bufobj); atomic_store_rel_ptr((uintptr_t *)&ump->um_dev->si_mountpt, 0); mntfs_freevp(ump->um_devvp); - vrele(ump->um_odevvp); + /* Avoid LOR in vrele by passing in locked vnode and using vput */ + if (vn_lock(ump->um_odevvp, LK_EXCLUSIVE | LK_NOWAIT) == 0) { + vput(ump->um_odevvp); + } else { + /* This should never happen, see commit message for details */ + printf("ffs_unmount: Unexpected LK_NOWAIT failure\n"); + vrele(ump->um_odevvp); + } dev_rel(ump->um_dev); mtx_destroy(UFS_MTX(ump)); if (mp->mnt_gjprovider != NULL) {