Commit 87b1f540 authored by Andrey Vagin's avatar Andrey Vagin Committed by Pavel Emelyanov

files: save mnt_id on fd_param

Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 9ea2baa2
...@@ -240,19 +240,43 @@ static int collect_fds(pid_t pid, struct parasite_drain_fd *dfds) ...@@ -240,19 +240,43 @@ static int collect_fds(pid_t pid, struct parasite_drain_fd *dfds)
return 0; 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 fill_fd_params_special(int fd, struct fd_parms *p)
{
*p = FD_PARMS_INIT;
if (fstat(fd, &p->stat) < 0) {
pr_perror("Can't fstat exe link");
return -1;
}
if (get_fd_mntid(fd, &p->mnt_id))
return -1;
return 0;
}
static int dump_task_exe_link(pid_t pid, MmEntry *mm) static int dump_task_exe_link(pid_t pid, MmEntry *mm)
{ {
struct fd_parms params = FD_PARMS_INIT; struct fd_parms params;
int fd, ret = 0; int fd, ret = 0;
fd = open_proc(pid, "exe"); fd = open_proc(pid, "exe");
if (fd < 0) if (fd < 0)
return -1; return -1;
if (fstat(fd, &params.stat) < 0) { if (fill_fd_params_special(fd, &params))
pr_perror("Can't fstat exe link");
return -1; return -1;
}
if (fd_id_generate_special(&params.stat, &mm->exe_file_id)) if (fd_id_generate_special(&params.stat, &mm->exe_file_id))
ret = dump_one_reg_file(fd, mm->exe_file_id, &params); ret = dump_one_reg_file(fd, mm->exe_file_id, &params);
...@@ -263,7 +287,7 @@ static int dump_task_exe_link(pid_t pid, MmEntry *mm) ...@@ -263,7 +287,7 @@ static int dump_task_exe_link(pid_t pid, MmEntry *mm)
static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fdset *fdset) static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fdset *fdset)
{ {
struct fd_parms p = FD_PARMS_INIT; struct fd_parms p;
FsEntry fe = FS_ENTRY__INIT; FsEntry fe = FS_ENTRY__INIT;
int fd, ret; int fd, ret;
...@@ -274,10 +298,8 @@ static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fd ...@@ -274,10 +298,8 @@ static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fd
if (fd < 0) if (fd < 0)
return -1; return -1;
if (fstat(fd, &p.stat) < 0) { if (fill_fd_params_special(fd, &p))
pr_perror("Can't stat cwd");
return -1; return -1;
}
if (fd_id_generate_special(&p.stat, &fe.cwd_id)) { if (fd_id_generate_special(&p.stat, &fe.cwd_id)) {
ret = dump_one_reg_file(fd, fe.cwd_id, &p); ret = dump_one_reg_file(fd, fe.cwd_id, &p);
...@@ -291,11 +313,8 @@ static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fd ...@@ -291,11 +313,8 @@ static int dump_task_fs(pid_t pid, struct parasite_dump_misc *misc, struct cr_fd
if (fd < 0) if (fd < 0)
return -1; return -1;
p = FD_PARMS_INIT; if (fill_fd_params_special(fd, &p))
if (fstat(fd, &p.stat) < 0) {
pr_perror("Can't stat root");
return -1; return -1;
}
if (fd_id_generate_special(&p.stat, &fe.root_id)) { if (fd_id_generate_special(&p.stat, &fe.root_id)) {
ret = dump_one_reg_file(fd, fe.root_id, &p); ret = dump_one_reg_file(fd, fe.root_id, &p);
...@@ -346,6 +365,9 @@ static int dump_filemap(pid_t pid, struct vma_area *vma_area, ...@@ -346,6 +365,9 @@ static int dump_filemap(pid_t pid, struct vma_area *vma_area,
BUG_ON(!vma_area->st); BUG_ON(!vma_area->st);
p.stat = *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() */ /* 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))
......
...@@ -225,6 +225,7 @@ static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd, ...@@ -225,6 +225,7 @@ static int fill_fd_params(struct parasite_ctl *ctl, int fd, int lfd,
p->fd = fd; p->fd = fd;
p->pos = fdinfo.pos; p->pos = fdinfo.pos;
p->flags = fdinfo.flags; p->flags = fdinfo.flags;
p->mnt_id = fdinfo.mnt_id;
p->pid = ctl->pid.real; p->pid = ctl->pid.real;
p->fd_flags = opts->flags; p->fd_flags = opts->flags;
......
...@@ -46,6 +46,7 @@ struct fd_parms { ...@@ -46,6 +46,7 @@ struct fd_parms {
FownEntry fown; FownEntry fown;
struct fd_link *link; struct fd_link *link;
long fs_type; long fs_type;
int mnt_id;
struct parasite_ctl *ctl; struct parasite_ctl *ctl;
}; };
...@@ -55,6 +56,7 @@ struct fd_parms { ...@@ -55,6 +56,7 @@ struct fd_parms {
.fd = FD_DESC_INVALID, \ .fd = FD_DESC_INVALID, \
.fown = FOWN_ENTRY__INIT, \ .fown = FOWN_ENTRY__INIT, \
.link = NULL, \ .link = NULL, \
.mnt_id = -1, \
} }
extern int fill_fdlink(int lfd, const struct fd_parms *p, struct fd_link *link); extern int fill_fdlink(int lfd, const struct fd_parms *p, struct fd_link *link);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment