8ee92f5194
- Implement NV index mode for TPM 2.0 key protector 0001-protectors-Implement-NV-index.patch - Fall back to passphrase mode when the key protector fails to unlock the disk 0002-cryptodisk-Fallback-to-passphrase.patch - Wipe out the cached key cleanly 0003-cryptodisk-wipe-out-the-cached-keys-from-protectors.patch - Make diskfiler to look up cryptodisk devices first 0004-diskfilter-look-up-cryptodisk-devices-first.patch - Version bump to 2.12~rc1 * Added: - grub-2.12~rc1.tar.xz * Removed: - grub-2.06.tar.xz * Patch dropped merged by new version: - grub2-GRUB_CMDLINE_LINUX_RECOVERY-for-recovery-mode.patch - grub2-s390x-02-kexec-module-added-to-emu.patch - grub2-efi-chainloader-root.patch - grub2-Fix-incorrect-netmask-on-ppc64.patch - 0001-osdep-Introduce-include-grub-osdep-major.h-and-use-i.patch - 0002-osdep-linux-hostdisk-Use-stat-instead-of-udevadm-for.patch - 0002-net-read-bracketed-ipv6-addrs-and-port-numbers.patch - grub2-s390x-10-keep-network-at-kexec.patch - 0001-Fix-build-error-in-binutils-2.36.patch - 0001-emu-fix-executable-stack-marking.patch - 0046-squash-verifiers-Move-verifiers-API-to-kernel-image.patch - 0001-30_uefi-firmware-fix-printf-format-with-null-byte.patch - 0001-tpm-Pass-unknown-error-as-non-fatal-but-debug-print-.patch - 0001-Filter-out-POSIX-locale-for-translation.patch OBS-URL: https://build.opensuse.org/request/show/1105405 OBS-URL: https://build.opensuse.org/package/show/Base:System/grub2?expand=0&rev=458
165 lines
4.9 KiB
Diff
165 lines
4.9 KiB
Diff
From 3e77c5494fd06f430588ae9c304fea370439d531 Mon Sep 17 00:00:00 2001
|
|
From: Wen Xiong <Wen Xiong>
|
|
Date: Thu, 15 Dec 2022 21:33:41 -0500
|
|
Subject: [PATCH] grub2: Set multiple device path for a nvmf boot device
|
|
|
|
nvmf support native multipath(ANA) by default.
|
|
The patch added the support for setting multiple
|
|
device path for a nvmf boot device.
|
|
|
|
localhost:~ grub2-install -v /dev/nvme1n1p1
|
|
...
|
|
...
|
|
...
|
|
grub2-install: info: executing nvsetenv boot-device /pci@800000020000132/fibre-channel@0,1/nvme-of/controller@5005076810193675,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec /pci@800000020000132/fibre-channel@0/nvme-of/controller@5005076810193675,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec /pci@800000020000132/fibre-channel@0/nvme-of/controller@50050768101935e5,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec /pci@800000020000132/fibre-channel@0,1/nvme-of/controller@50050768101935e5,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec.
|
|
Installation finished. No error reported.
|
|
|
|
localhost:~ # bootlist -m normal -o
|
|
nvme7n1
|
|
nvme5n1
|
|
nvme1n1
|
|
nvme4n1
|
|
|
|
localhost:~ # bootlist -m normal -r
|
|
/pci@800000020000132/fibre-channel@0,1/nvme-of/controller@5005076810193675,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec
|
|
/pci@800000020000132/fibre-channel@0/nvme-of/controller@5005076810193675,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec
|
|
/pci@800000020000132/fibre-channel@0/nvme-of/controller@50050768101935e5,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec
|
|
/pci@800000020000132/fibre-channel@0,1/nvme-of/controller@50050768101935e5,ffff:nqn=nqn.1986-03.com.ibm:nvme:2145.0000020420006CEA/namespace@ec
|
|
|
|
Signed-off-by: Wen Xiong <wenxiong@linux.ibm.com>
|
|
---
|
|
grub-core/osdep/linux/ofpath.c | 6 ++---
|
|
grub-core/osdep/unix/platform.c | 48 +++++++++++++++++++++++++++++++++
|
|
include/grub/util/install.h | 3 +++
|
|
include/grub/util/ofpath.h | 9 +++++++
|
|
4 files changed, 63 insertions(+), 3 deletions(-)
|
|
|
|
--- a/grub-core/osdep/linux/ofpath.c
|
|
+++ b/grub-core/osdep/linux/ofpath.c
|
|
@@ -209,7 +209,7 @@
|
|
}
|
|
}
|
|
|
|
-static char *
|
|
+char *
|
|
xrealpath (const char *in)
|
|
{
|
|
char *out;
|
|
@@ -224,7 +224,7 @@
|
|
return out;
|
|
}
|
|
|
|
-static char *
|
|
+char *
|
|
block_device_get_sysfs_path_and_link(const char *devicenode)
|
|
{
|
|
char *rpath;
|
|
@@ -535,7 +535,7 @@
|
|
|
|
}
|
|
|
|
-static char *
|
|
+char *
|
|
nvme_get_syspath(const char *nvmedev)
|
|
{
|
|
char *sysfs_path, *controller_node;
|
|
--- a/grub-core/osdep/unix/platform.c
|
|
+++ b/grub-core/osdep/unix/platform.c
|
|
@@ -19,6 +19,7 @@
|
|
#include <config.h>
|
|
|
|
#include <grub/util/install.h>
|
|
+#include <grub/util/ofpath.h>
|
|
#include <grub/emu/hostdisk.h>
|
|
#include <grub/util/misc.h>
|
|
#include <grub/misc.h>
|
|
@@ -131,6 +132,51 @@
|
|
return rc;
|
|
}
|
|
|
|
+char *
|
|
+build_multi_boot_device(const char *install_device)
|
|
+{
|
|
+ char *sysfs_path;
|
|
+ char *nvme_ns;
|
|
+ unsigned int nsid;
|
|
+ char *ptr;
|
|
+ char *boot_device_string;
|
|
+ struct dirent *ep;
|
|
+ DIR *dp;
|
|
+
|
|
+ nvme_ns = strchr(install_device, 'n');
|
|
+ nsid = of_path_get_nvme_nsid(nvme_ns);
|
|
+ sysfs_path = nvme_get_syspath(nvme_ns);
|
|
+ strcat(sysfs_path, "/device");
|
|
+ sysfs_path = xrealpath(sysfs_path);
|
|
+
|
|
+ dp = opendir(sysfs_path);
|
|
+ ptr = boot_device_string = xmalloc (1000);
|
|
+
|
|
+ /* We cannot have a boot list with more than five entries */
|
|
+ while((ep = readdir(dp)) != NULL){
|
|
+ char *nvme_device;
|
|
+
|
|
+ if (grub_strstr(ep->d_name, "nvme")) {
|
|
+ nvme_device = xasprintf ("%s%s%x ",
|
|
+ get_ofpathname(ep->d_name),"/namespace@", nsid);
|
|
+ if ((strlen(boot_device_string) + strlen(nvme_device)) >= 200*5 - 1) {
|
|
+ grub_util_warn (_("More than five entries cannot be specified in the bootlist"));
|
|
+ free(nvme_device);
|
|
+ break;
|
|
+ }
|
|
+
|
|
+ strncpy(ptr, nvme_device, strlen(nvme_device));
|
|
+ ptr += strlen(nvme_device);
|
|
+ free(nvme_device);
|
|
+ }
|
|
+ }
|
|
+
|
|
+ *--ptr = '\0';
|
|
+ closedir(dp);
|
|
+
|
|
+ return boot_device_string;
|
|
+}
|
|
+
|
|
int
|
|
grub_install_register_efi (const grub_disk_t *efidir_grub_disk,
|
|
const char *efifile_path,
|
|
@@ -242,6 +288,8 @@
|
|
}
|
|
*ptr = '\0';
|
|
}
|
|
+ else if (grub_strstr(install_device, "nvme"))
|
|
+ boot_device = build_multi_boot_device(install_device);
|
|
else
|
|
boot_device = get_ofpathname (install_device);
|
|
|
|
--- a/include/grub/util/install.h
|
|
+++ b/include/grub/util/install.h
|
|
@@ -241,6 +241,9 @@
|
|
const char *efi_distributor,
|
|
const char *force_disk);
|
|
|
|
+char *
|
|
+build_multi_boot_device(const char *install_device);
|
|
+
|
|
void
|
|
grub_install_register_ieee1275 (int is_prep, const char *install_device,
|
|
int partno, const char *relpath);
|
|
--- a/include/grub/util/ofpath.h
|
|
+++ b/include/grub/util/ofpath.h
|
|
@@ -32,4 +32,13 @@
|
|
|
|
char* of_find_fc_host(char* host_wwpn);
|
|
|
|
+char* nvme_get_syspath(const char *nvmedev);
|
|
+
|
|
+char* block_device_get_sysfs_path_and_link(const char *devicenode);
|
|
+
|
|
+char* xrealpath (const char *in);
|
|
+
|
|
+unsigned int of_path_get_nvme_nsid(const char* devname);
|
|
+
|
|
+
|
|
#endif /* ! GRUB_OFPATH_MACHINE_UTIL_HEADER */
|