mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 06:45:35 +00:00
mm: Move exe file id on mm_entry
This is mm_struct entity, so save one there. Also gets rid of special FDINFO-s. Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
This commit is contained in:
36
cr-dump.c
36
cr-dump.c
@@ -343,22 +343,26 @@ static int dump_one_fdinfo(struct fd_parms *p, int lfd,
|
|||||||
return do_dump_one_fdinfo(p, lfd, cr_fdset);
|
return do_dump_one_fdinfo(p, lfd, cr_fdset);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int dump_task_special_files(pid_t pid, const struct cr_fdset *cr_fdset)
|
static int dump_task_exe_link(pid_t pid, struct mm_entry *mm)
|
||||||
{
|
{
|
||||||
struct fd_parms params;
|
struct fd_parms params;
|
||||||
int fd, ret;
|
int fd, ret;
|
||||||
|
|
||||||
/* Dump /proc/pid/exe */
|
|
||||||
params = (struct fd_parms) {
|
|
||||||
.id = FD_ID_INVALID,
|
|
||||||
.pid = FD_PID_INVALID,
|
|
||||||
.type = FDINFO_EXE,
|
|
||||||
};
|
|
||||||
|
|
||||||
fd = open_proc(pid, "exe");
|
fd = open_proc(pid, "exe");
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
return -1;
|
return -1;
|
||||||
ret = do_dump_one_fdinfo(¶ms, fd, cr_fdset);
|
|
||||||
|
if (fstat(fd, ¶ms.stat) < 0) {
|
||||||
|
pr_perror("Can't fstat exe link");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
params.type = FDINFO_REG;
|
||||||
|
params.flags = 0;
|
||||||
|
params.pos = 0;
|
||||||
|
mm->exe_file_id = fd_id_generate_special();
|
||||||
|
|
||||||
|
ret = dump_one_reg_file(fd, mm->exe_file_id, ¶ms);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
@@ -449,17 +453,6 @@ static int dump_task_files_seized(struct parasite_ctl *ctl, const struct cr_fdse
|
|||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
/*
|
|
||||||
* Dump special files at the beginning. We might need
|
|
||||||
* to re-read them in restorer, so better to make it
|
|
||||||
* fast.
|
|
||||||
*/
|
|
||||||
ret = dump_task_special_files(ctl->pid, cr_fdset);
|
|
||||||
if (ret) {
|
|
||||||
pr_err("Can't dump special files\n");
|
|
||||||
goto err;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < nr_fds; i++) {
|
for (i = 0; i < nr_fds; i++) {
|
||||||
ret = dump_one_fd(ctl->pid, fds[i], lfds[i], cr_fdset);
|
ret = dump_one_fd(ctl->pid, fds[i], lfds[i], cr_fdset);
|
||||||
close(lfds[i]);
|
close(lfds[i]);
|
||||||
@@ -734,6 +727,9 @@ static int dump_task_mm(pid_t pid, const struct proc_pid_stat *stat,
|
|||||||
if (get_task_auxv(pid, &mme))
|
if (get_task_auxv(pid, &mme))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (dump_task_exe_link(pid, &mme))
|
||||||
|
return -1;
|
||||||
|
|
||||||
return write_img(fdset_fd(fdset, CR_FD_MM), &mme);
|
return write_img(fdset_fd(fdset, CR_FD_MM), &mme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1028,7 +1028,7 @@ static struct vma_entry *vma_list_remap(void *addr, unsigned long len, struct li
|
|||||||
|
|
||||||
static int prepare_mm(pid_t pid, struct task_restore_core_args *args)
|
static int prepare_mm(pid_t pid, struct task_restore_core_args *args)
|
||||||
{
|
{
|
||||||
int fd;
|
int fd, exe_fd;
|
||||||
|
|
||||||
fd = open_image_ro(CR_FD_MM, pid);
|
fd = open_image_ro(CR_FD_MM, pid);
|
||||||
if (fd < 0)
|
if (fd < 0)
|
||||||
@@ -1037,6 +1037,12 @@ static int prepare_mm(pid_t pid, struct task_restore_core_args *args)
|
|||||||
if (read_img(fd, &args->mm) < 0)
|
if (read_img(fd, &args->mm) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
exe_fd = open_reg_by_id(args->mm.exe_file_id);
|
||||||
|
if (exe_fd < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
args->fd_exe_link = exe_fd;
|
||||||
|
|
||||||
close(fd);
|
close(fd);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -1209,7 +1215,6 @@ static int sigreturn_restore(pid_t pid, struct list_head *tgt_vmas, int nr_vmas)
|
|||||||
task_args->fd_core = fd_core;
|
task_args->fd_core = fd_core;
|
||||||
task_args->logfd = log_get_fd();
|
task_args->logfd = log_get_fd();
|
||||||
task_args->sigchld_act = sigchld_act;
|
task_args->sigchld_act = sigchld_act;
|
||||||
task_args->fd_exe_link = self_exe_fd;
|
|
||||||
task_args->fd_pages = fd_pages;
|
task_args->fd_pages = fd_pages;
|
||||||
|
|
||||||
ret = prepare_itimers(pid, task_args);
|
ret = prepare_itimers(pid, task_args);
|
||||||
|
@@ -59,7 +59,6 @@ static char *fdtype2s(u8 type)
|
|||||||
static char und[4];
|
static char und[4];
|
||||||
static char *fdtypes[] = {
|
static char *fdtypes[] = {
|
||||||
[FDINFO_REG] = "reg",
|
[FDINFO_REG] = "reg",
|
||||||
[FDINFO_EXE] = "exe",
|
|
||||||
[FDINFO_INETSK] = "isk",
|
[FDINFO_INETSK] = "isk",
|
||||||
[FDINFO_PIPE] = "pipe",
|
[FDINFO_PIPE] = "pipe",
|
||||||
[FDINFO_UNIXSK] = "usk",
|
[FDINFO_UNIXSK] = "usk",
|
||||||
@@ -523,6 +522,7 @@ void show_mm(int fd_mm, struct cr_options *o)
|
|||||||
pr_msg("\tArg end: %lx\n", mme.mm_arg_end);
|
pr_msg("\tArg end: %lx\n", mme.mm_arg_end);
|
||||||
pr_msg("\tEnv start: %lx\n", mme.mm_env_start);
|
pr_msg("\tEnv start: %lx\n", mme.mm_env_start);
|
||||||
pr_msg("\tEnv end: %lx\n", mme.mm_env_end);
|
pr_msg("\tEnv end: %lx\n", mme.mm_env_end);
|
||||||
|
pr_msg("\tExe file ID %x\n", mme.exe_file_id);
|
||||||
out:
|
out:
|
||||||
pr_img_tail(CR_FD_MM);
|
pr_img_tail(CR_FD_MM);
|
||||||
}
|
}
|
||||||
|
39
files.c
39
files.c
@@ -245,6 +245,19 @@ static int open_fe_fd(struct file_desc *d)
|
|||||||
|
|
||||||
return tmp;
|
return tmp;
|
||||||
}
|
}
|
||||||
|
int open_reg_by_id(u32 id)
|
||||||
|
{
|
||||||
|
struct file_desc *fd;
|
||||||
|
|
||||||
|
fd = find_file_desc_raw(FDINFO_REG, id);
|
||||||
|
if (fd == NULL) {
|
||||||
|
pr_perror("Can't find regfile for %x\n", id);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return open_fe_fd(fd);
|
||||||
|
}
|
||||||
|
|
||||||
static int find_open_fe_fd(struct fdinfo_entry *fe)
|
static int find_open_fe_fd(struct fdinfo_entry *fe)
|
||||||
{
|
{
|
||||||
struct reg_file_info *rfi;
|
struct reg_file_info *rfi;
|
||||||
@@ -259,29 +272,6 @@ static int find_open_fe_fd(struct fdinfo_entry *fe)
|
|||||||
return open_fe_fd(&rfi->d);
|
return open_fe_fd(&rfi->d);
|
||||||
}
|
}
|
||||||
|
|
||||||
int self_exe_fd;
|
|
||||||
|
|
||||||
static int restore_exe_early(struct fdinfo_entry *fe, int fd)
|
|
||||||
{
|
|
||||||
int tmp;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We restore the EXE symlink at very late stage
|
|
||||||
* because of restrictions applied from kernel side,
|
|
||||||
* so keep this fd open till then.
|
|
||||||
*/
|
|
||||||
|
|
||||||
self_exe_fd = get_service_fd(SELF_EXE_FD_OFF);
|
|
||||||
if (self_exe_fd < 0)
|
|
||||||
return self_exe_fd;
|
|
||||||
|
|
||||||
tmp = find_open_fe_fd(fe);
|
|
||||||
if (tmp < 0)
|
|
||||||
return tmp;
|
|
||||||
|
|
||||||
return reopen_fd_as(self_exe_fd, tmp);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void transport_name_gen(struct sockaddr_un *addr, int *len,
|
static void transport_name_gen(struct sockaddr_un *addr, int *len,
|
||||||
int pid, long fd)
|
int pid, long fd)
|
||||||
{
|
{
|
||||||
@@ -476,9 +466,6 @@ static int open_special_fdinfo(int pid, struct fdinfo_entry *fe,
|
|||||||
if (state != FD_STATE_RECV)
|
if (state != FD_STATE_RECV)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (fe->type == FDINFO_EXE)
|
|
||||||
return restore_exe_early(fe, fdinfo_fd);
|
|
||||||
|
|
||||||
pr_info("%d: fe->type: %d\n", pid, fe->type);
|
pr_info("%d: fe->type: %d\n", pid, fe->type);
|
||||||
BUG_ON(1);
|
BUG_ON(1);
|
||||||
return -1;
|
return -1;
|
||||||
|
@@ -67,6 +67,7 @@ extern int prepare_fd_pid(int pid);
|
|||||||
extern int prepare_shared_fdinfo(void);
|
extern int prepare_shared_fdinfo(void);
|
||||||
extern int get_filemap_fd(int pid, struct vma_entry *vma_entry);
|
extern int get_filemap_fd(int pid, struct vma_entry *vma_entry);
|
||||||
extern int prepare_fs(int pid);
|
extern int prepare_fs(int pid);
|
||||||
|
extern int open_reg_by_id(u32 id);
|
||||||
|
|
||||||
extern int self_exe_fd;
|
extern int self_exe_fd;
|
||||||
|
|
||||||
|
@@ -39,7 +39,6 @@ enum fd_types {
|
|||||||
FDINFO_PIPE,
|
FDINFO_PIPE,
|
||||||
FDINFO_INETSK,
|
FDINFO_INETSK,
|
||||||
FDINFO_UNIXSK,
|
FDINFO_UNIXSK,
|
||||||
FDINFO_EXE,
|
|
||||||
|
|
||||||
FD_INFO_MAX
|
FD_INFO_MAX
|
||||||
};
|
};
|
||||||
@@ -62,7 +61,7 @@ struct fdinfo_entry {
|
|||||||
u32 id;
|
u32 id;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
#define fd_is_special(fe) ((fe)->type == FDINFO_EXE)
|
#define fd_is_special(fe) (0)
|
||||||
|
|
||||||
struct fs_entry {
|
struct fs_entry {
|
||||||
u32 cwd_id;
|
u32 cwd_id;
|
||||||
@@ -370,6 +369,7 @@ struct mm_entry {
|
|||||||
u64 mm_env_start;
|
u64 mm_env_start;
|
||||||
u64 mm_env_end;
|
u64 mm_env_end;
|
||||||
u64 mm_saved_auxv[AT_VECTOR_SIZE];
|
u64 mm_saved_auxv[AT_VECTOR_SIZE];
|
||||||
|
u32 exe_file_id;
|
||||||
} __packed;
|
} __packed;
|
||||||
|
|
||||||
struct core_entry {
|
struct core_entry {
|
||||||
|
Reference in New Issue
Block a user