switch-root: don't wait for processes

When we transition from the initrd to the main system, don't reap
processes, so that they can be handled normally after deserialization.
This commit is contained in:
Lennart Poettering 2012-07-17 17:44:26 +02:00
parent 92a1fd9e95
commit cee530bb23
5 changed files with 11 additions and 10 deletions

2
TODO
View File

@ -34,8 +34,6 @@ Bugfixes:
Features:
* switch-root killing spree: don't waitpid, and think about signalfd() serialization
* flush jobs when switching root
* autorestart of journald after switch-root is broken

View File

@ -150,7 +150,7 @@ static int killall(int sig) {
return n_processes;
}
void broadcast_signal(int sig) {
void broadcast_signal(int sig, bool wait) {
sigset_t mask, oldmask;
int n_processes;
@ -169,7 +169,8 @@ void broadcast_signal(int sig) {
if (n_processes <= 0)
goto finish;
wait_for_children(n_processes, &mask);
if (wait)
wait_for_children(n_processes, &mask);
finish:
sigprocmask(SIG_SETMASK, &oldmask, NULL);

View File

@ -22,6 +22,6 @@
along with systemd; If not, see <http://www.gnu.org/licenses/>.
***/
void broadcast_signal(int sig);
void broadcast_signal(int sig, bool wait);
#endif

View File

@ -1692,9 +1692,11 @@ finish:
watchdog_close(true);
if (switch_root_dir) {
/* Kill all remaining processes from the initrd */
broadcast_signal(SIGTERM);
broadcast_signal(SIGKILL);
/* Kill all remaining processes from the
* initrd, but don't wait for them, so that we
* can handle the SIGCHLD for them after
* deserializing. */
broadcast_signal(SIGTERM, false);
/* And switch root */
r = switch_root(switch_root_dir);

View File

@ -177,10 +177,10 @@ int main(int argc, char *argv[]) {
mlockall(MCL_CURRENT|MCL_FUTURE);
log_info("Sending SIGTERM to remaining processes...");
broadcast_signal(SIGTERM);
broadcast_signal(SIGTERM, true);
log_info("Sending SIGKILL to remaining processes...");
broadcast_signal(SIGKILL);
broadcast_signal(SIGKILL, true);
if (in_container) {
need_swapoff = false;