f8f88e1235
Resolves: #2165136 Signed-off-by: Robbie Harwood <rharwood@redhat.com>
103 lines
3.9 KiB
Diff
103 lines
3.9 KiB
Diff
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
|
|
From: Robbie Harwood <rharwood@redhat.com>
|
|
Date: Wed, 25 Jan 2023 16:10:58 -0500
|
|
Subject: [PATCH] ppc64le: signed boot media changes
|
|
|
|
Skip diskfilter on isos since mdraid* can't even
|
|
|
|
Prior to this change, on ppc64le with part_msdos and the mdraid* modules
|
|
enabled, we see:
|
|
|
|
disk/diskfilter.c:191: scanning ieee1275/cdrom
|
|
kern/disk.c:196: Opening `ieee1275/cdrom'...
|
|
disk/ieee1275/ofdisk.c:477: Opening `cdrom'.
|
|
disk/ieee1275/ofdisk.c:502: MAX_RETRIES set to 20
|
|
kern/disk.c:288: Opening `ieee1275/cdrom' succeeded.
|
|
disk/diskfilter.c:136: Scanning for DISKFILTER devices on disk ieee1275/cdrom
|
|
partmap/msdos.c:184: partition 0: flag 0x80, type 0x96, start 0x0, len
|
|
0x6a5d70
|
|
disk/diskfilter.c:136: Scanning for DISKFILTER devices on disk ieee1275/cdrom
|
|
SCSI-DISK: Access beyond end of device !
|
|
SCSI-DISK: Access beyond end of device !
|
|
SCSI-DISK: Access beyond end of device !
|
|
SCSI-DISK: Access beyond end of device !
|
|
SCSI-DISK: Access beyond end of device !
|
|
disk/ieee1275/ofdisk.c:578: MAX_RETRIES set to 20
|
|
|
|
These latter two lines repeat many times, eventually ending in:
|
|
|
|
kern/disk.c:388: ieee1275/cdrom read failed
|
|
error: ../../grub-core/disk/ieee1275/ofdisk.c:608:failure reading sector
|
|
0x1a9720 from `ieee1275/cdrom'.
|
|
|
|
and the system drops to a "grub>" prompt.
|
|
|
|
The firmware and the iso image appear to diagree on the blocksize (512
|
|
vs. 2048), and the diskfilter RAID probing is too much for it. We won't
|
|
be seeing RAID on bootable CDs, so just turn it off.
|
|
|
|
Fix detection of root.
|
|
|
|
Try the chrp path as a fallback if the built prefix doesn't work.
|
|
|
|
Signed-off-by: Robbie Harwood <rharwood@redhat.com>
|
|
---
|
|
grub-core/disk/diskfilter.c | 6 ++++++
|
|
grub-core/kern/ieee1275/openfw.c | 2 +-
|
|
grub-core/normal/main.c | 5 +++++
|
|
3 files changed, 12 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
|
|
index 7cdffe3ebd..68c836fc64 100644
|
|
--- a/grub-core/disk/diskfilter.c
|
|
+++ b/grub-core/disk/diskfilter.c
|
|
@@ -139,6 +139,12 @@ scan_disk_partition_iter (grub_disk_t disk, grub_partition_t p, void *data)
|
|
grub_util_info ("Scanning for DISKFILTER devices on disk %s", name);
|
|
#endif
|
|
|
|
+ if (p != NULL && (p->parent == NULL || p->parent->len == 0))
|
|
+ {
|
|
+ grub_dprintf ("diskfilter", "skipping %s due to unknown parent partition length", name);
|
|
+ return 0;
|
|
+ }
|
|
+
|
|
disk->partition = p;
|
|
|
|
for (arr = array_list; arr != NULL; arr = arr->next)
|
|
diff --git a/grub-core/kern/ieee1275/openfw.c b/grub-core/kern/ieee1275/openfw.c
|
|
index 3a6689abb1..0278054c61 100644
|
|
--- a/grub-core/kern/ieee1275/openfw.c
|
|
+++ b/grub-core/kern/ieee1275/openfw.c
|
|
@@ -499,7 +499,7 @@ grub_ieee1275_encode_devname (const char *path)
|
|
*optr++ ='\\';
|
|
*optr++ = *iptr++;
|
|
}
|
|
- if (partition && partition[0])
|
|
+ if (partition && partition[0] >= '0' && partition[0] <= '9')
|
|
{
|
|
unsigned int partno = grub_strtoul (partition, 0, 0);
|
|
|
|
diff --git a/grub-core/normal/main.c b/grub-core/normal/main.c
|
|
index 8f5fd81003..d59145f861 100644
|
|
--- a/grub-core/normal/main.c
|
|
+++ b/grub-core/normal/main.c
|
|
@@ -372,6 +372,7 @@ grub_try_normal_prefix (const char *prefix)
|
|
file = grub_file_open (config, GRUB_FILE_TYPE_CONFIG);
|
|
if (file)
|
|
{
|
|
+ grub_env_set ("prefix", prefix);
|
|
grub_file_close (file);
|
|
err = GRUB_ERR_NONE;
|
|
}
|
|
@@ -447,6 +448,10 @@ grub_cmd_normal (struct grub_command *cmd __attribute__ ((unused)),
|
|
err = grub_try_normal ("fw_path");
|
|
if (err == GRUB_ERR_FILE_NOT_FOUND)
|
|
err = grub_try_normal ("prefix");
|
|
+#ifdef __powerpc__
|
|
+ if (err == GRUB_ERR_FILE_NOT_FOUND)
|
|
+ err = grub_try_normal_prefix ("/boot/grub");
|
|
+#endif
|
|
if (err == GRUB_ERR_FILE_NOT_FOUND)
|
|
err = grub_try_normal_discover ();
|
|
if (err == GRUB_ERR_FILE_NOT_FOUND)
|