[v2,05/30] ns: Add top_net_ns global variable

Submitted by Kirill Tkhai on June 7, 2017, 11:25 a.m.

Details

Message ID 149683470110.4663.16489189678530566636.stgit@localhost.localdomain
State Accepted
Series "Support sockets leaked to child user_ns task"
Commit 698f4d340881b04a9d348934aac8315761e66ba1
Headers show

Commit Message

Kirill Tkhai June 7, 2017, 11:25 a.m.
It will be need for fast obtaining root_item's net_ns,
and to fixup old dumps.

v2: Add a comment to top_xxx_ns. Extend MARK_ROOT_NS().

Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com>
---
 criu/include/namespaces.h |    1 +
 criu/namespaces.c         |   22 +++++++++++++++++-----
 2 files changed, 18 insertions(+), 5 deletions(-)

Patch hide | download patch | download mbox

diff --git a/criu/include/namespaces.h b/criu/include/namespaces.h
index 631d6228a..4e06ebc0f 100644
--- a/criu/include/namespaces.h
+++ b/criu/include/namespaces.h
@@ -163,6 +163,7 @@  struct ns_id {
 extern struct ns_id *ns_ids;
 extern struct ns_id *top_pid_ns;
 extern struct ns_id *root_user_ns;
+extern struct ns_id *top_net_ns;
 
 #define NS_DESC_ENTRY(_cflag, _str, _alt_str)		\
 	{						\
diff --git a/criu/namespaces.c b/criu/namespaces.c
index 4d4edb56b..5ab64ccc6 100644
--- a/criu/namespaces.c
+++ b/criu/namespaces.c
@@ -893,8 +893,15 @@  static int set_ns_hookups(struct ns_id *ns)
 	return ret;
 }
 
+/*
+ * top_xxx_ns -- top namespaces of the dumped/restored tasks.
+ * For not-hierarchical types this means namespace of root_item.
+ * For hierarchical types this means the grand parent namespace,
+ * which is ancestor of all others.
+ */
 struct ns_id *top_pid_ns = NULL;
 struct ns_id *root_user_ns = NULL;
+struct ns_id *top_net_ns = NULL;
 /* Mapping NS_ROOT to NS_CRIU */
 UsernsEntry *userns_entry;
 
@@ -2135,7 +2142,7 @@  int read_ns_with_hookups(void)
 	return ret;
 }
 
-static int mark_root_ns(uint32_t id, struct ns_desc *desc)
+static int mark_root_ns(uint32_t id, struct ns_desc *desc, struct ns_id **ns_ret)
 {
 	struct ns_id *ns;
 
@@ -2145,18 +2152,23 @@  static int mark_root_ns(uint32_t id, struct ns_desc *desc)
 		return -1;
 	}
 	ns->type = NS_ROOT;
+
+	if (ns_ret)
+		*ns_ret = ns;
+
 	return 0;
 }
 
-#define MARK_ROOT_NS(ids, name)	\
-	(ids->has_##name##_ns_id && mark_root_ns(ids->name##_ns_id, &name##_ns_desc) < 0)
+#define MARK_ROOT_NS(ids, name, ns)	\
+	(ids->has_##name##_ns_id && mark_root_ns(ids->name##_ns_id, &name##_ns_desc, ns) < 0)
 
 int set_ns_roots(void)
 {
 	TaskKobjIdsEntry *ids = root_item->ids;
 	/* Set root for all namespaces except user and pid, which are set in read_ns_with_hookups() */
-	if (MARK_ROOT_NS(ids, net) || MARK_ROOT_NS(ids, ipc) || MARK_ROOT_NS(ids, uts) ||
-	    MARK_ROOT_NS(ids, mnt) || MARK_ROOT_NS(ids, cgroup))
+	if (MARK_ROOT_NS(ids, net, &top_net_ns) || MARK_ROOT_NS(ids, ipc, NULL) ||
+	    MARK_ROOT_NS(ids, uts, NULL) || MARK_ROOT_NS(ids, mnt, NULL) ||
+	    MARK_ROOT_NS(ids, cgroup, NULL))
 		return -1;
 	return 0;
 }