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 <javierm@redhat.com>
This commit is contained in:
Javier Martinez Canillas 2019-03-22 15:59:22 +01:00
parent bbe7d2e505
commit 89b65757a9
No known key found for this signature in database
GPG key ID: C751E590D63F3D69
4 changed files with 140 additions and 1 deletions

View file

@ -0,0 +1,55 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
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 <javierm@redhat.com>
---
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}"

View file

@ -0,0 +1,76 @@
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
From: Javier Martinez Canillas <javierm@redhat.com>
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 <javierm@redhat.com>
---
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;

View file

@ -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 Patch0283: 0283-Check-if-blsdir-exists-before-attempting-to-get-it-s.patch
Patch0284: 0284-blscfg-fallback-to-default_kernelopts-if-BLS-option-.patch Patch0284: 0284-blscfg-fallback-to-default_kernelopts-if-BLS-option-.patch
Patch0285: 0285-grub-switch-to-blscfg-copy-increment.mod-for-legacy-.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

View file

@ -7,7 +7,7 @@
Name: grub2 Name: grub2
Epoch: 1 Epoch: 1
Version: 2.02 Version: 2.02
Release: 73%{?dist} Release: 74%{?dist}
Summary: Bootloader with support for Linux, Multiboot and more Summary: Bootloader with support for Linux, Multiboot and more
License: GPLv3+ License: GPLv3+
URL: http://www.gnu.org/software/grub/ URL: http://www.gnu.org/software/grub/
@ -476,6 +476,12 @@ rm -r /boot/grub2.tmp/ || :
%endif %endif
%changelog %changelog
* Fri Mar 22 2019 Javier Martinez Canillas <javierm@redhat.com> 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 <zbyszek@in.waw.pl> - 2.02-73 * Tue Mar 12 2019 Zbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl> - 2.02-73
- Never remove boot loader configuration for other boot loaders from the ESP. - Never remove boot loader configuration for other boot loaders from the ESP.
This would render machines with sd-boot unbootable (#1648907). This would render machines with sd-boot unbootable (#1648907).