[CRIU] [PATCH 04/27] restore: add mount id-s in the ns_ids list (v4)

Andrey Vagin avagin at openvz.org
Thu Apr 10 04:03:47 PDT 2014


Currently ns_ids is filled only on dump. Now we are going to restore
nested mount namespaces, so we need to know who share name spaces.

v2: merge the patch "namespace: add a function to search an ns_id
item by id" into this one.
v3: add prefix rst_ to add_ns_id
v4: look up namespace by two values -- type AND ID

Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
 include/namespaces.h |  3 +++
 namespaces.c         | 39 +++++++++++++++++++++++++++++++++++++++
 pstree.c             |  5 +++++
 3 files changed, 47 insertions(+)

diff --git a/include/namespaces.h b/include/namespaces.h
index f14ea6d..ec410e2 100644
--- a/include/namespaces.h
+++ b/include/namespaces.h
@@ -42,6 +42,9 @@ extern int switch_ns(int pid, struct ns_desc *nd, int *rst);
 extern int restore_ns(int rst, struct ns_desc *nd);
 
 extern int dump_task_ns_ids(struct pstree_item *);
+extern int rst_add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd);
+extern struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd);
+
 extern int gen_predump_ns_mask(void);
 
 #endif /* __CR_NS_H__ */
diff --git a/namespaces.c b/namespaces.c
index daec119..31ca7c9 100644
--- a/namespaces.c
+++ b/namespaces.c
@@ -117,6 +117,34 @@ struct ns_id *ns_ids = NULL;
 static unsigned int ns_next_id = 1;
 unsigned long current_ns_mask = 0;
 
+int rst_add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd)
+{
+	struct ns_id *nsid;
+
+	for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) {
+		if (nsid->id == id) {
+			if (pid_rst_prio(pid, nsid->pid))
+				nsid->pid = pid;
+			return 0;
+		}
+	}
+
+	nsid = shmalloc(sizeof(struct ns_id));
+	if (nsid == NULL)
+		return -1;
+
+	nsid->nd = nd;
+	nsid->id = id;
+	nsid->pid = pid;
+
+	nsid->next = ns_ids;
+	ns_ids = nsid;
+
+	pr_info("Add namespace %d pid %d\n", nsid->id, nsid->pid);
+
+	return 0;
+}
+
 static unsigned int lookup_ns_id(unsigned int kid, struct ns_desc *nd)
 {
 	struct ns_id *nsid;
@@ -128,6 +156,17 @@ static unsigned int lookup_ns_id(unsigned int kid, struct ns_desc *nd)
 	return 0;
 }
 
+struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd)
+{
+	struct ns_id *nsid;
+
+	for (nsid = ns_ids; nsid != NULL; nsid = nsid->next)
+		if (nsid->id == id && nsid->nd == nd)
+			return nsid;
+
+	return NULL;
+}
+
 static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd)
 {
 	unsigned int id;
diff --git a/pstree.c b/pstree.c
index b35c3c4..672f922 100644
--- a/pstree.c
+++ b/pstree.c
@@ -9,6 +9,7 @@
 #include "namespaces.h"
 #include "files.h"
 #include "tty.h"
+#include "mount.h"
 #include "asm/dump.h"
 
 #include "protobuf.h"
@@ -400,6 +401,10 @@ static int read_pstree_image(void)
 		if (ret != 1)
 			goto err;
 
+		if (pi->ids->has_mnt_ns_id) {
+			if (rst_add_ns_id(pi->ids->mnt_ns_id, pi->pid.virt, &mnt_ns_desc))
+				goto err;
+		}
 	}
 err:
 	close(ps_fd);
-- 
1.8.5.3



More information about the CRIU mailing list