lazy umount after pivot_root on start of new container
does not remove cloned ve0 mounts because they got MNT_LOCKED
during clone in new user namespace.
These mounts keeps reference to original super_blcoks 
and prevent its unmount in ve0.

As work around I revert ce07d891 "mnt: Honor MNT_LOCKED when detaching mounts",
I expect it helps to delete unused locked mounts.

https://jira.sw.ru/browse/PSBM-71414
Signed-off-by:  Vasily Averin <v...@virtuozzo.com>
diff --git a/fs/namespace.c b/fs/namespace.c
index 2c98249..6dbf827 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -1125,13 +1125,6 @@ static void mntput_no_expire(struct mount *mnt)
        rcu_read_unlock();
 
        list_del(&mnt->mnt_instance);
-
-       if (unlikely(!list_empty(&mnt->mnt_mounts))) {
-               struct mount *p, *tmp;
-               list_for_each_entry_safe(p, tmp, &mnt->mnt_mounts,  mnt_child) {
-                       umount_mnt(p);
-               }
-       }
        unlock_mount_hash();
 
        if (likely(!(mnt->mnt.mnt_flags & MNT_INTERNAL))) {
@@ -1406,35 +1399,6 @@ enum umount_tree_flags {
        UMOUNT_CONNECTED = 4,
 };
 
-static bool disconnect_mount(struct mount *mnt, enum umount_tree_flags how)
-{
-       /* Leaving mounts connected is only valid for lazy umounts */
-       if (how & UMOUNT_SYNC)
-               return true;
-
-       /* A mount without a parent has nothing to be connected to */
-       if (!mnt_has_parent(mnt))
-               return true;
-
-       /* Because the reference counting rules change when mounts are
-        * unmounted and connected, umounted mounts may not be
-        * connected to mounted mounts.
-        */
-       if (!(mnt->mnt_parent->mnt.mnt_flags & MNT_UMOUNT))
-               return true;
-
-       /* Has it been requested that the mount remain connected? */
-       if (how & UMOUNT_CONNECTED)
-               return false;
-
-       /* Is the mount locked such that it needs to remain connected? */
-       if (IS_MNT_LOCKED(mnt))
-               return false;
-
-       /* By default disconnect the mount */
-       return true;
-}
-
 /*
  * mount_lock must be held
  * namespace_sem must be held for write
@@ -1463,7 +1427,6 @@ static void umount_tree(struct mount *mnt, enum 
umount_tree_flags how)
                propagate_umount(&tmp_list);
 
        while (!list_empty(&tmp_list)) {
-               bool disconnect;
                p = list_first_entry(&tmp_list, struct mount, mnt_list);
                list_del_init(&p->mnt_expire);
                list_del_init(&p->mnt_list);
@@ -1472,18 +1435,10 @@ static void umount_tree(struct mount *mnt, enum 
umount_tree_flags how)
                if (how & UMOUNT_SYNC)
                        p->mnt.mnt_flags |= MNT_SYNC_UMOUNT;
 
-               disconnect = disconnect_mount(p, how);
-
-               pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt,
-                                disconnect ? &unmounted : NULL);
+               pin_insert_group(&p->mnt_umount, &p->mnt_parent->mnt, 
&unmounted);
                if (mnt_has_parent(p)) {
                        mnt_add_count(p->mnt_parent, -1);
-                       if (!disconnect) {
-                               /* Don't forget about p */
-                               list_add_tail(&p->mnt_child, 
&p->mnt_parent->mnt_mounts);
-                       } else {
-                               umount_mnt(p);
-                       }
+                       umount_mnt(p);
                }
                change_mnt_propagation(p, MS_PRIVATE);
        }
@@ -1611,11 +1566,7 @@ void __detach_mounts(struct dentry *dentry)
        event++;
        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) {
-                       hlist_add_head(&mnt->mnt_umount.s_list, &unmounted);
-                       umount_mnt(mnt);
-               }
-               else umount_tree(mnt, UMOUNT_CONNECTED);
+               umount_tree(mnt, UMOUNT_CONNECTED);
        }
        put_mountpoint(mp);
 out_unlock:
_______________________________________________
Devel mailing list
Devel@openvz.org
https://lists.openvz.org/mailman/listinfo/devel

Reply via email to