]> git.baikalelectronics.ru Git - kernel.git/commitdiff
mnt: In detach_mounts detach the appropriate unmounted mount
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 17 Jul 2015 19:54:27 +0000 (14:54 -0500)
committerEric W. Biederman <ebiederm@xmission.com>
Thu, 23 Jul 2015 16:31:15 +0000 (11:31 -0500)
The handling of in detach_mounts of unmounted but connected mounts is
buggy and can lead to an infinite loop.

Correct the handling of unmounted mounts in detach_mount.  When the
mountpoint of an unmounted but connected mount is connected to a
dentry, and that dentry is deleted we need to disconnect that mount
from the parent mount and the deleted dentry.

Nothing changes for the unmounted and connected children.  They can be
safely ignored.

Cc: stable@vger.kernel.org
Fixes: e13dfae1acd233f89ba888a163f344c8866eb444 mnt: Honor MNT_LOCKED when detaching mounts
Signed-off-by: "Eric W. Biederman" <ebiederm@xmission.com>
fs/namespace.c

index 7829eab0b7063ce1f82a0436f77f7a5639cfb485..2b8aa15fd6dfa755368ddf21136eaab5192f1e28 100644 (file)
@@ -1565,11 +1565,8 @@ void __detach_mounts(struct dentry *dentry)
        while (!hlist_empty(&mp->m_list)) {
                mnt = hlist_entry(mp->m_list.first, struct mount, mnt_mp_list);
                if (mnt->mnt.mnt_flags & MNT_UMOUNT) {
-                       struct mount *p, *tmp;
-                       list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts,  mnt_child) {
-                               hlist_add_head(&p->mnt_umount.s_list, &unmounted);
-                               umount_mnt(p);
-                       }
+                       hlist_add_head(&mnt->mnt_umount.s_list, &unmounted);
+                       umount_mnt(mnt);
                }
                else umount_tree(mnt, UMOUNT_CONNECTED);
        }