[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