]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
osdep/linux/hostdisk: Modify sector by sysfs as disk sector
authorMukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
Thu, 9 Feb 2023 07:39:16 +0000 (13:09 +0530)
committerDaniel Kiper <daniel.kiper@oracle.com>
Tue, 14 Feb 2023 15:01:17 +0000 (16:01 +0100)
The disk sector size provided by sysfs file system considers the sector
size of 512 irrespective of disk sector size, thus causing the read by
the GRUB to an incorrect offset from what was originally intended.

Considering the 512 sector size of sysfs data the actual sector needs to
be modified corresponding to disk sector size.

Signed-off-by: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
grub-core/osdep/linux/hostdisk.c
include/grub/disk.h

index 07058f63abd1bd2f9b5b9c0463bff9bd47d734de..7e24ae62c171e3681b7337fc5bba18ad844e86a7 100644 (file)
@@ -198,7 +198,8 @@ have_devfs (void)
 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
 
 static int
-grub_hostdisk_linux_find_partition (char *dev, grub_disk_addr_t sector)
+grub_hostdisk_linux_find_partition (const grub_disk_t disk, char *dev,
+                                    grub_disk_addr_t sector)
 {
   size_t len = strlen (dev);
   const char *format;
@@ -263,7 +264,7 @@ grub_hostdisk_linux_find_partition (char *dev, grub_disk_addr_t sector)
       if (fstat (fd, &st) < 0
          || !grub_util_device_is_mapped_stat (&st)
          || !grub_util_get_dm_node_linear_info (st.st_rdev, 0, 0, &start))
-       start = grub_util_find_partition_start_os (real_dev);
+       start = grub_disk_to_native_sector (disk, grub_util_find_partition_start_os (real_dev));
       /* We don't care about errors here.  */
       grub_errno = GRUB_ERR_NONE;
 
@@ -344,7 +345,7 @@ grub_util_fd_open_device (const grub_disk_t disk, grub_disk_addr_t sector, int f
        && strncmp (dev, "/dev/", 5) == 0)
       {
        if (sector >= part_start)
-         is_partition = grub_hostdisk_linux_find_partition (dev, part_start);
+         is_partition = grub_hostdisk_linux_find_partition (disk, dev, part_start);
        else
          *max = part_start - sector;
       }
index 25c141ea27812e8992a8eb768ff7ab40b1707b0b..071b2f7df1a5b2eedba30434feaf992b3b4b0198 100644 (file)
@@ -208,6 +208,13 @@ grub_disk_from_native_sector (grub_disk_t disk, grub_disk_addr_t sector)
   return sector << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS);
 }
 
+/* Convert from GRUB native disk sized sector to disk sized sector. */
+static inline grub_disk_addr_t
+grub_disk_to_native_sector (grub_disk_t disk, grub_disk_addr_t sector)
+{
+  return sector >> (disk->log_sector_size - GRUB_DISK_SECTOR_BITS);
+}
+
 /* This is called from the memory manager.  */
 void grub_disk_cache_invalidate_all (void);