Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package grub2 for openSUSE:Factory checked 
in at 2022-03-15 19:03:41
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/grub2 (Old)
 and      /work/SRC/openSUSE:Factory/.grub2.new.25692 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "grub2"

Tue Mar 15 19:03:41 2022 rev:261 rq:961558 version:2.06

Changes:
--------
--- /work/SRC/openSUSE:Factory/grub2/grub2.changes      2022-03-11 
11:43:55.418786429 +0100
+++ /work/SRC/openSUSE:Factory/.grub2.new.25692/grub2.changes   2022-03-15 
19:03:43.892899768 +0100
@@ -1,0 +2,20 @@
+Fri Mar 11 09:30:05 UTC 2022 - Michael Chang <mch...@suse.com>
+
+- Fix grub-install error when efi system partition is created as mdadm software
+  raid1 device (bsc#1179981) (bsc#1195204)
+  * 0001-install-fix-software-raid1-on-esp.patch
+
+-------------------------------------------------------------------
+Thu Mar 10 09:10:23 UTC 2022 - Michael Chang <mch...@suse.com>
+
+- Fix riscv64 build error 
+  * 0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch
+
+-------------------------------------------------------------------
+Thu Mar 10 07:08:52 UTC 2022 - Michael Chang <mch...@suse.com>
+
+- Fix error in grub-install when linux root device is on lvm thin volume
+  (bsc#1192622) (bsc#1191974)
+  * 0001-grub-install-bailout-root-device-probing.patch
+
+-------------------------------------------------------------------
@@ -126 +146 @@
-- VUL-0: grub2: grub2-once uses fixed file name in /var/tmp (bsc#1190474)
+- VUL-0: grub2: grub2-once uses fixed file name in /var/tmp (bsc#1190474) 
(CVE-2021-46705)

New:
----
  0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch
  0001-grub-install-bailout-root-device-probing.patch
  0001-install-fix-software-raid1-on-esp.patch

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ grub2.spec ++++++
--- /var/tmp/diff_new_pack.wqUTz3/_old  2022-03-15 19:03:46.520901550 +0100
+++ /var/tmp/diff_new_pack.wqUTz3/_new  2022-03-15 19:03:46.528901556 +0100
@@ -356,6 +356,9 @@
 Patch839:       0003-grub-install-support-prep-environment-block.patch
 Patch840:       0004-Introduce-prep_load_env-command.patch
 Patch841:       0005-export-environment-at-start-up.patch
+Patch842:       0001-grub-install-bailout-root-device-probing.patch
+Patch843:       0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch
+Patch844:       0001-install-fix-software-raid1-on-esp.patch
 
 Requires:       gettext-runtime
 %if 0%{?suse_version} >= 1140

++++++ 0001-RISC-V-Adjust-march-flags-for-binutils-2.38.patch ++++++
>From 4e7de0959f3e99824d4a688398958ea022a1d023 Mon Sep 17 00:00:00 2001
From: Heinrich Schuchardt <heinrich.schucha...@canonical.com>
Date: Sat, 29 Jan 2022 13:36:55 +0100
Subject: [PATCH] RISC-V: Adjust -march flags for binutils 2.38

As of version 2.38 binutils defaults to ISA specification version
2019-12-13. This version of the specification has has separated the
the csr read/write (csrr*/csrw*) instructions and the fence.i from
the I extension and put them into separate Zicsr and Zifencei
extensions.

This implies that we have to adjust the -march flag passed to the
compiler accordingly.

Signed-off-by: Heinrich Schuchardt <heinrich.schucha...@canonical.com>
Reviewed-by: Daniel Kiper <daniel.ki...@oracle.com>
---
 configure.ac | 8 ++++++++
 1 file changed, 8 insertions(+)

diff --git a/configure.ac b/configure.ac
index af8e2615ce..906eb1cedc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -866,11 +866,19 @@ if test x"$platform" != xemu ; then
        CFLAGS="$TARGET_CFLAGS -march=rv32imac -mabi=ilp32 -Werror"
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
                         [grub_cv_target_cc_soft_float="-march=rv32imac 
-mabi=ilp32"], [])
+       # ISA spec version 20191213 factored out extensions Zicsr and Zifencei
+       CFLAGS="$TARGET_CFLAGS -march=rv32imac_zicsr_zifencei -mabi=ilp32 
-Werror"
+       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
+                        
[grub_cv_target_cc_soft_float="-march=rv32imac_zicsr_zifencei -mabi=ilp32"], [])
     fi
     if test "x$target_cpu" = xriscv64; then
        CFLAGS="$TARGET_CFLAGS -march=rv64imac -mabi=lp64 -Werror"
        AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
                         [grub_cv_target_cc_soft_float="-march=rv64imac 
-mabi=lp64"], [])
+       # ISA spec version 20191213 factored out extensions Zicsr and Zifencei
+       CFLAGS="$TARGET_CFLAGS -march=rv64imac_zicsr_zifencei -mabi=lp64 
-Werror"
+       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
+                        
[grub_cv_target_cc_soft_float="-march=rv64imac_zicsr_zifencei -mabi=lp64"], [])
     fi
     if test "x$target_cpu" = xia64; then
        CFLAGS="$TARGET_CFLAGS -mno-inline-float-divide -mno-inline-sqrt 
-Werror"
-- 
2.34.1


++++++ 0001-grub-install-bailout-root-device-probing.patch ++++++
>From 58dcf7985b20de876a6fc44a591aa377d0a0302c Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 10 Feb 2022 22:16:58 +0800
Subject: [PATCH] grub-install: bailout root device probing

The root device is probed to test if the filesystem is btrfs in order to setup
boot configs for snapshot booting. However when the root device is a lvm thin
volume, due to lack in grub support, the probing will be errored out and entire
installation process aborts.

Here we call out stat to bailout the situation whenever grub fails to probe
filesystem in it's own right.

  stat -f -c %T /

The command is also used by grub-mkconfig for the same purpose.

Signed-off-by: Michael Chang <mch...@suse.com>
---
 grub-core/osdep/basic/no_platform.c |  5 +++++
 grub-core/osdep/unix/platform.c     | 34 +++++++++++++++++++++++++++++
 grub-core/osdep/windows/platform.c  |  6 +++++
 include/grub/util/install.h         |  3 +++
 util/grub-install.c                 | 31 ++++++++++++++++++--------
 5 files changed, 70 insertions(+), 9 deletions(-)

diff --git a/grub-core/osdep/basic/no_platform.c 
b/grub-core/osdep/basic/no_platform.c
index a173dafe90..dfbdd58e4e 100644
--- a/grub-core/osdep/basic/no_platform.c
+++ b/grub-core/osdep/basic/no_platform.c
@@ -51,3 +51,8 @@ grub_install_zipl (const char *d, int i, int f)
   grub_util_error ("%s", _("no zIPL routines are available for your 
platform"));
 }
 
+char *
+grub_install_get_filesystem (const char *path)
+{
+  return NULL;
+}
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
index 4df143671a..68186480b2 100644
--- a/grub-core/osdep/unix/platform.c
+++ b/grub-core/osdep/unix/platform.c
@@ -250,3 +250,37 @@ grub_install_zipl (const char *dest, int install, int 
force)
        "-z", dest, NULL }))
     grub_util_error (_("`%s' failed.\n"), PACKAGE"-zipl-setup");
 }
+
+char *
+grub_install_get_filesystem (const char *path)
+{
+  int fd;
+  pid_t pid;
+  FILE *fp;
+  ssize_t len;
+  char *buf = NULL;
+  size_t bufsz = 0;
+
+  pid = grub_util_exec_pipe ((const char * []){ "stat", "-f", "-c", "%T", 
path, NULL }, &fd);
+  if (!pid)
+    return NULL;
+
+  fp = fdopen (fd, "r");
+  if (!fp)
+    return NULL;
+
+  len = getline (&buf, &bufsz, fp);
+  if (len == -1)
+    {
+      free (buf);
+      fclose (fp);
+      return NULL;
+    }
+
+  fclose (fp);
+
+  if (len > 0 && buf[len - 1] == '\n')
+    buf[len - 1] = '\0';
+
+  return buf;
+}
diff --git a/grub-core/osdep/windows/platform.c 
b/grub-core/osdep/windows/platform.c
index 733c36d72c..1d2e356e6b 100644
--- a/grub-core/osdep/windows/platform.c
+++ b/grub-core/osdep/windows/platform.c
@@ -430,3 +430,9 @@ grub_install_zipl (const char *d, int i, int f)
 {
   grub_util_error ("%s", _("no zIPL routines are available for your 
platform"));
 }
+
+char *
+grub_install_get_filesystem (const char *path)
+{
+  return NULL;
+}
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
index 154487b72b..456955c3d7 100644
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -252,6 +252,9 @@ grub_install_sgi_setup (const char *install_device,
 void
 grub_install_zipl (const char *d, int i, int f);
 
+char *
+grub_install_get_filesystem (const char *path);
+
 int 
 grub_install_compress_gzip (const char *src, const char *dest);
 int 
diff --git a/util/grub-install.c b/util/grub-install.c
index 7bc5f84378..213f54a782 100644
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -871,7 +871,6 @@ main (int argc, char *argv[])
   const char *efi_file = NULL;
   char **grub_devices;
   grub_fs_t grub_fs;
-  grub_fs_t root_fs;
   grub_device_t grub_dev = NULL;
   enum grub_install_plat platform;
   char *grubdir, *device_map;
@@ -1049,8 +1048,10 @@ main (int argc, char *argv[])
   grub_host_init ();
 
   {
-    char *rootdir_grub_devname;
-    grub_device_t rootdir_grub_dev;
+    grub_device_t rootdir_grub_dev = NULL;
+    char *rootdir_grub_devname = NULL;
+    char *root_fs_name = NULL;
+
     char *t = grub_util_path_concat (2, "/", rootdir);
 
     rootdir_path = grub_canonicalize_file_name (t);
@@ -1071,20 +1072,32 @@ main (int argc, char *argv[])
                       rootdir_devices[0]);
 
     rootdir_grub_dev = grub_device_open (rootdir_grub_devname);
-    if (! rootdir_grub_dev)
-      grub_util_error ("%s", grub_errmsg);
+    if (!rootdir_grub_dev)
+      {
+       root_fs_name = grub_install_get_filesystem (t);
+       if (root_fs_name)
+         grub_errno = 0;
+      }
+    else
+      {
+       grub_fs_t root_fs = grub_fs_probe (rootdir_grub_dev);
+       if (root_fs)
+         root_fs_name = grub_strdup (root_fs->name);
+      }
 
-    root_fs = grub_fs_probe (rootdir_grub_dev);
-    if (!root_fs)
+    if (!root_fs_name)
       grub_util_error ("%s", grub_errmsg);
 
     if (config.is_suse_btrfs_snapshot_enabled
-       && grub_strncmp(root_fs->name, "btrfs", sizeof ("btrfs") - 1) == 0)
+       && root_fs_name
+       && grub_strncmp(root_fs_name, "btrfs", sizeof ("btrfs") - 1) == 0)
       use_relative_path_on_btrfs = 1;
 
+    free (root_fs_name);
     free (t);
     free (rootdir_grub_devname);
-    grub_device_close (rootdir_grub_dev);
+    if (rootdir_grub_dev)
+      grub_device_close (rootdir_grub_dev);
   }
 
   switch (platform)
-- 
2.34.1


++++++ 0001-install-fix-software-raid1-on-esp.patch ++++++
>From 6444774dae24f439dae3b4bc8d73449d50f06240 Mon Sep 17 00:00:00 2001
From: Michael Chang <mch...@suse.com>
Date: Thu, 31 Dec 2020 21:54:07 +0800
Subject: [PATCH] install: fix software raid1 on esp

While running grub-install on an efi system where efi system partition
is configured as mdadm software raid1, it fails with errors like this:

  grub2-install: info: copying `/boot/grub2/x86_64-efi/core.efi' -> 
`/boot/efi/EFI/opensuse/grubx64.efi'.
  grub2-install: info: Registering with EFI: distributor = `opensuse', path = 
`\EFI\opensuse\grubx64.efi', ESP at mduuid/9182c46b9d469f79b48850b68f3371a5.
  grub2-install: info: executing efibootmgr --version </dev/null >/dev/null.
  grub2-install: info: executing modprobe -q efivars.
  grub2-install: info: executing efibootmgr -c -d.
  efibootmgr: option requires an argument -- 'd'
  efibootmgr version 14
  usage: efibootmgr [options]

This should work with mdadm raid1 with metadata 0.9 and 1.0 whose
superblocks are at the end of device. However
grub_install_register_efi() doesn't seem to work if the target is
multiple devices so that it errors out.

The patch changes grub_install_register_efi() to accept multiple devices
that can be used to creating efi boot entries for probed raid1 member
devices on mounted efi system partition.

This patch also adds check for metadata 0.9 or 1.0 or the validation
will fail to continue the install.

Signed-off-by: Michael Chang <mch...@suse.com>
---
 grub-core/disk/diskfilter.c         |  27 +++----
 grub-core/disk/mdraid1x_linux.c     |   3 +
 grub-core/osdep/basic/no_platform.c |   3 +-
 grub-core/osdep/unix/platform.c     |  57 +++++++++++----
 grub-core/osdep/windows/platform.c  |   3 +-
 include/grub/diskfilter.h           |   3 +-
 include/grub/util/install.h         |   5 +-
 util/grub-install.c                 | 107 ++++++++++++++++++++++++++--
 8 files changed, 171 insertions(+), 37 deletions(-)

diff --git a/grub-core/disk/diskfilter.c b/grub-core/disk/diskfilter.c
index 39d74cb867..de0c02cf94 100644
--- a/grub-core/disk/diskfilter.c
+++ b/grub-core/disk/diskfilter.c
@@ -159,8 +159,8 @@ scan_disk_partition_iter (grub_disk_t disk, 
grub_partition_t p, void *data)
       for (m = arr->pvs; m; m = m->next)
        if (m->disk && m->disk->id == disk->id
            && m->disk->dev->id == disk->dev->id
-           && m->part_start == grub_partition_get_start (disk->partition)
-           && m->part_size == grub_disk_native_sectors (disk))
+           && grub_partition_get_start (m->disk->partition) == 
grub_partition_get_start (disk->partition)
+           && grub_disk_native_sectors (m->disk) == grub_disk_native_sectors 
(disk))
          return 0;
     }
 
