diff options
| author | Mateusz Guzik <mjg@FreeBSD.org> | 2021-08-18 21:14:16 +0000 |
|---|---|---|
| committer | Mateusz Guzik <mjg@FreeBSD.org> | 2021-08-20 17:52:24 +0000 |
| commit | dbc689cdef0cc8ff11171642cdcf107dfbc3fb41 (patch) | |
| tree | ecb7a7d2e4dcae7a4e27a28206c2d9c02385c70c /sys | |
| parent | 2651609fcbd70725cb94902145032dbb7c1e89c4 (diff) | |
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/kern/vfs_mount.c | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/sys/kern/vfs_mount.c b/sys/kern/vfs_mount.c index 3c546392b213..92e70e45d46e 100644 --- a/sys/kern/vfs_mount.c +++ b/sys/kern/vfs_mount.c @@ -1191,19 +1191,28 @@ vfs_domount_first( mp->mnt_kern_flag &= ~MNTK_ASYNC; MNT_IUNLOCK(mp); - vn_lock(vp, LK_EXCLUSIVE | LK_RETRY); - cache_purge(vp); VI_LOCK(vp); - vp->v_iflag &= ~VI_MOUNT; + cache_purge(vp); vn_irflag_set_locked(vp, VIRF_MOUNTPOINT); vp->v_mountedhere = mp; VI_UNLOCK(vp); + + /* + * We need to lock both vnodes. + * + * Use vn_lock_pair to avoid establishing an ordering between vnodes + * from different filesystems. + */ + vn_lock_pair(vp, false, newdp, false); + + VI_LOCK(vp); + vp->v_iflag &= ~VI_MOUNT; + VI_UNLOCK(vp); /* Place the new filesystem at the end of the mount list. */ mtx_lock(&mountlist_mtx); TAILQ_INSERT_TAIL(&mountlist, mp, mnt_list); mtx_unlock(&mountlist_mtx); vfs_event_signal(NULL, VQ_MOUNT, 0); - vn_lock(newdp, LK_EXCLUSIVE | LK_RETRY); VOP_UNLOCK(vp); EVENTHANDLER_DIRECT_INVOKE(vfs_mounted, mp, newdp, td); VOP_UNLOCK(newdp); |
