2
0
mirror of https://github.com/checkpoint-restore/criu synced 2025-08-30 05:48:05 +00:00

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: Andrey Vagin <avagin@openvz.org>
Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
Andrey Vagin 2014-11-11 01:24:54 +03:00 committed by Pavel Emelyanov
parent 4e7064cd7e
commit beeabc3b2b

30
mount.c
View File

@ -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)
* 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)
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)
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.