[CRIU] [PATCH 11/13] mount: allow to dump and restore nested mount namespaces (v2)

Andrey Vagin avagin at openvz.org
Tue Apr 8 17:13:39 PDT 2014


v2: another attempt to write readable code:)
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 include/syscall-types.h |  3 +++
 namespaces.c            |  2 +-
 pstree.c                | 28 ++++++++++++++++++----------
 3 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/include/syscall-types.h b/include/syscall-types.h
index ca22b8e..bab3dba 100644
--- a/include/syscall-types.h
+++ b/include/syscall-types.h
@@ -59,6 +59,9 @@ struct itimerspec;
 
 #define CLONE_ALLNS	(CLONE_NEWPID | CLONE_NEWNET | CLONE_NEWIPC | CLONE_NEWUTS | CLONE_NEWNS)
 
+/* Nested namespaces are supported only for these types */
+#define CLONE_SUBNS	(CLONE_NEWNS)
+
 #define setns	sys_setns
 
 struct rlimit;
diff --git a/namespaces.c b/namespaces.c
index 2797de2..8aacc1e 100644
--- a/namespaces.c
+++ b/namespaces.c
@@ -182,7 +182,7 @@ static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd
 			BUG_ON(current_ns_mask & nd->cflag);
 			pr_info("Will take %s namespace in the image\n", nd->str);
 			current_ns_mask |= nd->cflag;
-		} else {
+		} else if (nd->cflag != CLONE_NEWNS) {
 			pr_err("Can't dump nested %s namespace for %d\n",
 					nd->str, pid);
 			return 0;
diff --git a/pstree.c b/pstree.c
index 672f922..afe4376 100644
--- a/pstree.c
+++ b/pstree.c
@@ -650,18 +650,26 @@ static int prepare_pstree_kobj_ids(void)
 set_mask:
 		item->rst->clone_flags = cflags;
 
-		/*
-		 * Workaround for current namespaces model --
-		 * all tasks should be in one namespace. And
-		 * this namespace is either inherited from the
-		 * criu or is created for the init task (only)
-		 */
+		cflags &= CLONE_ALLNS;
+
 		if (item == root_item) {
 			pr_info("Will restore in %lx namespaces\n", cflags);
-			current_ns_mask = cflags & CLONE_ALLNS;
-		} else if (cflags & CLONE_ALLNS) {
-			pr_err("Can't restore sub-task in NS\n");
-			return -1;
+			current_ns_mask = cflags;
+		} else if (cflags & ~(current_ns_mask & CLONE_SUBNS)) {
+			/*
+			 * Namespaces from CLONE_SUBNS can be nested, but in
+			 * this case nobody can't share external namespaces of
+			 * these types.
+			 *
+			 * Workaround for all other namespaces --
+			 * all tasks should be in one namespace. And
+			 * this namespace is either inherited from the
+			 * criu or is created for the init task (only)
+			 */
+			if (cflags & CLONE_ALLNS) {
+				pr_err("Can't restore sub-task in NS\n");
+				return -1;
+			}
 		}
 	}
 
-- 
1.8.5.3



More information about the CRIU mailing list