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