@@ -138,6 +138,7 @@ extern int prepare_namespace(struct pstree_item *item, unsigned long clone_flags
extern int switch_ns(int pid, struct ns_desc *nd, int *rst);
extern int restore_ns(int rst, struct ns_desc *nd);
+extern int read_ns_id(pid_t pid, struct ns_desc *nd, unsigned int *kid);
extern int dump_task_ns_ids(struct pstree_item *);
extern int predump_task_ns_ids(struct pstree_item *);
extern struct ns_id *rst_new_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd, enum ns_type t);
@@ -386,6 +386,34 @@ int walk_namespaces(struct ns_desc *nd, int (*cb)(struct ns_id *, void *), void
return ret;
}
+int read_ns_id(pid_t pid, struct ns_desc *nd, unsigned int *kid)
+{
+ int proc_dir, ret;
+ char ns_path[10], ns_id[32];
+
+ proc_dir = open_pid_proc(pid);
+ if (proc_dir < 0)
+ return -1;
+
+ sprintf(ns_path, "ns/%s", nd->str);
+ ret = readlinkat(proc_dir, ns_path, ns_id, sizeof(ns_id) - 1);
+ if (ret < 0) {
+ if (errno == ENOENT) {
+ /* The namespace is unsupported */
+ *kid = 0;
+ return 0;
+ }
+ pr_perror("Can't readlink ns link");
+ return -1;
+ }
+ ns_id[ret] = '\0';
+
+ *kid = parse_ns_link(ns_id, ret, nd);
+ BUG_ON(!*kid);
+
+ return 0;
+}
+
static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd,
struct ns_id **ns_ret)
{
@@ -428,31 +456,11 @@ static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd
static unsigned int __get_ns_id(int pid, struct ns_desc *nd, protobuf_c_boolean *supported, struct ns_id **ns)
{
- int proc_dir, ret;
unsigned int kid;
- char ns_path[10], ns_id[32];
- proc_dir = open_pid_proc(pid);
- if (proc_dir < 0)
- return 0;
-
- sprintf(ns_path, "ns/%s", nd->str);
- ret = readlinkat(proc_dir, ns_path, ns_id, sizeof(ns_id) - 1);
- if (ret < 0) {
- if (errno == ENOENT) {
- /* The namespace is unsupported */
- kid = 0;
- goto out;
- }
- pr_perror("Can't readlink ns link");
+ if (read_ns_id(pid, nd, &kid) < 0)
return 0;
- }
- ns_id[ret] = '\0';
- kid = parse_ns_link(ns_id, ret, nd);
- BUG_ON(!kid);
-
-out:
if (supported)
*supported = kid != 0;
return generate_ns_id(pid, kid, nd, ns);
Signed-off-by: Kirill Tkhai <ktkhai@virtuozzo.com> --- criu/include/namespaces.h | 1 + criu/namespaces.c | 50 ++++++++++++++++++++++++++------------------- 2 files changed, 30 insertions(+), 21 deletions(-)