Commit beeabc3b authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

mount: add the mnt_roots mount in the mount tree on restore

Currently we connect roots of sub-namespaces to the root of the root
mount namespace. And we get problems, if the root of the root mntns is
shared, because all children of a shared mount must be propagated to
other mounts in this group.

Actually we mount tmpfs in mnt_roots and here is nothing wrong to add it
in a tree.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 4e7064cd
...@@ -238,9 +238,26 @@ static bool mounts_equal(struct mount_info* mi, struct mount_info *c, bool bind) ...@@ -238,9 +238,26 @@ static bool mounts_equal(struct mount_info* mi, struct mount_info *c, bool bind)
return true; return true;
} }
/*
* mnt_roots is a temporary directory for restoring sub-trees of
* non-root namespaces.
*/
static char *mnt_roots;
static struct mount_info *mnt_build_ids_tree(struct mount_info *list) static struct mount_info *mnt_build_ids_tree(struct mount_info *list)
{ {
struct mount_info *m, *root = NULL; struct mount_info *m, *root = NULL;
struct mount_info *tmp_root_mount = NULL;
if (mnt_roots) {
/* mnt_roots is a tmpfs mount and it's private */
tmp_root_mount = mnt_entry_alloc();
if (!tmp_root_mount)
return NULL;
tmp_root_mount->mountpoint = mnt_roots;
tmp_root_mount->mounted = true;
}
/* /*
* Just resolve the mnt_id:parent_mnt_id relations * Just resolve the mnt_id:parent_mnt_id relations
...@@ -280,7 +297,7 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list) ...@@ -280,7 +297,7 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list)
* root mount namespace, so its parent is * root mount namespace, so its parent is
* the main root. * the main root.
*/ */
p = root; p = tmp_root_mount;
} else } else
return NULL; return NULL;
} }
...@@ -294,6 +311,11 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list) ...@@ -294,6 +311,11 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list)
return NULL; return NULL;
} }
if (mnt_roots) {
tmp_root_mount->parent = root;
list_add_tail(&tmp_root_mount->siblings, &root->children);
}
return root; return root;
} }
...@@ -1749,12 +1771,6 @@ void mnt_entry_free(struct mount_info *mi) ...@@ -1749,12 +1771,6 @@ void mnt_entry_free(struct mount_info *mi)
xfree(mi); xfree(mi);
} }
/*
* mnt_roots is a temporary directory for restoring sub-trees of
* non-root namespaces.
*/
static char *mnt_roots;
/* /*
* Helper for getting a path to where the namespace's root * Helper for getting a path to where the namespace's root
* is re-constructed. * is re-constructed.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment