If failure_action is shutdown/reboot/halt, final_action is pointless as the system will be already stopping. And if final_action is different from failure_action, it will trigger a systemd race problem and cause unexpected behavior to occur.
So let the error handler stop and exit after performing failure_action successfully if failure_action is one of shutdown/reboot/halt. This way, final_action will not be executed.
Signed-off-by: Kairui Song kasong@redhat.com --- kdump-lib-initramfs.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh index c409dce..8530556 100755 --- a/kdump-lib-initramfs.sh +++ b/kdump-lib-initramfs.sh @@ -56,13 +56,13 @@ get_kdump_confs() FAILURE_ACTION="kdump_emergency_shell" ;; reboot) - FAILURE_ACTION="systemctl reboot -f" + FAILURE_ACTION="systemctl reboot -f && exit" ;; halt) - FAILURE_ACTION="halt" + FAILURE_ACTION="halt && exit" ;; poweroff) - FAILURE_ACTION="systemctl poweroff -f" + FAILURE_ACTION="systemctl poweroff -f && exit" ;; dump_to_rootfs) FAILURE_ACTION="dump_to_rootfs"
On 10/30/2019 05:35 PM, Kairui Song wrote:
If failure_action is shutdown/reboot/halt, final_action is pointless as the system will be already stopping. And if final_action is different from failure_action, it will trigger a systemd race problem and cause unexpected behavior to occur.
So let the error handler stop and exit after performing failure_action successfully if failure_action is one of shutdown/reboot/halt. This way, final_action will not be executed.
Signed-off-by: Kairui Song kasong@redhat.com
kdump-lib-initramfs.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh index c409dce..8530556 100755 --- a/kdump-lib-initramfs.sh +++ b/kdump-lib-initramfs.sh @@ -56,13 +56,13 @@ get_kdump_confs() FAILURE_ACTION="kdump_emergency_shell" ;; reboot)
FAILURE_ACTION="systemctl reboot -f"
FAILURE_ACTION="systemctl reboot -f && exit" ;; halt)
FAILURE_ACTION="halt"
FAILURE_ACTION="halt && exit" ;; poweroff)
FAILURE_ACTION="systemctl poweroff -f"
FAILURE_ACTION="systemctl poweroff -f && exit" ;; dump_to_rootfs) FAILURE_ACTION="dump_to_rootfs"
Acked-by: Pingfan Liu piliu@redhat.com
-----Original Message----- From: Kairui Song [mailto:kasong@redhat.com] Sent: Wednesday, October 30, 2019 6:35 PM To: kexec@lists.fedoraproject.org Cc: Pingfan Liu piliu@redhat.com; Dave Young dyoung@redhat.com; Hatayama, Daisuke/畑山 大輔 d.hatayama@fujitsu.com; Kairui Song kasong@redhat.com Subject: [PATCH] Don't execute final_action if failure_action terminates the system
If failure_action is shutdown/reboot/halt, final_action is pointless as the system will be already stopping. And if final_action is different from failure_action, it will trigger a systemd race problem and cause unexpected behavior to occur.
So let the error handler stop and exit after performing failure_action successfully if failure_action is one of shutdown/reboot/halt. This way, final_action will not be executed.
Signed-off-by: Kairui Song kasong@redhat.com
kdump-lib-initramfs.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/kdump-lib-initramfs.sh b/kdump-lib-initramfs.sh index c409dce..8530556 100755 --- a/kdump-lib-initramfs.sh +++ b/kdump-lib-initramfs.sh @@ -56,13 +56,13 @@ get_kdump_confs() FAILURE_ACTION="kdump_emergency_shell" ;; reboot)
FAILURE_ACTION="systemctl reboot -f"
FAILURE_ACTION="systemctl reboot -f && exit"
Can -f option here also be removed?
;; halt)
FAILURE_ACTION="halt"
FAILURE_ACTION="halt && exit"
It's better to replace halt with systemctl halt as suggested by Dave.
;; poweroff)
FAILURE_ACTION="systemctl poweroff -f"
FAILURE_ACTION="systemctl poweroff -f && exit"
Ditto.
I also checked the behavior when FAILURE_ACTION="exit" for in case, i.e. the situation where shutdown/halt/reboot doesn't work well for some reason even though it terminates with successful exit status. The result is infinite loop like:
kdump-capture.serviec pulls in emergency.target on failrue => emergency.target pulls in emergency.service => emergency.service isolates kdump-error-handler.service => kdump-error-handler.service isolates default.target (= initrd.target) on ExecStopPost= => initrd.target pulls in kdump-capture.service
I think there is a room to improve this design in another work.
;; dump_to_rootfs) FAILURE_ACTION="dump_to_rootfs"
-- 2.21.0