[CRIU] [PATCH] mount: restore cwd in open_mountpoint()
Pavel Emelyanov
xemul at parallels.com
Thu Apr 2 07:43:11 PDT 2015
On 04/02/2015 03:47 PM, Andrey Vagin wrote:
> setns(fd, CLONE_NEWNS) resets cwd and root, so we need to
> restore them back.
>
> Without this patch stats-dump isn't saved in the work dir:
> -rw-r--r-- 1 root root 32 Apr 2 14:21 /stats-dump
Why? I mean -- who does open_mountpoint() and screws dump-stats?
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> mount.c | 19 ++++++++++++++++++-
> 1 file changed, 18 insertions(+), 1 deletion(-)
>
> diff --git a/mount.c b/mount.c
> index 11651e4..2b7597b 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -775,6 +775,7 @@ static int open_mountpoint(struct mount_info *pm)
> {
> int fd = -1, ns_old = -1;
> char mnt_path[] = "/tmp/cr-tmpfs.XXXXXX";
> + int cwd_fd;
>
> /*
> * If a mount doesn't have children, we can open a mount point,
> @@ -793,8 +794,14 @@ static int open_mountpoint(struct mount_info *pm)
> * mkdtemp, setns(tgt), mount, open, detach, setns(old).
> */
>
> - if (switch_ns(root_item->pid.real, &mnt_ns_desc, &ns_old) < 0)
> + cwd_fd = open(".", O_DIRECTORY);
> + if (cwd_fd < 0) {
> + pr_perror("Unable to open cwd");
> return -1;
> + }
> +
> + if (switch_ns(root_item->pid.real, &mnt_ns_desc, &ns_old) < 0)
Is it the only place where we can switch_ns to mntns?
> + goto out;
>
> if (mkdtemp(mnt_path) == NULL) {
> pr_perror("Can't create a temporary directory");
> @@ -816,12 +823,22 @@ static int open_mountpoint(struct mount_info *pm)
> ns_old = -1;
> goto out;
> }
> + if (fchdir(cwd_fd)) {
> + pr_perror("Unable to restore cwd");
> + close(cwd_fd);
> + close(fd);
> + return -1;
> + }
> + close(cwd_fd);
>
> return __open_mountpoint(pm, fd);;
> out:
> if (ns_old >= 0)
> restore_ns(ns_old, &mnt_ns_desc);
> close_safe(&fd);
> + if (fchdir(cwd_fd))
> + pr_perror("Unable to restore cwd");
> + close(cwd_fd);
> return -1;
> }
>
>
More information about the CRIU
mailing list