Commit b984eeff authored by Pavel Emelyanov's avatar Pavel Emelyanov

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: 's avatarPavel Emelyanov <xemul@parallels.com>
parent fe70efad
......@@ -343,22 +343,26 @@ static int dump_one_fdinfo(struct fd_parms *p, int lfd,
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;
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");
if (fd < 0)
return -1;
ret = do_dump_one_fdinfo(&params, fd, cr_fdset);
if (fstat(fd, &params.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, &params);
close(fd);
return ret;
......@@ -449,17 +453,6 @@ static int dump_task_files_seized(struct parasite_ctl *ctl, const struct cr_fdse
if (ret)
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++) {
ret = dump_one_fd(ctl->pid, fds[i], lfds[i], cr_fdset);
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))
return -1;
if (dump_task_exe_link(pid, &mme))
return -1;
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)
{
int fd;
int fd, exe_fd;
fd = open_image_ro(CR_FD_MM, pid);
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)
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);
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->logfd = log_get_fd();
task_args->sigchld_act = sigchld_act;
task_args->fd_exe_link = self_exe_fd;
task_args->fd_pages = fd_pages;
ret = prepare_itimers(pid, task_args);
......
......@@ -59,7 +59,6 @@ static char *fdtype2s(u8 type)
static char und[4];
static char *fdtypes[] = {
[FDINFO_REG] = "reg",
[FDINFO_EXE] = "exe",
[FDINFO_INETSK] = "isk",
[FDINFO_PIPE] = "pipe",
[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("\tEnv start: %lx\n", mme.mm_env_start);
pr_msg("\tEnv end: %lx\n", mme.mm_env_end);
pr_msg("\tExe file ID %x\n", mme.exe_file_id);
out:
pr_img_tail(CR_FD_MM);
}
......
......@@ -245,6 +245,19 @@ static int open_fe_fd(struct file_desc *d)
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)
{
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);
}
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,
int pid, long fd)
{
......@@ -476,9 +466,6 @@ static int open_special_fdinfo(int pid, struct fdinfo_entry *fe,
if (state != FD_STATE_RECV)
return 0;
if (fe->type == FDINFO_EXE)
return restore_exe_early(fe, fdinfo_fd);
pr_info("%d: fe->type: %d\n", pid, fe->type);
BUG_ON(1);
return -1;
......
......@@ -67,6 +67,7 @@ extern int prepare_fd_pid(int pid);
extern int prepare_shared_fdinfo(void);
extern int get_filemap_fd(int pid, struct vma_entry *vma_entry);
extern int prepare_fs(int pid);
extern int open_reg_by_id(u32 id);
extern int self_exe_fd;
......
......@@ -39,7 +39,6 @@ enum fd_types {
FDINFO_PIPE,
FDINFO_INETSK,
FDINFO_UNIXSK,
FDINFO_EXE,
FD_INFO_MAX
};
......@@ -62,7 +61,7 @@ struct fdinfo_entry {
u32 id;
} __packed;
#define fd_is_special(fe) ((fe)->type == FDINFO_EXE)
#define fd_is_special(fe) (0)
struct fs_entry {
u32 cwd_id;
......@@ -370,6 +369,7 @@ struct mm_entry {
u64 mm_env_start;
u64 mm_env_end;
u64 mm_saved_auxv[AT_VECTOR_SIZE];
u32 exe_file_id;
} __packed;
struct core_entry {
......
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