42 lines
1.4 KiB
Diff
42 lines
1.4 KiB
Diff
|
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
||
|
From: Robbie Harwood <rharwood@redhat.com>
|
||
|
Date: Wed, 22 Mar 2023 14:19:43 -0400
|
||
|
Subject: [PATCH] emu/linux: work around systemctl kexec returning
|
||
|
|
||
|
Per systemctl(1), it "is asynchronous; it will return after the reboot
|
||
|
operation is enqueued, without waiting for it to complete". This
|
||
|
differs from kexec(8), which calls reboot(2) and therefore does not
|
||
|
return.
|
||
|
|
||
|
When not using fallback, this results in the confusing-but-harmless:
|
||
|
|
||
|
error trying to perform 'systemctl kexec': 0
|
||
|
Aborted. Press any key to exit.
|
||
|
|
||
|
on screen for a bit, followed by successful kexec.
|
||
|
|
||
|
To reduce the liklihood of hitting this case, add a delay on succesful
|
||
|
return. Ultimately, the systemd interface is racy: we can't avoid it
|
||
|
entirely unless we never fallback on success.
|
||
|
|
||
|
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
|
||
|
---
|
||
|
grub-core/loader/emu/linux.c | 4 ++++
|
||
|
1 file changed, 4 insertions(+)
|
||
|
|
||
|
diff --git a/grub-core/loader/emu/linux.c b/grub-core/loader/emu/linux.c
|
||
|
index 0cf378a376..7de3f7f861 100644
|
||
|
--- a/grub-core/loader/emu/linux.c
|
||
|
+++ b/grub-core/loader/emu/linux.c
|
||
|
@@ -74,6 +74,10 @@ grub_linux_boot (void)
|
||
|
(kexecute==1) ? "do-or-die" : "just-in-case");
|
||
|
rc = grub_util_exec (systemctl);
|
||
|
|
||
|
+ /* `systemctl kexec` is "asynchronous" and will return even on success. */
|
||
|
+ if (rc == 0)
|
||
|
+ grub_sleep (10);
|
||
|
+
|
||
|
if (kexecute == 1)
|
||
|
grub_fatal (N_("error trying to perform 'systemctl kexec': %d"), rc);
|
||
|
|