e1531466e1
This change updates grub to the 2.04 release. The new release changed how grub is built, so the bootstrap and bootstrap.conf files have to be added to the dist-git. Also, the gitignore file changed so it has to be updated. Since the patches have been forward ported to 2.04, there's no need for a logic to maintain a patch with the delta between the release and the grub master branch. So the release-to-master.patch is dropped and no longer is updated by the do-rebase script. Also since gnulib isn't part of the grub repository anymore and cloned by the boostrap tool, a gnulib tarball is included as other source file and copied before calling the bootstrap tool. That way grub can be built even in builders that only have access to the sources lookaside cache. Resolves: rhbz#1727279 Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
80 lines
2.9 KiB
Diff
80 lines
2.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Javier Martinez Canillas <javierm@redhat.com>
|
|
Date: Tue, 9 Apr 2019 13:12:40 +0200
|
|
Subject: [PATCH] Don't assume that boot commands will only return on fail
|
|
|
|
While it's true that for most loaders the boot command never returns, it
|
|
may be the case that it does. For example the GRUB emulator boot command
|
|
calls to systemctl kexec which in turn does an asynchonous call to kexec.
|
|
|
|
So in this case GRUB will wrongly assume that the boot command fails and
|
|
print a "Failed to boot both default and fallback entries" even when the
|
|
kexec call later succeeds.
|
|
|
|
Signed-off-by: Javier Martinez Canillas <javierm@redhat.com>
|
|
---
|
|
grub-core/normal/menu.c | 19 +++++++++++--------
|
|
1 file changed, 11 insertions(+), 8 deletions(-)
|
|
|
|
diff --git a/grub-core/normal/menu.c b/grub-core/normal/menu.c
|
|
index 341228f87c9..6ef7e2f8e6f 100644
|
|
--- a/grub-core/normal/menu.c
|
|
+++ b/grub-core/normal/menu.c
|
|
@@ -286,7 +286,7 @@ get_and_remove_first_entry_number (grub_menu_t menu, const char *name)
|
|
}
|
|
|
|
/* Run a menu entry. */
|
|
-static void
|
|
+static grub_err_t
|
|
grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot)
|
|
{
|
|
grub_err_t err = GRUB_ERR_NONE;
|
|
@@ -386,7 +386,7 @@ grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot)
|
|
|
|
if (grub_errno == GRUB_ERR_NONE && grub_loader_is_loaded ())
|
|
/* Implicit execution of boot, only if something is loaded. */
|
|
- grub_command_execute ("boot", 0, 0);
|
|
+ err = grub_command_execute ("boot", 0, 0);
|
|
|
|
if (errs_before != grub_err_printed_errors)
|
|
grub_wait_after_message ();
|
|
@@ -409,6 +409,8 @@ grub_menu_execute_entry(grub_menu_entry_t entry, int auto_boot)
|
|
else
|
|
grub_env_unset ("default");
|
|
grub_env_unset ("timeout");
|
|
+
|
|
+ return err;
|
|
}
|
|
|
|
/* Execute ENTRY from the menu MENU, falling back to entries specified
|
|
@@ -423,10 +425,13 @@ grub_menu_execute_with_fallback (grub_menu_t menu,
|
|
void *callback_data)
|
|
{
|
|
int fallback_entry;
|
|
+ grub_err_t err;
|
|
|
|
callback->notify_booting (entry, callback_data);
|
|
|
|
- grub_menu_execute_entry (entry, 1);
|
|
+ err = grub_menu_execute_entry (entry, 1);
|
|
+ if (err == GRUB_ERR_NONE)
|
|
+ return;
|
|
|
|
/* Deal with fallback entries. */
|
|
while ((fallback_entry = get_and_remove_first_entry_number (menu, "fallback"))
|
|
@@ -437,11 +442,9 @@ grub_menu_execute_with_fallback (grub_menu_t menu,
|
|
|
|
entry = grub_menu_get_entry (menu, fallback_entry);
|
|
callback->notify_fallback (entry, callback_data);
|
|
- grub_menu_execute_entry (entry, 1);
|
|
- /* If the function call to execute the entry returns at all, then this is
|
|
- taken to indicate a boot failure. For menu entries that do something
|
|
- other than actually boot an operating system, this could assume
|
|
- incorrectly that something failed. */
|
|
+ err = grub_menu_execute_entry (entry, 1);
|
|
+ if (err == GRUB_ERR_NONE)
|
|
+ return;
|
|
}
|
|
|
|
if (!autobooted)
|