From e36dbef13d9831e6ca0e1fded944f62e5b5f991f Mon Sep 17 00:00:00 2001 From: Andrew Vagin Date: Fri, 9 Oct 2015 17:41:00 +0300 Subject: [PATCH] restore: wait while processes are dying If criu restore failed, criu should wait all processes because they hold files, namespaces and other stuff that caller might want to have released (in our case it was ploop device). Here we do this only for cases when processes are restored in a pid namespace. We'd like to do the same for non-ns case, but there's no simple way to wait for a bunch of unconnected processes. Another good side effect is that "Restoring FAILED." will be printed at the end of the log (now after we kill init tasks still have time to do smth and write log messages). Cc: Nikita Spiridonov Reported-by: Nikita Spiridonov Signed-off-by: Andrew Vagin Signed-off-by: Pavel Emelyanov --- cr-restore.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cr-restore.c b/cr-restore.c index b8b447399..9810014de 100644 --- a/cr-restore.c +++ b/cr-restore.c @@ -1915,9 +1915,15 @@ out_kill: * otherwise an external proccesses can be killed. */ if (root_ns_mask & CLONE_NEWPID) { + int status; + /* Kill init */ if (root_item->pid.real > 0) kill(root_item->pid.real, SIGKILL); + + if (waitpid(root_item->pid.real, &status, 0) < 0) + pr_warn("Unable to wait %d: %s", + root_item->pid.real, strerror(errno)); } else { struct pstree_item *pi;