[CRIU] [PATCH 05/16] files: save mnt_id on fd_param
Andrey Vagin
avagin at openvz.org
Tue Apr 8 16:34:57 PDT 2014
Signed-off-by: Andrey Vagin <avagin at openvz.org>
---
cr-dump.c | 29 +++++++++++++++++++++++++++--
files.c | 1 +
include/files.h | 2 ++
3 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/cr-dump.c b/cr-dump.c
index 23bd13a..85246f2 100644
--- a/cr-dump.c
+++ b/cr-dump.c
@@ -240,6 +240,17 @@ static int collect_fds(pid_t pid, struct parasite_drain_fd *dfds)
return 0;
}
+static int get_fd_mntid(int fd, int *mnt_id)
+{
+ struct fdinfo_common fdinfo = { .mnt_id = -1};
+
+ if (parse_fdinfo(fd, FD_TYPES__UND, NULL, &fdinfo))
+ return -1;
+
+ *mnt_id = fdinfo.mnt_id;
+ return 0;
+}
+
static int dump_task_exe_link(pid_t pid, MmEntry *mm)
{
struct fd_parms params = FD_PARMS_INIT;
@@ -254,8 +265,12 @@ static int dump_task_exe_link(pid_t pid, MmEntry *mm)
return -1;
}
- if (fd_id_generate_special(¶ms.stat, &mm->exe_file_id))
+ if (get_fd_mntid(fd, ¶ms.mnt_id))
+ return -1;
+
+ if (fd_id_generate_special(¶ms.stat, &mm->exe_file_id)) {
ret = dump_one_reg_file(fd, mm->exe_file_id, ¶ms);
+ }
close(fd);
return ret;
@@ -279,6 +294,9 @@ static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fd
return -1;
}
+ if (get_fd_mntid(fd, &p.mnt_id))
+ return -1;
+
if (fd_id_generate_special(&p.stat, &fe.cwd_id)) {
ret = dump_one_reg_file(fd, fe.cwd_id, &p);
if (ret < 0)
@@ -297,6 +315,9 @@ static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fd
return -1;
}
+ if (get_fd_mntid(fd, &p.mnt_id))
+ return -1;
+
if (fd_id_generate_special(&p.stat, &fe.root_id)) {
ret = dump_one_reg_file(fd, fe.root_id, &p);
if (ret < 0)
@@ -346,10 +367,14 @@ static int dump_filemap(pid_t pid, struct vma_area *vma_area,
BUG_ON(!vma_area->st);
p.stat = *vma_area->st;
+ if (get_fd_mntid(vma_area->vm_file_fd, &p.mnt_id))
+ return -1;
+
/* Flags will be set during restore in get_filemap_fd() */
- if (fd_id_generate_special(&p.stat, &id))
+ if (fd_id_generate_special(&p.stat, &id)) {
ret = dump_one_reg_file(vma_area->vm_file_fd, id, &p);
+ }
vma->shmid = id;
return ret;
diff --git a/files.c b/files.c
index e2ebeb6..cfbbb4b 100644
--- a/files.c
+++ b/files.c
@@ -225,6 +225,7 @@ static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd,
p->fd = fd;
p->pos = fdinfo.pos;
p->flags = fdinfo.flags;
+ p->mnt_id = fdinfo.mnt_id;
p->pid = ctl->pid.real;
p->fd_flags = opts->flags;
diff --git a/include/files.h b/include/files.h
index cfa40ac..a18d56e 100644
--- a/include/files.h
+++ b/include/files.h
@@ -46,6 +46,7 @@ struct fd_parms {
FownEntry fown;
struct fd_link *link;
long fs_type;
+ int mnt_id;
struct parasite_ctl *ctl;
};
@@ -55,6 +56,7 @@ struct fd_parms {
.fd = FD_DESC_INVALID, \
.fown = FOWN_ENTRY__INIT, \
.link = NULL, \
+ .mnt_id = -1, \
}
extern int fill_fdlink(int lfd, const struct fd_parms *p, struct fd_link *link);
--
1.8.5.3
More information about the CRIU
mailing list