[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