Commit d4c67416 authored by Andrey Vagin's avatar Andrey Vagin Committed by Cyrill Gorcunov

parasite: transfer image fd in parasite

Don't open image files from parasite.
Signed-off-by: 's avatarAndrey Vagin <avagin@openvz.org>
Acked-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 13faf4ee
......@@ -68,16 +68,8 @@ struct parasite_init_args {
struct sockaddr_un saddr;
};
struct parasite_dump_file_args {
parasite_status_t status;
unsigned long open_mode;
unsigned long open_flags;
char open_path[PATH_MAX];
};
struct parasite_dump_pages_args {
struct parasite_dump_file_args fa;
parasite_status_t status;
struct vma_entry vma_entry;
unsigned long nrpages_dumped; /* how many pages are dumped */
unsigned long fd;
......
......@@ -383,34 +383,34 @@ out:
return ret;
}
static int parasite_prep_file(int type, struct parasite_dump_file_args *fa,
static int parasite_prep_file(int type,
struct parasite_ctl *ctl, struct cr_fdset *fdset)
{
if (get_image_path(fa->open_path, sizeof(fa->open_path),
fdset_template[type].fmt, ctl->pid))
return -1;
int ret;
if (fchmod(fdset->fds[type], CR_FD_PERM_DUMP)) {
pr_perror("Can't change permissions on %d file", type);
return -1;
}
fa->open_flags = O_WRONLY;
fa->open_mode = CR_FD_PERM_DUMP;
ret = parasite_send_fd(ctl, fdset->fds[type]);
if (ret)
return ret;
return 0;
}
static int parasite_file_cmd(int cmd, int type,
struct parasite_ctl *ctl, struct cr_fdset *cr_fdset)
{
struct parasite_dump_file_args args = { };
parasite_status_t args = { };
int status, ret = -1;
pr_info("\n");
pr_info("Dumping sigactions (pid: %d)\n", ctl->pid);
pr_info("----------------------------------------\n");
ret = parasite_prep_file(type, &args, ctl, cr_fdset);
ret = parasite_prep_file(type, ctl, cr_fdset);
if (ret < 0)
goto out;
......@@ -488,7 +488,7 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct list_head *vma_a
pr_info("Dumping pages (type: %d pid: %d)\n", CR_FD_PAGES, ctl->pid);
pr_info("----------------------------------------\n");
ret = parasite_prep_file(CR_FD_PAGES, &parasite_dumppages.fa, ctl, cr_fdset);
ret = parasite_prep_file(CR_FD_PAGES, ctl, cr_fdset);
if (ret < 0)
goto out;
......@@ -519,9 +519,9 @@ int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct list_head *vma_a
sizeof(parasite_dumppages));
if (ret) {
pr_panic("Dumping pages failed with %li (%li) at %li\n",
parasite_dumppages.fa.status.ret,
parasite_dumppages.fa.status.sys_ret,
parasite_dumppages.fa.status.line);
parasite_dumppages.status.ret,
parasite_dumppages.status.sys_ret,
parasite_dumppages.status.line);
goto err_restore;
}
......
......@@ -94,27 +94,13 @@ static inline int should_dump_page(struct vma_entry *vmae, unsigned char mincore
#endif
}
static int parasite_open_file(struct parasite_dump_file_args *fa)
{
int fd;
fd = sys_open(fa->open_path, fa->open_flags, fa->open_mode);
if (fd < 0) {
sys_write_msg("sys_open failed\n");
SET_PARASITE_STATUS(&fa->status, PARASITE_ERR_OPEN, fd);
fd = fa->status.ret;
}
return fd;
}
/*
* This is the main page dumping routine, it's executed
* inside a victim process space.
*/
static int dump_pages(struct parasite_dump_pages_args *args)
{
parasite_status_t *st = &args->fa.status;
parasite_status_t *st = &args->status;
unsigned long nrpages, pfn, length;
unsigned long prot_old, prot_new;
unsigned char *map_brk = NULL;
......@@ -126,7 +112,7 @@ static int dump_pages(struct parasite_dump_pages_args *args)
prot_old = prot_new = 0;
if (args->fd == -1UL) {
ret = parasite_open_file(&args->fa);
ret = recv_fd(tsock);
if (ret < 0)
goto err;
......@@ -241,16 +227,15 @@ err:
return ret;
}
static int dump_sigact(struct parasite_dump_file_args *args)
static int dump_sigact(parasite_status_t *st)
{
parasite_status_t *st = &args->status;
rt_sigaction_t act;
struct sa_entry e;
int fd, sig;
int ret = PARASITE_ERR_FAIL;
fd = parasite_open_file(args);
fd = recv_fd(tsock);
if (fd < 0)
return fd;
......@@ -318,16 +303,15 @@ static int dump_itimer(int which, int fd, parasite_status_t *st)
return 0;
}
static int dump_itimers(struct parasite_dump_file_args *args)
static int dump_itimers(parasite_status_t *st)
{
parasite_status_t *st = &args->status;
rt_sigaction_t act;
struct sa_entry e;
int fd, sig;
int ret = PARASITE_ERR_FAIL;
fd = parasite_open_file(args);
fd = recv_fd(tsock);
if (fd < 0)
return fd;
......@@ -398,7 +382,6 @@ static int __used parasite_service(unsigned long cmd, void *args, void *brk)
brk_init(brk);
BUILD_BUG_ON(sizeof(struct parasite_dump_pages_args) > PARASITE_ARG_SIZE);
BUILD_BUG_ON(sizeof(struct parasite_dump_file_args) > PARASITE_ARG_SIZE);
switch (cmd) {
case PARASITE_CMD_PINGME:
......@@ -412,9 +395,9 @@ static int __used parasite_service(unsigned long cmd, void *args, void *brk)
case PARASITE_CMD_DUMPPAGES:
return dump_pages((struct parasite_dump_pages_args *)args);
case PARASITE_CMD_DUMP_SIGACTS:
return dump_sigact((struct parasite_dump_file_args *)args);
return dump_sigact((parasite_status_t *)args);
case PARASITE_CMD_DUMP_ITIMERS:
return dump_itimers((struct parasite_dump_file_args *)args);
return dump_itimers((parasite_status_t *)args);
case PARASITE_CMD_DUMP_MISC:
return dump_misc((struct parasite_dump_misc *)args);
default:
......
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