Commit 47c161f2 authored by Pavel Emelyanov's avatar Pavel Emelyanov Committed by Cyrill Gorcunov

parasite: Dump misc command

Add command and basis for dumping minor bits for task
from parasite code. It's supposed to retrieve minor bits
form tasks which cannot be read from /proc.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
parent 25aa9e06
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#include <unistd.h> #include <unistd.h>
#include <errno.h> #include <errno.h>
#include <string.h> #include <string.h>
#include <parasite.h>
#include <fcntl.h> #include <fcntl.h>
...@@ -1142,6 +1143,7 @@ static int dump_one_task(struct pstree_item *item, struct cr_fdset *cr_fdset) ...@@ -1142,6 +1143,7 @@ static int dump_one_task(struct pstree_item *item, struct cr_fdset *cr_fdset)
struct parasite_ctl *parasite_ctl; struct parasite_ctl *parasite_ctl;
int ret = -1; int ret = -1;
int pid_dir; int pid_dir;
struct parasite_dump_misc misc;
pr_info("========================================\n"); pr_info("========================================\n");
pr_info("Dumping task (pid: %d)\n", pid); 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) ...@@ -1217,6 +1219,12 @@ static int dump_one_task(struct pstree_item *item, struct cr_fdset *cr_fdset)
goto err; 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); ret = parasite_cure_seized(parasite_ctl, &vma_area_list);
if (ret) { if (ret) {
pr_err("Can't cure (pid: %d) from parasite\n", pid); pr_err("Can't cure (pid: %d) from parasite\n", pid);
......
...@@ -41,6 +41,9 @@ extern int parasite_dump_pages_seized(struct parasite_ctl *ctl, struct list_head ...@@ -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_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); 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 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); extern int parasite_cure_seized(struct parasite_ctl *ctl, struct list_head *vma_area_list);
......
...@@ -35,6 +35,7 @@ enum { ...@@ -35,6 +35,7 @@ enum {
PARASITE_CMD_DUMPPAGES, PARASITE_CMD_DUMPPAGES,
PARASITE_CMD_DUMP_SIGACTS, PARASITE_CMD_DUMP_SIGACTS,
PARASITE_CMD_DUMP_ITIMERS, PARASITE_CMD_DUMP_ITIMERS,
PARASITE_CMD_DUMP_MISC,
PARASITE_CMD_MAX, PARASITE_CMD_MAX,
}; };
...@@ -73,6 +74,15 @@ struct parasite_dump_pages_args { ...@@ -73,6 +74,15 @@ struct parasite_dump_pages_args {
unsigned long fd; 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 * Some useful offsets
*/ */
......
...@@ -393,6 +393,12 @@ int parasite_dump_itimers_seized(struct parasite_ctl *ctl, struct cr_fdset *cr_f ...@@ -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); 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 * This routine drives parasite code (been previously injected into a victim
* process) and tells it to dump pages into the file. * process) and tells it to dump pages into the file.
......
...@@ -348,6 +348,14 @@ err_close: ...@@ -348,6 +348,14 @@ err_close:
return ret; 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) static int __used parasite_service(unsigned long cmd, void *args, void *brk)
{ {
brk_init(brk); brk_init(brk);
...@@ -367,6 +375,8 @@ static int __used parasite_service(unsigned long cmd, void *args, void *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); return dump_sigact((struct parasite_dump_file_args *)args);
case PARASITE_CMD_DUMP_ITIMERS: case PARASITE_CMD_DUMP_ITIMERS:
return dump_itimers((struct parasite_dump_file_args *)args); return dump_itimers((struct parasite_dump_file_args *)args);
case PARASITE_CMD_DUMP_MISC:
return dump_misc((struct parasite_dump_misc *)args);
default: default:
sys_write_msg("Unknown command to parasite\n"); sys_write_msg("Unknown command to parasite\n");
break; break;
......
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