From beeabc3b2b74e616fbc29a093e95d7bece32b557 Mon Sep 17 00:00:00 2001 From: Andrey Vagin Date: Tue, 11 Nov 2014 01:24:54 +0300 Subject: [PATCH] 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 Signed-off-by: Pavel Emelyanov --- mount.c | 30 +++++++++++++++++++++++------- 1 file changed, 23 insertions(+), 7 deletions(-) diff --git a/mount.c b/mount.c index 8385ad903..bbd1f607e 100644 --- a/mount.c +++ b/mount.c @@ -238,9 +238,26 @@ static bool mounts_equal(struct mount_info* mi, struct mount_info *c, bool bind) 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) { 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 @@ -280,7 +297,7 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list) * root mount namespace, so its parent is * the main root. */ - p = root; + p = tmp_root_mount; } else return NULL; } @@ -294,6 +311,11 @@ static struct mount_info *mnt_build_ids_tree(struct mount_info *list) return NULL; } + if (mnt_roots) { + tmp_root_mount->parent = root; + list_add_tail(&tmp_root_mount->siblings, &root->children); + } + return root; } @@ -1749,12 +1771,6 @@ void mnt_entry_free(struct mount_info *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 * is re-constructed.