b86fd39
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001
b86fd39
From: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
b86fd39
Date: Thu, 9 Feb 2023 13:09:16 +0530
b86fd39
Subject: [PATCH] osdep/linux/hostdisk: Modify sector by sysfs as disk sector
b86fd39
b86fd39
The disk sector size provided by sysfs file system considers the sector
b86fd39
size of 512 irrespective of disk sector size, thus causing the read by
b86fd39
the GRUB to an incorrect offset from what was originally intended.
b86fd39
b86fd39
Considering the 512 sector size of sysfs data the actual sector needs to
b86fd39
be modified corresponding to disk sector size.
b86fd39
b86fd39
Signed-off-by: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
b86fd39
Reviewed-by: Daniel Kiper <daniel.kiper@oracle.com>
b86fd39
(cherry picked from commit f7564844f82b57078d601befadc438b5bc1fa01b)
b86fd39
---
b86fd39
 grub-core/osdep/linux/hostdisk.c | 7 ++++---
b86fd39
 include/grub/disk.h              | 7 +++++++
b86fd39
 2 files changed, 11 insertions(+), 3 deletions(-)
b86fd39
b86fd39
diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c
b86fd39
index 7bc99ac1c1..a9ea0bb465 100644
b86fd39
--- a/grub-core/osdep/linux/hostdisk.c
b86fd39
+++ b/grub-core/osdep/linux/hostdisk.c
b86fd39
@@ -240,7 +240,8 @@ have_devfs (void)
b86fd39
 #pragma GCC diagnostic ignored "-Wformat-nonliteral"
b86fd39
 
b86fd39
 static int
b86fd39
-grub_hostdisk_linux_find_partition (char *dev, grub_disk_addr_t sector)
b86fd39
+grub_hostdisk_linux_find_partition (const grub_disk_t disk, char *dev,
b86fd39
+                                    grub_disk_addr_t sector)
b86fd39
 {
b86fd39
   size_t len = strlen (dev);
b86fd39
   const char *format;
b86fd39
@@ -305,7 +306,7 @@ grub_hostdisk_linux_find_partition (char *dev, grub_disk_addr_t sector)
b86fd39
       if (fstat (fd, &st) < 0
b86fd39
 	  || !grub_util_device_is_mapped_stat (&st)
b86fd39
 	  || !grub_util_get_dm_node_linear_info (st.st_rdev, 0, 0, &start))
b86fd39
-	start = grub_util_find_partition_start_os (real_dev);
b86fd39
+	start = grub_disk_to_native_sector (disk, grub_util_find_partition_start_os (real_dev));
b86fd39
       /* We don't care about errors here.  */
b86fd39
       grub_errno = GRUB_ERR_NONE;
b86fd39
 
b86fd39
@@ -386,7 +387,7 @@ grub_util_fd_open_device (const grub_disk_t disk, grub_disk_addr_t sector, int f
b86fd39
 	&& strncmp (dev, "/dev/", 5) == 0)
b86fd39
       {
b86fd39
 	if (sector >= part_start)
b86fd39
-	  is_partition = grub_hostdisk_linux_find_partition (dev, part_start);
b86fd39
+	  is_partition = grub_hostdisk_linux_find_partition (disk, dev, part_start);
b86fd39
 	else
b86fd39
 	  *max = part_start - sector;
b86fd39
       }
b86fd39
diff --git a/include/grub/disk.h b/include/grub/disk.h
b86fd39
index 06210a7049..881addcc77 100644
b86fd39
--- a/include/grub/disk.h
b86fd39
+++ b/include/grub/disk.h
b86fd39
@@ -208,6 +208,13 @@ grub_disk_from_native_sector (grub_disk_t disk, grub_disk_addr_t sector)
b86fd39
   return sector << (disk->log_sector_size - GRUB_DISK_SECTOR_BITS);
b86fd39
 }
b86fd39
 
b86fd39
+/* Convert from GRUB native disk sized sector to disk sized sector. */
b86fd39
+static inline grub_disk_addr_t
b86fd39
+grub_disk_to_native_sector (grub_disk_t disk, grub_disk_addr_t sector)
b86fd39
+{
b86fd39
+  return sector >> (disk->log_sector_size - GRUB_DISK_SECTOR_BITS);
b86fd39
+}
b86fd39
+
b86fd39
 /* This is called from the memory manager.  */
b86fd39
 void grub_disk_cache_invalidate_all (void);
b86fd39