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