[CRIU] [PATCH 2/3] ns: Add ns_get_parent() feature

Kirill Tkhai ktkhai at virtuozzo.com
Wed May 17 05:19:38 PDT 2017


Check for NS_GET_PARENT nsfs ioctl().

Signed-off-by: Kirill Tkhai <ktkhai at virtuozzo.com>
---
 criu/cr-check.c        |   14 ++++++++++++++
 criu/include/kerndat.h |    2 ++
 criu/kerndat.c         |   23 +++++++++++++++++++++++
 3 files changed, 39 insertions(+)

diff --git a/criu/cr-check.c b/criu/cr-check.c
index 4ef2a46ae..ab2a61abe 100644
--- a/criu/cr-check.c
+++ b/criu/cr-check.c
@@ -1124,6 +1124,18 @@ static int check_ns_get_userns(void)
 	return 0;
 }
 
+static int check_ns_get_parent(void)
+{
+	if (kerndat_has_ns_get_parent() < 0)
+		return -1;
+
+	if (!kdat.has_ns_get_parent)
+		return -1;
+
+	return 0;
+}
+
+
 static int (*chk_feature)(void);
 
 /*
@@ -1230,6 +1242,7 @@ int cr_check(void)
 		ret |= check_sk_netns();
 		ret |= check_ns_pid();
 		ret |= check_ns_get_userns();
+		ret |= check_ns_get_parent();
 	}
 
 	/*
@@ -1312,6 +1325,7 @@ static struct feature_list feature_list[] = {
 	{ "link_nsid", check_link_nsid},
 	{ "ns_pid", check_ns_pid},
 	{ "ns_get_userns", check_ns_get_userns },
+	{ "ns_get_parent", check_ns_get_parent },
 	{ NULL, NULL },
 };
 
diff --git a/criu/include/kerndat.h b/criu/include/kerndat.h
index bc6a9f1d4..da184c054 100644
--- a/criu/include/kerndat.h
+++ b/criu/include/kerndat.h
@@ -51,6 +51,7 @@ struct kerndat_s {
 	bool has_link_nsid;
 	bool has_nspid;
 	bool has_ns_get_userns;
+	bool has_ns_get_parent;
 };
 
 extern struct kerndat_s kdat;
@@ -75,5 +76,6 @@ extern int kerndat_tcp_repair();
 extern int kerndat_uffd(void);
 extern int kerndat_has_nspid(void);
 extern int kerndat_has_ns_get_userns(void);
+extern int kerndat_has_ns_get_parent(void);
 
 #endif /* __CR_KERNDAT_H__ */
diff --git a/criu/kerndat.c b/criu/kerndat.c
index 770c6568e..3204d4bc1 100644
--- a/criu/kerndat.c
+++ b/criu/kerndat.c
@@ -674,6 +674,27 @@ int kerndat_has_ns_get_userns(void)
 	return 0;
 }
 
+int kerndat_has_ns_get_parent(void)
+{
+	int ns, p_ns;
+
+	ns = open("/proc/self/ns/user", O_RDONLY);
+	if (ns < 0) {
+		perror("Can't open user ns");
+		return -1;
+	}
+
+	p_ns = ioctl(ns, NS_GET_PARENT);
+	if (p_ns >= 0 || errno == EPERM) {
+		kdat.has_ns_get_parent = true;
+		close(p_ns);
+	}
+
+	close(ns);
+	return 0;
+}
+
+
 #define KERNDAT_CACHE_FILE	KDAT_RUNDIR"/criu.kdat"
 #define KERNDAT_CACHE_FILE_TMP	KDAT_RUNDIR"/.criu.kdat"
 
@@ -797,6 +818,8 @@ int kerndat_init(void)
 		ret = kerndat_uffd();
 	if (!ret)
 		ret = kerndat_has_ns_get_userns();
+	if (!ret)
+		ret = kerndat_has_ns_get_parent();
 
 	kerndat_lsm();
 	kerndat_mmap_min_addr();



More information about the CRIU mailing list