[CRIU] Re: [PATCH cr 8/8] restore: mount proc for a new pid namespace

Pavel Emelyanov xemul at parallels.com
Wed May 16 07:50:19 EDT 2012


On 05/16/2012 12:32 PM, Andrey Vagin wrote:
> proc is needed for restoring shared mappings.

This comment sucks a lot.

> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
>  cr-restore.c |   35 ++++++++++++++++++++++++++++++++---
>  1 files changed, 32 insertions(+), 3 deletions(-)
> 
> diff --git a/cr-restore.c b/cr-restore.c
> index a257925..5bea27e 100644
> --- a/cr-restore.c
> +++ b/cr-restore.c
> @@ -17,6 +17,7 @@
>  #include <sys/wait.h>
>  #include <sys/file.h>
>  #include <sys/shm.h>
> +#include <sys/mount.h>
>  
>  #include <sched.h>
>  
> @@ -506,9 +507,7 @@ static inline int fork_with_pid(int pid, unsigned long ns_clone_flags)
>  		goto err_close;
>  	}
>  
> -	if (pid == 1) {
> -		ca.clone_flags |= CLONE_NEWPID;
> -	} else
> +	if (pid != 1)
>  		if (write_img_buf(ca.fd, buf, strlen(buf)))
>  			goto err_unlock;
>  
> @@ -601,6 +600,8 @@ static void restore_pgid(void)
>  	}
>  }
>  
> +static char proc_mountpoint[PATH_MAX] = "/proc";
> +
>  static int restore_task_with_children(void *_arg)
>  {
>  	struct cr_clone_arg *ca = _arg;
> @@ -616,6 +617,15 @@ static int restore_task_with_children(void *_arg)
>  		exit(-1);
>  	}
>  
> +	if (pid == 1) { /* New pid namespace */
> +		ret = mount("proc", proc_mountpoint, "proc", MS_MGC_VAL, NULL);
> +		if (ret == -1) {
> +			pr_err("mount failed");
> +			exit(1);
> +		}
> +		set_proc_mountpoint(proc_mountpoint);
> +	}
> +
>  	ret = log_init_by_pid();
>  	if (ret < 0)
>  		exit(1);
> @@ -699,6 +709,15 @@ static int restore_root_task(pid_t pid, struct cr_options *opts)
>  	 * this later.
>  	 */
>  
> +	if (init->pid.pid == 1) {
> +		sprintf(proc_mountpoint, "/tmp/crtools-proc.XXXXXX");
> +		if (mkdtemp(proc_mountpoint) == NULL) {
> +			pr_err("mkdtemp failed %m");
> +			return -1;
> +		}
> +		opts->namespaces_flags |= CLONE_NEWPID;
> +	}
> +
>  	ret = fork_with_pid(init->pid.pid, opts->namespaces_flags);
>  	if (ret < 0)
>  		return -1;
> @@ -717,6 +736,16 @@ static int restore_root_task(pid_t pid, struct cr_options *opts)
>  	ret = (int)futex_get(&task_entries->nr_in_progress);
>  
>  out:
> +	if (init->pid.pid == 1) {
> +		int err;
> +		err = umount(proc_mountpoint);
> +		if (err == -1)
> +			pr_err("Can't umount %s", proc_mountpoint);
> +		err = rmdir(proc_mountpoint);
> +		if (err == -1)
> +			pr_err("Can't delete %s", proc_mountpoint);
> +	}
> +
>  	if (ret < 0) {
>  		pr_err("Someone can't be restored\n");
>  		struct pstree_item *pi;



More information about the CRIU mailing list