You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.5 KiB
46 lines
1.5 KiB
7 years ago
|
From 04213418a4e8d4e7f74f5b8b03713172a658d9e4 Mon Sep 17 00:00:00 2001
|
||
|
From: Michal Sekletar <msekleta@redhat.com>
|
||
|
Date: Fri, 12 Jan 2018 13:05:48 +0100
|
||
|
Subject: [PATCH] process-util: make our freeze() routine do something useful
|
||
|
|
||
|
When we crash we freeze() our-self (or possibly we reboot the machine if
|
||
|
that is configured). However, calling pause() is very unhelpful thing to
|
||
|
do. We should at least continue to do what init systems being doing
|
||
|
since 70's and that is reaping zombies. Otherwise zombies start to
|
||
|
accumulate on the system which is a very bad thing. As that can prevent
|
||
|
admin from taking manual steps to reboot the machine in somewhat
|
||
|
graceful manner (e.g. manually stopping services, unmounting data
|
||
|
volumes and calling reboot -f).
|
||
|
|
||
|
Fixes #7783
|
||
|
|
||
|
(cherry picked from commit 8647283e453e4039029e2b21270241fa4010b3d8)
|
||
|
|
||
|
Resolves: #1540941
|
||
|
---
|
||
|
src/shared/util.c | 11 +++++++++++
|
||
|
1 file changed, 11 insertions(+)
|
||
|
|
||
|
diff --git a/src/shared/util.c b/src/shared/util.c
|
||
|
index 39359fcc8..af0953273 100644
|
||
|
--- a/src/shared/util.c
|
||
|
+++ b/src/shared/util.c
|
||
|
@@ -4158,6 +4158,17 @@ noreturn void freeze(void) {
|
||
|
|
||
|
sync();
|
||
|
|
||
|
+ /* Let's not freeze right away, but keep reaping zombies. */
|
||
|
+ for (;;) {
|
||
|
+ int r;
|
||
|
+ siginfo_t si = {};
|
||
|
+
|
||
|
+ r = waitid(P_ALL, 0, &si, WEXITED);
|
||
|
+ if (r < 0 && errno != EINTR)
|
||
|
+ break;
|
||
|
+ }
|
||
|
+
|
||
|
+ /* waitid() failed with an unexpected error, things are really borked. Freeze now! */
|
||
|
for (;;)
|
||
|
pause();
|
||
|
}
|