[CRIU] [PATCH 10/16] restore: look up root for each file
Andrew Vagin
avagin at parallels.com
Wed Apr 9 22:12:20 PDT 2014
On Wed, Apr 09, 2014 at 07:05:24PM +0400, Pavel Emelyanov wrote:
> 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?
No, one task can have fd-s from a few namespaces...
>
> > + 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?
mntns_root is a service fd. I will rework this accoding with your
previous comment.
>
> > 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