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 @@
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <parasite.h>
#include <fcntl.h>
......@@ -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);
......
......@@ -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);
......
......@@ -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
*/
......
......@@ -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.
......
......@@ -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;
......
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