[CRIU] [PATCH 10/16] restore: look up root for each file
Pavel Emelyanov
xemul at parallels.com
Wed Apr 9 08:05:24 PDT 2014
On 04/09/2014 03:35 AM, Andrey Vagin wrote:
> Signed-off-by: Andrey Vagin <avagin at openvz.org>
> ---
> files-reg.c | 16 +++++++++++++++-
> include/proc_parse.h | 1 +
> mount.c | 1 +
> 3 files changed, 17 insertions(+), 1 deletion(-)
>
> diff --git a/files-reg.c b/files-reg.c
> index 750b356..81736d5 100644
> --- a/files-reg.c
> +++ b/files-reg.c
> @@ -23,6 +23,7 @@
> #include "fs-magic.h"
> #include "asm/atomic.h"
> #include "namespaces.h"
> +#include "proc_parse.h"
>
> #include "protobuf.h"
> #include "protobuf/regfile.pb-c.h"
> @@ -608,9 +609,22 @@ int open_path(struct file_desc *d,
> struct reg_file_info *rfi;
> int tmp;
> char *orig_path = NULL;
> + struct mount_info *m;
>
> rfi = container_of(d, struct reg_file_info, d);
>
> + if (rfi->rfe->mnt_id >= 0) {
> + m = lookup_mnt_id(rfi->rfe->mnt_id);
> + if (m == NULL) {
> + pr_err("Unable to look up the %d mntns: %s\n",
> + rfi->rfe->mnt_id, rfi->path);
> + return -1;
> + }
> +
> + if (mntns_collect_root(m->nsid->pid))
We perform root lookup every single fd? Shouldn't it be per-task?
> + return -1;
> + }
> +
> if (rfi->remap) {
> mutex_lock(ghost_file_mutex);
> if (rfi_remap(rfi) < 0) {
> @@ -674,7 +688,7 @@ static int do_open_reg_noseek_flags(struct reg_file_info *rfi, void *arg)
> u32 flags = *(u32 *)arg;
> int fd;
>
> - fd = open(rfi->path, flags);
> + fd = openat(mntns_root, rfi->path, flags);
This should be the respective service fd, isn't it?
> if (fd < 0) {
> pr_perror("Can't open file %s on restore", rfi->path);
> return fd;
> diff --git a/include/proc_parse.h b/include/proc_parse.h
> index c42a48c..423b490 100644
> --- a/include/proc_parse.h
> +++ b/include/proc_parse.h
> @@ -116,6 +116,7 @@ struct mount_info {
> int is_file;
> bool is_root;
> struct mount_info *next;
> + struct ns_id *nsid;
>
> /* tree linkage */
> struct mount_info *parent;
> diff --git a/mount.c b/mount.c
> index 9b40903..57f9d5f 100644
> --- a/mount.c
> +++ b/mount.c
> @@ -1445,6 +1445,7 @@ static int collect_mnt_from_image(struct mount_info **pms, struct ns_id *nsid)
> if (!pm)
> goto err;
>
> + pm->nsid = nsid;
> pm->next = *pms;
> *pms = pm;
>
>
More information about the CRIU
mailing list