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, ...@@ -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(&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); close(fd);
return ret; return ret;
...@@ -449,17 +453,6 @@ static int dump_task_files_seized(struct parasite_ctl *ctl, const struct cr_fdse ...@@ -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, ...@@ -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 ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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) ...@@ -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);
} }
......
...@@ -245,6 +245,19 @@ static int open_fe_fd(struct file_desc *d) ...@@ -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) ...@@ -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, ...@@ -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); ...@@ -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 { ...@@ -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 { ...@@ -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 { ...@@ -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 {
......
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