Skip to content

Commit 7c6bfc9

Browse files
Al Virovijay-suman
authored andcommitted
do_umount(): add missing barrier before refcount checks in sync case
[ Upstream commit 65781e19dcfcb4aed1167d87a3ffcc2a0c071d47 ] do_umount() analogue of the race fixed in 119e1ef "fix __legitimize_mnt()/mntput() race". Here we want to make sure that if __legitimize_mnt() doesn't notice our lock_mount_hash(), we will notice their refcount increment. Harder to hit than mntput_no_expire() one, fortunately, and consequences are milder (sync umount acting like umount -l on a rare race with RCU pathwalk hitting at just the wrong time instead of use-after-free galore mntput_no_expire() counterpart used to be hit). Still a bug... Fixes: 48a066e ("RCU'd vfsmounts") Reviewed-by: Christian Brauner <[email protected]> Signed-off-by: Al Viro <[email protected]> Signed-off-by: Sasha Levin <[email protected]> (cherry picked from commit 7ced6fd9d6f87adb4b0f0cbf96983be83f061b4d) Signed-off-by: Vijayendra Suman <[email protected]>
1 parent a50b566 commit 7c6bfc9

File tree

1 file changed

+2
-1
lines changed

1 file changed

+2
-1
lines changed

fs/namespace.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -586,7 +586,7 @@ int __legitimize_mnt(struct vfsmount *bastard, unsigned seq)
586586
return 0;
587587
mnt = real_mount(bastard);
588588
mnt_add_count(mnt, 1);
589-
smp_mb(); // see mntput_no_expire()
589+
smp_mb(); // see mntput_no_expire() and do_umount()
590590
if (likely(!read_seqretry(&mount_lock, seq)))
591591
return 0;
592592
if (bastard->mnt_flags & MNT_SYNC_UMOUNT) {
@@ -1664,6 +1664,7 @@ static int do_umount(struct mount *mnt, int flags)
16641664
umount_tree(mnt, UMOUNT_PROPAGATE);
16651665
retval = 0;
16661666
} else {
1667+
smp_mb(); // paired with __legitimize_mnt()
16671668
shrink_submounts(mnt);
16681669
retval = -EBUSY;
16691670
if (!propagate_mount_busy(mnt, 2)) {

0 commit comments

Comments
 (0)