]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
osdep/linux/getroot: Detect DDF container similar to IMSM
authorRenaud Métrich <rmetrich@redhat.com>
Thu, 24 Apr 2025 09:43:28 +0000 (11:43 +0200)
committerDaniel Kiper <daniel.kiper@oracle.com>
Thu, 29 May 2025 13:45:24 +0000 (15:45 +0200)
Similarly to Intel IMSM, there are BIOS and UEFI implementations that
support DDF containers natively.

DDF and IMSM are very similar in handling, especially these should not
be considered as RAID abstraction. This fixes the requirement of having
a device map when probing DDF containers.

Fixes: https://issues.redhat.com/browse/RHEL-44336
Signed-off-by: Renaud Métrich <rmetrich@redhat.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/osdep/linux/getroot.c

index 527d4f0c538ad5a0bc139b0f46b4bb04b9841acd..7872a8d03a0ba5733cabd8491665758a04d3dd0e 100644 (file)
@@ -119,7 +119,7 @@ struct btrfs_ioctl_search_args {
                                struct btrfs_ioctl_fs_info_args)
 
 static int
-grub_util_is_imsm (const char *os_dev);
+grub_util_is_imsm_or_ddf (const char *os_dev);
 
 
 #define ESCAPED_PATH_MAX (4 * PATH_MAX)
@@ -638,10 +638,10 @@ out:
 }
 
 static int
-grub_util_is_imsm (const char *os_dev)
+grub_util_is_imsm_or_ddf (const char *os_dev)
 {
   int retry;
-  int is_imsm = 0;
+  int is_imsm_or_ddf = 0;
   int container_seen = 0;
   const char *dev = os_dev;
 
@@ -702,10 +702,17 @@ grub_util_is_imsm (const char *os_dev)
          if (strncmp (buf, "MD_METADATA=imsm",
                       sizeof ("MD_METADATA=imsm") - 1) == 0)
            {
-             is_imsm = 1;
+             is_imsm_or_ddf = 1;
              grub_util_info ("%s is imsm", dev);
              break;
            }
+         if (strncmp (buf, "MD_METADATA=ddf",
+                      sizeof ("MD_METADATA=ddf") - 1) == 0)
+           {
+             is_imsm_or_ddf = 1;
+             grub_util_info ("%s is ddf", dev);
+             break;
+           }
        }
 
       free (buf);
@@ -716,7 +723,7 @@ grub_util_is_imsm (const char *os_dev)
 
   if (dev != os_dev)
     free ((void *) dev);
-  return is_imsm;
+  return is_imsm_or_ddf;
 }
 
 char *
@@ -1081,7 +1088,7 @@ grub_util_get_dev_abstraction_os (const char *os_dev)
 
   /* Check for RAID.  */
   if (!strncmp (os_dev, "/dev/md", 7) && ! grub_util_device_is_mapped (os_dev)
-      && !grub_util_is_imsm (os_dev))
+      && !grub_util_is_imsm_or_ddf (os_dev))
     return GRUB_DEV_ABSTRACTION_RAID;
   return GRUB_DEV_ABSTRACTION_NONE;
 }