diff --git a/cr-dump.c b/cr-dump.c index 5e1642a80..df12fd2f1 100644 --- a/cr-dump.c +++ b/cr-dump.c @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -1142,6 +1143,7 @@ static int dump_one_task(struct pstree_item *item, struct cr_fdset *cr_fdset) struct parasite_ctl *parasite_ctl; int ret = -1; int pid_dir; + struct parasite_dump_misc misc; pr_info("========================================\n"); pr_info("Dumping task (pid: %d)\n", pid); @@ -1217,6 +1219,12 @@ static int dump_one_task(struct pstree_item *item, struct cr_fdset *cr_fdset) goto err; } + ret = parasite_dump_misc_seized(parasite_ctl, &misc); + if (ret) { + pr_err("Can't dump misc (pid: %d)\n", pid); + goto err; + } + ret = parasite_cure_seized(parasite_ctl, &vma_area_list); if (ret) { pr_err("Can't cure (pid: %d) from parasite\n", pid); diff --git a/include/parasite-syscall.h b/include/parasite-syscall.h index 6b506c054..0ab9fe5a4 100644 --- a/include/parasite-syscall.h +++ b/include/parasite-syscall.h @@ -41,6 +41,9 @@ extern int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct list_head extern int parasite_dump_sigacts_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset); extern int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_fdset); +struct parasite_dump_misc; +extern int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_misc *); + extern struct parasite_ctl *parasite_infect_seized(pid_t pid, struct list_head *vma_area_list); extern int parasite_cure_seized(struct parasite_ctl *ctl, struct list_head *vma_area_list); diff --git a/include/parasite.h b/include/parasite.h index 0bdafa560..dc124a751 100644 --- a/include/parasite.h +++ b/include/parasite.h @@ -35,6 +35,7 @@ enum { PARASITE_CMD_DUMPPAGES, PARASITE_CMD_DUMP_SIGACTS, PARASITE_CMD_DUMP_ITIMERS, + PARASITE_CMD_DUMP_MISC, PARASITE_CMD_MAX, }; @@ -73,6 +74,15 @@ struct parasite_dump_pages_args { unsigned long fd; }; +/* + * Misc sfuff, that is too small for separate file, but cannot + * be read w/o using parasite + */ + +struct parasite_dump_misc { + parasite_status_t status; +}; + /* * Some useful offsets */ diff --git a/parasite-syscall.c b/parasite-syscall.c index acf224920..6b3e0e700 100644 --- a/parasite-syscall.c +++ b/parasite-syscall.c @@ -393,6 +393,12 @@ int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_f return parasite_file_cmd(PARASITE_CMD_DUMP_ITIMERS, CR_FD_ITIMERS, ctl, cr_fdset); } +int parasite_dump_misc_seized(struct parasite_ctl *ctl, struct parasite_dump_misc *misc) +{ + return parasite_execute(PARASITE_CMD_DUMP_MISC, ctl, + (parasite_status_t *)misc, sizeof(struct parasite_dump_misc)); +} + /* * This routine drives parasite code (been previously injected into a victim * process) and tells it to dump pages into the file. diff --git a/parasite.c b/parasite.c index ac9d122e2..583604b14 100644 --- a/parasite.c +++ b/parasite.c @@ -348,6 +348,14 @@ err_close: return ret; } +static int dump_misc(struct parasite_dump_misc *args) +{ + parasite_status_t *st = &args->status; + + SET_PARASITE_STATUS(st, 0, 0); + return 0; +} + static int __used parasite_service(unsigned long cmd, void *args, void *brk) { brk_init(brk); @@ -367,6 +375,8 @@ static int __used parasite_service(unsigned long cmd, void *args, void *brk) return dump_sigact((struct parasite_dump_file_args *)args); case PARASITE_CMD_DUMP_ITIMERS: return dump_itimers((struct parasite_dump_file_args *)args); + case PARASITE_CMD_DUMP_MISC: + return dump_misc((struct parasite_dump_misc *)args); default: sys_write_msg("Unknown command to parasite\n"); break;