Commit 1e6d3227 authored by Pavel Emelyanov's avatar Pavel Emelyanov

parasite: Cure task in case any dump failed while infected

Wile the task is infected we cannot just detach from it and go away. The victim will die after this.
So, call the parasite_cure_seized on any error handing between infect and cure.
Signed-off-by: 's avatarPavel Emelyanov <xemul@parallels.com>
parent 1e9ccd2b
...@@ -1494,43 +1494,43 @@ static int dump_one_task(const struct pstree_item *item) ...@@ -1494,43 +1494,43 @@ static int dump_one_task(const struct pstree_item *item)
ret = dump_task_files_seized(parasite_ctl, cr_fdset, fds, nr_fds); ret = dump_task_files_seized(parasite_ctl, cr_fdset, fds, nr_fds);
if (ret) { if (ret) {
pr_err("Dump files (pid: %d) failed with %d\n", pid, ret); pr_err("Dump files (pid: %d) failed with %d\n", pid, ret);
goto err; goto err_cure;
} }
ret = parasite_dump_pages_seized(parasite_ctl, &vma_area_list, cr_fdset); ret = parasite_dump_pages_seized(parasite_ctl, &vma_area_list, cr_fdset);
if (ret) { if (ret) {
pr_err("Can't dump pages (pid: %d) with parasite\n", pid); pr_err("Can't dump pages (pid: %d) with parasite\n", pid);
goto err; goto err_cure;
} }
ret = parasite_dump_sigacts_seized(parasite_ctl, cr_fdset); ret = parasite_dump_sigacts_seized(parasite_ctl, cr_fdset);
if (ret) { if (ret) {
pr_err("Can't dump sigactions (pid: %d) with parasite\n", pid); pr_err("Can't dump sigactions (pid: %d) with parasite\n", pid);
goto err; goto err_cure;
} }
ret = parasite_dump_itimers_seized(parasite_ctl, cr_fdset); ret = parasite_dump_itimers_seized(parasite_ctl, cr_fdset);
if (ret) { if (ret) {
pr_err("Can't dump itimers (pid: %d)\n", pid); pr_err("Can't dump itimers (pid: %d)\n", pid);
goto err; goto err_cure;
} }
ret = parasite_dump_misc_seized(parasite_ctl, &misc); ret = parasite_dump_misc_seized(parasite_ctl, &misc);
if (ret) { if (ret) {
pr_err("Can't dump misc (pid: %d)\n", pid); pr_err("Can't dump misc (pid: %d)\n", pid);
goto err; goto err_cure;
} }
ret = dump_task_core_all(pid, &pps_buf, &misc, parasite_ctl, cr_fdset); ret = dump_task_core_all(pid, &pps_buf, &misc, parasite_ctl, cr_fdset);
if (ret) { if (ret) {
pr_err("Dump core (pid: %d) failed with %d\n", pid, ret); pr_err("Dump core (pid: %d) failed with %d\n", pid, ret);
goto err; goto err_cure;
} }
ret = dump_task_threads(parasite_ctl, item); ret = dump_task_threads(parasite_ctl, item);
if (ret) { if (ret) {
pr_err("Can't dump threads\n"); pr_err("Can't dump threads\n");
goto err; goto err_cure;
} }
ret = parasite_cure_seized(parasite_ctl); ret = parasite_cure_seized(parasite_ctl);
...@@ -1564,6 +1564,10 @@ err_free: ...@@ -1564,6 +1564,10 @@ err_free:
free_mappings(&vma_area_list); free_mappings(&vma_area_list);
xfree(fds); xfree(fds);
return ret; return ret;
err_cure:
parasite_cure_seized(parasite_ctl);
goto err;
} }
static int cr_dump_shmem(void) static int cr_dump_shmem(void)
......
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