From 89b65757a9669839ea4959804dabfbda4ea729eb Mon Sep 17 00:00:00 2001 From: Javier Martinez Canillas Date: Fri, 22 Mar 2019 15:59:22 +0100 Subject: [PATCH] Two more BLS fixes Only set blsdir if /boot/loader/entries is in a btrfs or zfs partition Related: rhbz#1688453 Fix some BLS snippets not being displayed in the GRUB menu Resolves: rhbz#1691232 Signed-off-by: Javier Martinez Canillas --- ...if-boot-loader-entries-is-in-a-btrfs.patch | 55 ++++++++++++++ ...-grub_list_t-and-the-GRUB_AS_LIST-ma.patch | 76 +++++++++++++++++++ grub.patches | 2 + grub2.spec | 8 +- 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 0286-Only-set-blsdir-if-boot-loader-entries-is-in-a-btrfs.patch create mode 100644 0287-blscfg-don-t-use-grub_list_t-and-the-GRUB_AS_LIST-ma.patch diff --git a/0286-Only-set-blsdir-if-boot-loader-entries-is-in-a-btrfs.patch b/0286-Only-set-blsdir-if-boot-loader-entries-is-in-a-btrfs.patch new file mode 100644 index 0000000..341c143 --- /dev/null +++ b/0286-Only-set-blsdir-if-boot-loader-entries-is-in-a-btrfs.patch @@ -0,0 +1,55 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Javier Martinez Canillas +Date: Tue, 19 Mar 2019 01:27:57 +0100 +Subject: [PATCH] Only set blsdir if /boot/loader/entries is in a btrfs or zfs + partition + +Commit bfc756f8d86 ("Set blsdir if the BLS directory path isn't one of the +looked up by default") attempted to set blsdir if /boot/loader/entries was +not the real path of the directory containing the BLS snippets. Which may +be the case if for example /boot/loader/entries is in a btrfs subvolume. + +But in the case of ostree, /boot/loader is a symlink to the directory with +the entries for the current deployment. So with ostree the blsdir will be +wrongly set, since GRUB is able to follow the symlinks just fine. In fact, +it has to follow the symlink since otherwise GRUB will always use the BLS +files for the deployment that the symlink pointed out when blsdir was set. + +So only set blsdir if /boot/loader/entries is in a btrfs or zfs partition. + +Related: rhbz#1688453 + +Signed-off-by: Javier Martinez Canillas +--- + util/grub.d/10_linux.in | 3 ++- + util/grub.d/10_linux_bls.in | 3 ++- + 2 files changed, 4 insertions(+), 2 deletions(-) + +diff --git a/util/grub.d/10_linux.in b/util/grub.d/10_linux.in +index 2547dd52115..8f7ecf65df9 100644 +--- a/util/grub.d/10_linux.in ++++ b/util/grub.d/10_linux.in +@@ -169,7 +169,8 @@ EOF + + if [ "x${GRUB_GRUBENV_UPDATE}" = "xyes" ]; then + blsdir="/boot/loader/entries" +- if [ -d "${blsdir}" ]; then ++ [ -d "${blsdir}" ] && GRUB_BLS_FS="$(${grub_probe} --target=fs ${blsdir})" ++ if [ "x${GRUB_BLS_FS}" = "xbtrfs" ] || [ "x${GRUB_BLS_FS}" = "xzfs" ]; then + blsdir=$(make_system_path_relative_to_its_root "${blsdir}") + if [ "x${blsdir}" != "x/loader/entries" ] && [ "x${blsdir}" != "x/boot/loader/entries" ]; then + ${grub_editenv} - set blsdir="${blsdir}" +diff --git a/util/grub.d/10_linux_bls.in b/util/grub.d/10_linux_bls.in +index 47b87c8a14b..1707e86f2d3 100644 +--- a/util/grub.d/10_linux_bls.in ++++ b/util/grub.d/10_linux_bls.in +@@ -227,7 +227,8 @@ linux_entry () + + if [ "x${GRUB_GRUBENV_UPDATE}" = "xyes" ]; then + blsdir="/boot/loader/entries" +- if [ -d "${blsdir}" ]; then ++ [ -d "${blsdir}" ] && GRUB_BLS_FS="$(${grub_probe} --target=fs ${blsdir})" ++ if [ "x${GRUB_BLS_FS}" = "xbtrfs" ] || [ "x${GRUB_BLS_FS}" = "xzfs" ]; then + blsdir=$(make_system_path_relative_to_its_root "${blsdir}") + if [ "x${blsdir}" != "x/loader/entries" ] && [ "x${blsdir}" != "x/boot/loader/entries" ]; then + ${grub_editenv} - set blsdir="${blsdir}" diff --git a/0287-blscfg-don-t-use-grub_list_t-and-the-GRUB_AS_LIST-ma.patch b/0287-blscfg-don-t-use-grub_list_t-and-the-GRUB_AS_LIST-ma.patch new file mode 100644 index 0000000..a05da65 --- /dev/null +++ b/0287-blscfg-don-t-use-grub_list_t-and-the-GRUB_AS_LIST-ma.patch @@ -0,0 +1,76 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Javier Martinez Canillas +Date: Fri, 22 Mar 2019 11:14:26 +0100 +Subject: [PATCH] blscfg: don't use grub_list_t and the GRUB_AS_LIST() macro + +We are not using GRUB's list functions anyways since we want to add new +items in the middle ot the list but GRUB's grub_list_push() only allows +to add new items at the beginning of the list. So don't use grub_list_t +and GRUB_AS_LIST() macro and just reference struct bls_entry * directly. + +We can't change GRUB lists API because we want the blscfg module to not +need external symbols so it can be updated without updating GRUB's core. + +This also solves a bug where the struct bls_entry .next field wasn't set +correctly which caused some entries to not be populated in the grub menu. + +Resolves: rhbz#1691232 + +Signed-off-by: Javier Martinez Canillas +--- + grub-core/commands/blscfg.c | 10 +++++----- + include/grub/menu.h | 2 +- + 2 files changed, 6 insertions(+), 6 deletions(-) + +diff --git a/grub-core/commands/blscfg.c b/grub-core/commands/blscfg.c +index 5635066e3eb..bb93b7f4904 100644 +--- a/grub-core/commands/blscfg.c ++++ b/grub-core/commands/blscfg.c +@@ -350,13 +350,13 @@ static int bls_cmp(const struct bls_entry *e0, const struct bls_entry *e1) + return r; + } + +-static void list_add_tail(grub_list_t head, grub_list_t item) ++static void list_add_tail(struct bls_entry *head, struct bls_entry *item) + { + item->next = head; + if (head->prev) +- (*head->prev)->next = item; ++ head->prev->next = item; + item->prev = head->prev; +- head->prev = &item; ++ head->prev = item; + } + + static int bls_add_entry(struct bls_entry *entry) +@@ -378,7 +378,7 @@ static int bls_add_entry(struct bls_entry *entry) + + if (rc == 1) { + grub_dprintf ("blscfg", "Add entry with id \"%s\"\n", entry->filename); +- list_add_tail (GRUB_AS_LIST (e), GRUB_AS_LIST (entry)); ++ list_add_tail (e, entry); + if (e == entries) { + entries = entry; + entry->prev = NULL; +@@ -391,7 +391,7 @@ static int bls_add_entry(struct bls_entry *entry) + if (last) { + grub_dprintf ("blscfg", "Add entry with id \"%s\"\n", entry->filename); + last->next = entry; +- entry->prev = &last; ++ entry->prev = last; + } + + return 0; +diff --git a/include/grub/menu.h b/include/grub/menu.h +index eea493f74b1..0acdc2aa6bf 100644 +--- a/include/grub/menu.h ++++ b/include/grub/menu.h +@@ -23,7 +23,7 @@ + struct bls_entry + { + struct bls_entry *next; +- struct bls_entry **prev; ++ struct bls_entry *prev; + struct keyval **keyvals; + int nkeyvals; + char *filename; diff --git a/grub.patches b/grub.patches index e990e81..f0e81f2 100644 --- a/grub.patches +++ b/grub.patches @@ -283,3 +283,5 @@ Patch0282: 0282-Set-blsdir-if-the-BLS-directory-path-isn-t-one-of-th.patch Patch0283: 0283-Check-if-blsdir-exists-before-attempting-to-get-it-s.patch Patch0284: 0284-blscfg-fallback-to-default_kernelopts-if-BLS-option-.patch Patch0285: 0285-grub-switch-to-blscfg-copy-increment.mod-for-legacy-.patch +Patch0286: 0286-Only-set-blsdir-if-boot-loader-entries-is-in-a-btrfs.patch +Patch0287: 0287-blscfg-don-t-use-grub_list_t-and-the-GRUB_AS_LIST-ma.patch diff --git a/grub2.spec b/grub2.spec index d5555b7..61cbf82 100644 --- a/grub2.spec +++ b/grub2.spec @@ -7,7 +7,7 @@ Name: grub2 Epoch: 1 Version: 2.02 -Release: 73%{?dist} +Release: 74%{?dist} Summary: Bootloader with support for Linux, Multiboot and more License: GPLv3+ URL: http://www.gnu.org/software/grub/ @@ -476,6 +476,12 @@ rm -r /boot/grub2.tmp/ || : %endif %changelog +* Fri Mar 22 2019 Javier Martinez Canillas 2.02-74 +- Only set blsdir if /boot/loader/entries is in a btrfs or zfs partition + Related: rhbz#1688453 +- Fix some BLS snippets not being displayed in the GRUB menu + Resolves: rhbz#1691232 + * Tue Mar 12 2019 Zbigniew Jędrzejewski-Szmek - 2.02-73 - Never remove boot loader configuration for other boot loaders from the ESP. This would render machines with sd-boot unbootable (#1648907).