[CRIU] [PATCH 05/13] restore: add mount id-s in the ns_ids list (v2)
Pavel Emelyanov
xemul at parallels.com
Tue Mar 11 12:39:01 PDT 2014
On 03/11/2014 07:18 PM, Andrey Vagin wrote:
> Currently ns_ids is filled only on dump. Now we are going to restore
> nested mount namespaces, so we need to know who share name spaces.
>
> v2: merge the patch "namespace: add a function to search an ns_id
> item by id" into this one.
>
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> include/namespaces.h | 3 +++
> namespaces.c | 39 +++++++++++++++++++++++++++++++++++++++
> pstree.c | 5 +++++
> 3 files changed, 47 insertions(+)
>
> diff --git a/include/namespaces.h b/include/namespaces.h
> index f14ea6d..065c874 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 add_ns_id(unsigned int id, pid_t pid, struct ns_desc *nd);
This is for restore, right? Let's add the "rst" into the name.
> +extern struct ns_id *lookup_ns_by_id(unsigned int id);
We have lookup_ns_id() one and it's confusing.
Other than this, IDs of namespaces of different types may
intersect, the rest of the code knows this and checks nd too.
> +
> extern int gen_predump_ns_mask(void);
>
> #endif /* __CR_NS_H__ */
> diff --git a/namespaces.c b/namespaces.c
> index 7c9b8fe..145730b 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 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_id *nsid;
> +
> + for (nsid = ns_ids; nsid != NULL; nsid = nsid->next)
> + if (nsid->id == id)
> + 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 fc0f707..f2f3fc7 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"
> @@ -385,6 +386,10 @@ static int read_pstree_image(void)
> if (ret != 1)
> goto err;
>
> + if (pi->ids->has_mnt_ns_id) {
> + if (add_ns_id(pi->ids->mnt_ns_id, pi->pid.virt, &mnt_ns_desc))
> + goto err;
> + }
> }
> err:
> close(ps_fd);
>
More information about the CRIU
mailing list