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:
parent
4e7064cd7e
commit
beeabc3b2b
30
mount.c
30
mount.c
@ -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.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user