]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
loader/emu/linux: Work around systemctl kexec returning
authorRobbie Harwood <rharwood@redhat.com>
Thu, 23 Mar 2023 15:59:51 +0000 (11:59 -0400)
committerDaniel Kiper <daniel.kiper@oracle.com>
Wed, 29 Mar 2023 18:35:05 +0000 (20:35 +0200)
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 confusingly results in:

  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 likelihood of hitting this case, add a delay on successful
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>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/loader/emu/linux.c

index 0cf378a376d9fe4c865e9608ec98b85bc34d679b..7de3f7f86105f6b297414c074f9cd59139129798 100644 (file)
@@ -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);