| From 8318e667f176f7ea34451a1a530634e293f216ac Mon Sep 17 00:00:00 2001 |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| Date: Wed, 24 Dec 2014 07:35:10 -0600 |
| Subject: mnt: Don't propagate umounts in __detach_mounts |
| |
| From: "Eric W. Biederman" <ebiederm@xmission.com> |
| |
| commit 8318e667f176f7ea34451a1a530634e293f216ac upstream. |
| |
| Invoking mount propagation from __detach_mounts is inefficient and |
| wrong. |
| |
| It is inefficient because __detach_mounts already walks the list of |
| mounts that where something needs to be done, and mount propagation |
| walks some subset of those mounts again. |
| |
| It is actively wrong because if the dentry that is passed to |
| __detach_mounts is not part of the path to a mount that mount should |
| not be affected. |
| |
| change_mnt_propagation(p,MS_PRIVATE) modifies the mount propagation |
| tree of a master mount so it's slaves are connected to another master |
| if possible. Which means even removing a mount from the middle of a |
| mount tree with __detach_mounts will not deprive any mount propagated |
| mount events. |
| |
| Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| fs/namespace.c | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/fs/namespace.c |
| +++ b/fs/namespace.c |
| @@ -1487,7 +1487,7 @@ void __detach_mounts(struct dentry *dent |
| lock_mount_hash(); |
| while (!hlist_empty(&mp->m_list)) { |
| mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list); |
| - umount_tree(mnt, UMOUNT_PROPAGATE); |
| + umount_tree(mnt, 0); |
| } |
| unlock_mount_hash(); |
| put_mountpoint(mp); |