aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKonstantin Belousov <kib@FreeBSD.org>2026-05-17 21:27:52 +0000
committerKonstantin Belousov <kib@FreeBSD.org>2026-05-21 20:11:55 +0000
commitf5433e784078ee139a37eb43ffa1d9e0e1f4f217 (patch)
tree1bb3671775caa8495b909320d4a698a49cb51291
parentace4a3e177c0da5efd9ceee0d9f46068562e3f5e (diff)
vfs_domount(): handle the case when vn_lock_pair() only locked once
Reviewed by: jah, markj Tested by: pho Sponsored by: The FreeBSD Foundation MFC after: 1 week Differential revision: https://reviews.freebsd.org/D57035
-rw-r--r--sys/kern/vfs_mount.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c
index fff05a627162..d7e6683e0446 100644
--- a/sys/kern/vfs_mount.c
+++ b/sys/kern/vfs_mount.c
@@ -1292,7 +1292,8 @@ vfs_domount_first(
* Use vn_lock_pair to avoid establishing an ordering between vnodes
* from different filesystems.
*/
- vn_lock_pair(vp, false, LK_EXCLUSIVE, newdp, false, LK_EXCLUSIVE);
+ error1 = vn_lock_pair(vp, false, LK_EXCLUSIVE, newdp, false,
+ LK_EXCLUSIVE);
VI_LOCK(vp);
vp->v_iflag &= ~VI_MOUNT;
@@ -1302,7 +1303,10 @@ vfs_domount_first(
TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list);
mtx_unlock(&mountlist_mtx);
vfs_event_signal(NULL, VQ_MOUNT, 0);
- VOP_UNLOCK(vp);
+ if (error1 == 0)
+ VOP_UNLOCK(vp);
+ else
+ MPASS(error1 == EDEADLK);
EVENTHANDLER_DIRECT_INVOKE(vfs_mounted, mp, newdp, td);
VOP_UNLOCK(newdp);
mount_devctl_event("MOUNT", mp, false);