return 0;
}
-static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds) {
+static int prepare_reexecute(Manager *m, FILE **_f, FDSet **_fds, bool serialize_jobs) {
FILE *f = NULL;
FDSet *fds = NULL;
int r;
/* Make sure nothing is really destructed when we shut down */
m->n_reloading ++;
- if ((r = manager_open_serialization(m, &f)) < 0) {
+ r = manager_open_serialization(m, &f);
+ if (r < 0) {
log_error("Failed to create serialization file: %s", strerror(-r));
goto fail;
}
- if (!(fds = fdset_new())) {
+ fds = fdset_new();
+ if (!fds) {
r = -ENOMEM;
log_error("Failed to allocate fd set: %s", strerror(-r));
goto fail;
}
- if ((r = manager_serialize(m, f, fds)) < 0) {
+ r = manager_serialize(m, f, fds, serialize_jobs);
+ if (r < 0) {
log_error("Failed to serialize state: %s", strerror(-r));
goto fail;
}
goto fail;
}
- if ((r = fd_cloexec(fileno(f), false)) < 0) {
+ r = fd_cloexec(fileno(f), false);
+ if (r < 0) {
log_error("Failed to disable O_CLOEXEC for serialization: %s", strerror(-r));
goto fail;
}
- if ((r = fdset_cloexec(fds, false)) < 0) {
+ r = fdset_cloexec(fds, false);
+ if (r < 0) {
log_error("Failed to disable O_CLOEXEC for serialization fds: %s", strerror(-r));
goto fail;
}
case MANAGER_REEXECUTE:
- if (prepare_reexecute(m, &serialization, &fds) < 0)
+ if (prepare_reexecute(m, &serialization, &fds, true) < 0)
goto finish;
reexecute = true;
m->switch_root = m->switch_root_init = NULL;
if (!switch_root_init)
- if (prepare_reexecute(m, &serialization, &fds) < 0)
+ if (prepare_reexecute(m, &serialization, &fds, false) < 0)
goto finish;
reexecute = true;
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);