diff options
| author | Konstantin Belousov <kib@FreeBSD.org> | 2026-05-17 21:27:52 +0000 |
|---|---|---|
| committer | Konstantin Belousov <kib@FreeBSD.org> | 2026-05-21 20:11:55 +0000 |
| commit | f5433e784078ee139a37eb43ffa1d9e0e1f4f217 (patch) | |
| tree | 1bb3671775caa8495b909320d4a698a49cb51291 | |
| parent | ace4a3e177c0da5efd9ceee0d9f46068562e3f5e (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.c | 8 |
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); |