@@ -1330,19 +1330,23 @@ insert_array (grub_disk_t disk, const struct 
grub_diskfilter_pv_id *id,
        ? (grub_memcmp (pv->id.uuid, id->uuid, id->uuidlen) == 0) 
        : (pv->id.id == id->id))
       {
+       char *part_name = NULL;
        struct grub_diskfilter_lv *lv;
        /* FIXME: Check whether the update time of the superblocks are
           the same.  */
-       if (pv->disk && grub_disk_native_sectors (disk) >= pv->part_size)
+       if (pv->disk && grub_disk_native_sectors (disk) >= 
grub_disk_native_sectors (pv->disk))
          return GRUB_ERR_NONE;
-       pv->disk = grub_disk_open (disk->name);
+       if (disk->partition)
+         {
+           char *p = grub_partition_get_name (disk->partition);
+           if (p)
+             part_name = grub_xasprintf ("%s,%s", disk->name, p);
+           grub_free (p);
+         }
+       pv->disk = grub_disk_open (part_name ? : disk->name);
+       grub_free (part_name);
        if (!pv->disk)
          return grub_errno;
-       /* This could happen to LVM on RAID, pv->disk points to the
-          raid device, we shouldn't change it.  */
-       pv->start_sector -= pv->part_start;
-       pv->part_start = grub_partition_get_start (disk->partition);
-       pv->part_size = grub_disk_native_sectors (disk);
 
 #ifdef GRUB_UTIL
        {
@@ -1359,7 +1363,6 @@ insert_array (grub_disk_t disk, const struct 
grub_diskfilter_pv_id *id,
 #endif
        if (start_sector != (grub_uint64_t)-1)
          pv->start_sector = start_sector;
-       pv->start_sector += pv->part_start;
        /* Add the device to the array. */
        for (lv = array->lvs; lv; lv = lv->next)
          if (!lv->became_readable_at && lv->fullname && is_lv_readable (lv, 0))
@@ -1447,8 +1450,8 @@ grub_diskfilter_get_pv_from_disk (grub_disk_t disk,
       {
        if (pv->disk && pv->disk->id == disk->id
            && pv->disk->dev->id == disk->dev->id
-           && pv->part_start == grub_partition_get_start (disk->partition)
-           && pv->part_size == grub_disk_native_sectors (disk))
+           && grub_partition_get_start (pv->disk->partition) == 
grub_partition_get_start (disk->partition)
+           && grub_disk_native_sectors (pv->disk) == grub_disk_native_sectors 
(disk))
          {
            if (vg_out)
              *vg_out = vg;
diff --git a/grub-core/disk/mdraid1x_linux.c b/grub-core/disk/mdraid1x_linux.c
index 38444b02c7..a2aafb69fb 100644
--- a/grub-core/disk/mdraid1x_linux.c
+++ b/grub-core/disk/mdraid1x_linux.c
@@ -208,6 +208,9 @@ grub_mdraid_detect (grub_disk_t disk,
                                         grub_le_to_cpu32 (sb.chunksize),
                                         grub_le_to_cpu32 (sb.layout),
                                         grub_le_to_cpu32 (sb.level));
+#ifdef GRUB_UTIL
+      array->mdraid1x_minor_version = minor_version;
+#endif
 
       return array;
     }
diff --git a/grub-core/osdep/basic/no_platform.c 
b/grub-core/osdep/basic/no_platform.c
index dfbdd58e4e..37b9570dbc 100644
--- a/grub-core/osdep/basic/no_platform.c
+++ b/grub-core/osdep/basic/no_platform.c
@@ -33,7 +33,8 @@ grub_install_register_ieee1275 (int is_prep, const char 
*install_device,
 void
 grub_install_register_efi (grub_device_t efidir_grub_dev,
                           const char *efifile_path,
-                          const char *efi_distributor)
+                          const char *efi_distributor,
+                          const char *force_disk)
 {
   grub_util_error ("%s", _("no EFI routines are available for your platform"));
 }
diff --git a/grub-core/osdep/unix/platform.c b/grub-core/osdep/unix/platform.c
index 68186480b2..c7cf74c677 100644
--- a/grub-core/osdep/unix/platform.c
+++ b/grub-core/osdep/unix/platform.c
@@ -132,15 +132,14 @@ grub_install_remove_efi_entries_by_distributor (const 
char *efi_distributor)
 }
 
 int
-grub_install_register_efi (grub_device_t efidir_grub_dev,
+grub_install_register_efi (const grub_disk_t *efidir_grub_disk,
                           const char *efifile_path,
-                          const char *efi_distributor)
+                          const char *efi_distributor,
+                          const char *force_disk)
 {
-  const char * efidir_disk;
-  int efidir_part;
   int ret;
-  efidir_disk = grub_util_biosdisk_get_osdev (efidir_grub_dev->disk);
-  efidir_part = efidir_grub_dev->disk->partition ? 
efidir_grub_dev->disk->partition->number + 1 : 1;
+  const grub_disk_t *curdisk;
+  int ndev = 0;
 
   if (grub_util_exec_redirect_null ((const char * []){ "efibootmgr", 
"--version", NULL }))
     {
@@ -158,22 +157,50 @@ grub_install_register_efi (grub_device_t efidir_grub_dev,
   if (ret)
     return ret;
 
-  char *efidir_part_str = xasprintf ("%d", efidir_part);
+  for (curdisk = efidir_grub_disk; *curdisk; curdisk++)
+    ndev++;
 
-  if (!verbosity)
-    ret = grub_util_exec ((const char * []){ "efibootmgr", "-q",
+  for (curdisk = efidir_grub_disk; *curdisk; curdisk++)
+    {
+      const char * efidir_disk;
+      int efidir_part;
+      char *efidir_part_str;
+      char *new_efi_distributor = NULL;
+      grub_disk_t disk = *curdisk;
+
+      efidir_disk = force_disk ? : grub_util_biosdisk_get_osdev (disk);
+      if (!efidir_disk)
+       grub_util_error (_("%s: no device for efi"), disk->name);
+
+      efidir_part = disk->partition ? disk->partition->number + 1 : 1;
+      efidir_part_str = xasprintf ("%d", efidir_part);
+      if (ndev > 1)
+       {
+         const char *p = grub_strrchr (efidir_disk, '/');
+         new_efi_distributor = xasprintf ("%s (%s%d)\n",
+                       efi_distributor,
+                       p ? p + 1: efidir_disk,
+                       efidir_part);
+       }
+
+      if (!verbosity)
+       ret = grub_util_exec ((const char * []){ "efibootmgr", "-q",
          "-c", "-d", efidir_disk,
          "-p", efidir_part_str, "-w",
-         "-L", efi_distributor, "-l", 
+         "-L", new_efi_distributor ? : efi_distributor, "-l",
          efifile_path, NULL });
-  else
-    ret = grub_util_exec ((const char * []){ "efibootmgr",
+      else
+       ret = grub_util_exec ((const char * []){ "efibootmgr",
          "-c", "-d", efidir_disk,
          "-p", efidir_part_str, "-w",
-         "-L", efi_distributor, "-l", 
+         "-L", new_efi_distributor ? : efi_distributor, "-l",
          efifile_path, NULL });
-  free (efidir_part_str);
-  return ret;
+      free (efidir_part_str);
+      free (new_efi_distributor);
+      if (ret)
+       return ret;
+    }
+  return 0;
 }
 
 void
diff --git a/grub-core/osdep/windows/platform.c 
b/grub-core/osdep/windows/platform.c
index 1d2e356e6b..3517803251 100644
--- a/grub-core/osdep/windows/platform.c
+++ b/grub-core/osdep/windows/platform.c
@@ -204,7 +204,8 @@ set_efi_variable_bootn (grub_uint16_t n, void *in, 
grub_size_t len)
 int
 grub_install_register_efi (grub_device_t efidir_grub_dev,
                           const char *efifile_path,
-                          const char *efi_distributor)
+                          const char *efi_distributor,
+                          const char *force_disk)
 {
   grub_uint16_t *boot_order, *new_boot_order;
   grub_uint16_t *distributor16;
diff --git a/include/grub/diskfilter.h b/include/grub/diskfilter.h
index 8deb1a8c30..94ed8673d7 100644
--- a/include/grub/diskfilter.h
+++ b/include/grub/diskfilter.h
@@ -49,6 +49,7 @@ struct grub_diskfilter_vg {
 
 #ifdef GRUB_UTIL
   struct grub_diskfilter *driver;
+  grub_uint8_t mdraid1x_minor_version;
 #endif
 };
 
@@ -66,8 +67,6 @@ struct grub_diskfilter_pv {
   /* Optional.  */
   char *name;
   grub_disk_t disk;
-  grub_disk_addr_t part_start;
-  grub_disk_addr_t part_size;
   grub_disk_addr_t start_sector; /* Sector number where the data area starts. 
*/
   struct grub_diskfilter_pv *next;
   /* Optional.  */
diff --git a/include/grub/util/install.h b/include/grub/util/install.h
index 456955c3d7..9f9e0b2ac1 100644
--- a/include/grub/util/install.h
+++ b/include/grub/util/install.h
@@ -237,9 +237,10 @@ int
 grub_install_get_powerpc_secure_boot (void);
 
 int
-grub_install_register_efi (grub_device_t efidir_grub_dev,
+grub_install_register_efi (const grub_disk_t *efidir_grub_disk,
                           const char *efifile_path,
-                          const char *efi_distributor);
+                          const char *efi_distributor,
+                          const char *force_disk);
 
 void
 grub_install_register_ieee1275 (int is_prep, const char *install_device,
diff --git a/util/grub-install.c b/util/grub-install.c
index 213f54a782..0cabc79119 100644
--- a/util/grub-install.c
+++ b/util/grub-install.c
@@ -1694,6 +1694,40 @@ main (int argc, char *argv[])
            }
        }
       prefix_drive = xasprintf ("(%s)", grub_drives[0]);
+
+      if (platform == GRUB_INSTALL_PLATFORM_X86_64_EFI
+         && grub_dev->disk
+         && grub_dev->disk->partition
+         && grub_fs->fs_uuid)
+       {
+         int raid_level;
+         char *uuid = NULL;
+         char *escaped_relpath = NULL;
+
+         raid_level = probe_raid_level (grub_dev->disk);
+         if (raid_level != 1)
+           goto out;
+
+         escaped_relpath = escape (relative_grubdir);
+         if (!escaped_relpath)
+           goto out;
+
+         if (grub_fs->fs_uuid (grub_dev, &uuid) || !uuid)
+           {
+             grub_print_error ();
+             grub_errno = 0;
+             goto out;
+           }
+
+         if (!load_cfg_f)
+           load_cfg_f = grub_util_fopen (load_cfg, "wb");
+         have_load_cfg = 1;
+         fprintf (load_cfg_f, "search --no-floppy --fs-uuid --set=root 
--hint='%s' %s\n", grub_drives[0], uuid);
+         fprintf (load_cfg_f, "set prefix=($root)'%s'\n", escaped_relpath);
+         grub_install_push_module ("search");
+ out:
+         grub_free (escaped_relpath);
+       }
     }
 
 #ifdef __linux__
@@ -2232,9 +2266,13 @@ main (int argc, char *argv[])
            {
              /* Try to make this image bootable using the EFI Boot Manager, if 
available.  */
              int ret;
-             ret = grub_install_register_efi (efidir_grub_dev,
+             grub_disk_t efidir_grub_disk[2];
+             efidir_grub_disk[0] = efidir_grub_dev->disk;
+             efidir_grub_disk[1] = NULL;
+             ret = grub_install_register_efi (efidir_grub_disk,
                                               
"\\System\\Library\\CoreServices",
-                                              efi_distributor);
+                                              efi_distributor,
+                                              NULL);
              if (ret)
                grub_util_error (_("efibootmgr failed to register the boot 
entry: %s"),
                                 strerror (ret));
@@ -2287,7 +2325,11 @@ main (int argc, char *argv[])
        {
          char * efifile_path;
          char * part;
+         int raid_level;
          int ret;
+         grub_disk_t *efidir_grub_disk;
+         grub_disk_memberlist_t list = NULL, cur;
+         char * force_disk = NULL;
 
          /* Try to make this image bootable using the EFI Boot Manager, if 
available.  */
          if (!efi_distributor || efi_distributor[0] == '\0')
@@ -2304,8 +2346,65 @@ main (int argc, char *argv[])
                          efidir_grub_dev->disk->name,
                          (part ? ",": ""), (part ? : ""));
          grub_free (part);
-         ret = grub_install_register_efi (efidir_grub_dev,
-                                          efifile_path, efi_distributor);
+
+         raid_level = probe_raid_level (efidir_grub_dev->disk);
+         if (raid_level >= 0 && raid_level != 1)
+           grub_util_warn (_("unsupported raid level %d detected for efi 
system partition"), raid_level);
+         if (raid_level == 1 && !efidir_grub_dev->disk->partition)
+           {
+             const char *raidname = NULL;
+
+             if (efidir_grub_dev->disk->dev->disk_raidname)
+               raidname = efidir_grub_dev->disk->dev->disk_raidname 
(efidir_grub_dev->disk);
+             if (raidname
+                 && (grub_strncmp (raidname, "mdraid09", sizeof ("mdraid09")) 
== 0
+                     || (grub_strcmp (raidname, "mdraid1x") == 0
+                         && ((struct grub_diskfilter_lv *) 
efidir_grub_dev->disk->data)->vg->mdraid1x_minor_version == 0)))
+               {
+                 if (efidir_grub_dev->disk->dev->disk_memberlist)
+                   list = efidir_grub_dev->disk->dev->disk_memberlist 
(efidir_grub_dev->disk);
+               }
+             else
+               {
+                 grub_util_warn (_("this array has metadata at the start and 
may not be suitable as a efi system partition."
+                   " please ensure that your firmware understands md/v1.x 
metadata, or use --metadata=0.90"
+                   " to create the array."));
+                 /* Try to continue regardless metadata, nothing to lose here 
*/
+                 if (efidir_grub_dev->disk->dev->disk_memberlist)
+                   list = efidir_grub_dev->disk->dev->disk_memberlist 
(efidir_grub_dev->disk);
+               }
+           }
+         else if (raid_level == 1)
+           force_disk = grub_util_get_os_disk (install_device);
+         if (list)
+           {
+             int i;
+             int ndisk = 0;
+
+             for (cur = list; cur; cur = cur->next)
+               ++ndisk;
+             efidir_grub_disk = xcalloc (ndisk + 1, sizeof 
(*efidir_grub_disk));
+             for (cur = list, i = 0; i < ndisk; cur = cur->next, i++)
+               efidir_grub_disk[i] = cur->disk;
+             efidir_grub_disk[ndisk] = NULL;
+           }
+         else
+           {
+             efidir_grub_disk = xcalloc (2, sizeof (*efidir_grub_disk));
+             efidir_grub_disk[0] = efidir_grub_dev->disk;
+             efidir_grub_disk[1] = NULL;
+           }
+         ret = grub_install_register_efi (efidir_grub_disk,
+                                          efifile_path, efi_distributor,
+                                          force_disk);
+         while (list)
+           {
+             cur = list;
+             list = list->next;
+             grub_free (cur);
+           }
+         grub_free (force_disk);
+         grub_free (efidir_grub_disk);
          if (ret)
            grub_util_error (_("efibootmgr failed to register the boot entry: 
%s"),
                             strerror (ret));
-- 
2.34.1

Reply via email to