[RESEND,v1,24/55] pstree: Dump pid and user ns ids for dead tasks

Submitted by Kirill Tkhai on March 24, 2017, 3:12 p.m.

Details

Message ID 149036837364.23093.16884055933607773871.stgit@localhost.localdomain
State New
Series "Nested pid namespaces support"
Headers show

Commit Message

Kirill Tkhai March 24, 2017, 3:12 p.m.
Dead task has them set, so we must dump and restore them.

Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 criu/cr-dump.c    |   23 ++++++++++++++++++-----
 criu/namespaces.c |   18 +++++++++++-------
 2 files changed, 29 insertions(+), 12 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/cr-dump.c b/criu/cr-dump.c
index 84139fe3..8d7ed439 100644
--- a/criu/cr-dump.c
+++ b/criu/cr-dump.c
@@ -647,12 +647,12 @@  int get_task_ids(struct pstree_item *item)
 		ret = dump_task_kobj_ids(item);
 		if (ret)
 			goto err_free;
-
-		ret = dump_task_ns_ids(item);
-		if (ret)
-			goto err_free;
 	}
 
+	ret = dump_task_ns_ids(item);
+	if (ret)
+		goto err_free;
+
 	return 0;
 
 err_free:
@@ -662,9 +662,14 @@  int get_task_ids(struct pstree_item *item)
 	return -1;
 }
 
+static int do_dump_task_ids(const struct pstree_item *item, struct cr_img *img)
+{
+	return pb_write_one(img, item->ids, PB_IDS);
+}
+
 static int dump_task_ids(struct pstree_item *item, const struct cr_imgset *cr_imgset)
 {
-	return pb_write_one(img_from_set(cr_imgset, CR_FD_IDS), item->ids, PB_IDS);
+	return do_dump_task_ids(item, img_from_set(cr_imgset, CR_FD_IDS));
 }
 
 int dump_thread_core(int pid, CoreEntry *core, const struct parasite_dump_thread *ti)
@@ -873,6 +878,14 @@  static int dump_one_zombie(const struct pstree_item *item,
 
 	ret = pb_write_one(img, core, PB_CORE);
 	close_image(img);
+	if (ret)
+		goto err;
+
+	img = open_image(CR_FD_IDS, O_DUMP, vpid(item));
+	if (!img)
+		goto err;
+	ret = do_dump_task_ids(item, img);
+	close_image(img);
 err:
 	core_entry_free(core);
 	return ret;
diff --git a/criu/namespaces.c b/criu/namespaces.c
index da0b07d2..747b2738 100644
--- a/criu/namespaces.c
+++ b/criu/namespaces.c
@@ -699,6 +699,17 @@  int dump_task_ns_ids(struct pstree_item *item)
 		return -1;
 	}
 
+	ids->has_user_ns_id = true;
+	ids->user_ns_id = get_ns_id(pid, &user_ns_desc, NULL);
+	if (!ids->user_ns_id) {
+		pr_err("Can't make userns id\n");
+		return -1;
+	}
+
+	/* Below namespaces do not present in dead task */
+	if (item->pid->state == TASK_DEAD)
+		return 0;
+
 	ids->has_net_ns_id = true;
 	ids->net_ns_id = __get_ns_id(pid, &net_ns_desc, NULL, &dmpi(item)->netns);
 	if (!ids->net_ns_id) {
@@ -727,13 +738,6 @@  int dump_task_ns_ids(struct pstree_item *item)
 		return -1;
 	}
 
-	ids->has_user_ns_id = true;
-	ids->user_ns_id = get_ns_id(pid, &user_ns_desc, NULL);
-	if (!ids->user_ns_id) {
-		pr_err("Can't make userns id\n");
-		return -1;
-	}
-
 	ids->cgroup_ns_id = get_ns_id(pid, &cgroup_ns_desc, &ids->has_cgroup_ns_id);
 	if (!ids->cgroup_ns_id) {
 		pr_err("Can't make cgroup id\n");