Skip to content

Commit 65781e1

Browse files
author
Al Viro
committed
do_umount(): add missing barrier before refcount checks in sync case
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 <brauner@kernel.org> Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
1 parent 250cf36 commit 65781e1

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
@@ -787,7 +787,7 @@ int __legitimize_mnt(struct vfsmount *bastard, unsigned seq)
787787
return 0;
788788
mnt = real_mount(bastard);
789789
mnt_add_count(mnt, 1);
790-
smp_mb(); // see mntput_no_expire()
790+
smp_mb(); // see mntput_no_expire() and do_umount()
791791
if (likely(!read_seqretry(&mount_lock, seq)))
792792
return 0;
793793
lock_mount_hash();
@@ -2044,6 +2044,7 @@ static int do_umount(struct mount *mnt, int flags)
20442044
umount_tree(mnt, UMOUNT_PROPAGATE);
20452045
retval = 0;
20462046
} else {
2047+
smp_mb(); // paired with __legitimize_mnt()
20472048
shrink_submounts(mnt);
20482049
retval = -EBUSY;
20492050
if (!propagate_mount_busy(mnt, 2)) {

0 commit comments

Comments
 (0)