[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