grub-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH V2] grub-core: modify sector by sysfs as disk sector


From: Mukesh Kumar Chaurasiya
Subject: [PATCH V2] grub-core: modify sector by sysfs as disk sector
Date: Thu, 9 Feb 2023 13:09:16 +0530

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 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>
---
 grub-core/osdep/linux/hostdisk.c | 8 +++++---
 include/grub/disk.h              | 7 +++++++
 2 files changed, 12 insertions(+), 3 deletions(-)

diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c
index 07058f63a..fd0769e3b 100644
--- a/grub-core/osdep/linux/hostdisk.c
+++ b/grub-core/osdep/linux/hostdisk.c
@@ -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,8 @@ 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 +346,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;
       }
diff --git a/include/grub/disk.h b/include/grub/disk.h
index 25c141ea2..071b2f7df 100644
--- a/include/grub/disk.h
+++ b/include/grub/disk.h
@@ -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);
 
-- 
2.31.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]