[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