diff --git a/include/namespaces.h b/include/namespaces.h index f14ea6de9..ec410e286 100644 --- a/include/namespaces.h +++ b/include/namespaces.h @@ -42,6 +42,9 @@ extern int switch_ns(int pid, struct ns_desc *nd, int *rst); extern int restore_ns(int rst, struct ns_desc *nd); extern int dump_task_ns_ids(struct pstree_item *); +extern int rst_add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd); +extern struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd); + extern int gen_predump_ns_mask(void); #endif /* __CR_NS_H__ */ diff --git a/namespaces.c b/namespaces.c index 59d02b762..761304938 100644 --- a/namespaces.c +++ b/namespaces.c @@ -117,6 +117,34 @@ struct ns_id *ns_ids = NULL; static unsigned int ns_next_id = 1; unsigned long current_ns_mask = 0; +int rst_add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd) +{ + struct ns_id *nsid; + + for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) { + if (nsid->id == id) { + if (pid_rst_prio(pid, nsid->pid)) + nsid->pid = pid; + return 0; + } + } + + nsid = shmalloc(sizeof(struct ns_id)); + if (nsid == NULL) + return -1; + + nsid->nd = nd; + nsid->id = id; + nsid->pid = pid; + + nsid->next = ns_ids; + ns_ids = nsid; + + pr_info("Add namespace %d pid %d\n", nsid->id, nsid->pid); + + return 0; +} + static unsigned int lookup_ns_id(unsigned int kid, struct ns_desc *nd) { struct ns_id *nsid; @@ -128,6 +156,17 @@ static unsigned int lookup_ns_id(unsigned int kid, struct ns_desc *nd) return 0; } +struct ns_id *lookup_ns_by_id(unsigned int id, struct ns_desc *nd) +{ + struct ns_id *nsid; + + for (nsid = ns_ids; nsid != NULL; nsid = nsid->next) + if (nsid->id == id && nsid->nd == nd) + return nsid; + + return NULL; +} + static unsigned int generate_ns_id(int pid, unsigned int kid, struct ns_desc *nd) { unsigned int id; diff --git a/pstree.c b/pstree.c index efbd3bcb9..d91edea28 100644 --- a/pstree.c +++ b/pstree.c @@ -9,6 +9,7 @@ #include "namespaces.h" #include "files.h" #include "tty.h" +#include "mount.h" #include "asm/dump.h" #include "protobuf.h" @@ -413,6 +414,10 @@ static int read_pstree_image(void) if (ret != 1) goto err; + if (pi->ids->has_mnt_ns_id) { + if (rst_add_ns_id(pi->ids->mnt_ns_id, pi->pid.virt, &mnt_ns_desc)) + goto err; + } } err: close(ps_fd);