The branch main has been updated by kib:

URL: 
https://cgit.FreeBSD.org/src/commit/?id=f5433e784078ee139a37eb43ffa1d9e0e1f4f217

commit f5433e784078ee139a37eb43ffa1d9e0e1f4f217
Author:     Konstantin Belousov <[email protected]>
AuthorDate: 2026-05-17 21:27:52 +0000
Commit:     Konstantin Belousov <[email protected]>
CommitDate: 2026-05-21 20:11:55 +0000

    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
---
 sys/kern/vfs_mount.c | 8 ++++++--
 1 file 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);

Reply via email to