76 lines
3.0 KiB
Diff
76 lines
3.0 KiB
Diff
From f7564844f82b57078d601befadc438b5bc1fa01b Mon Sep 17 00:00:00 2001
|
|
From: Mukesh Kumar Chaurasiya <mchauras@linux.vnet.ibm.com>
|
|
Date: Thu, 9 Feb 2023 13:09:16 +0530
|
|
Subject: osdep/linux/hostdisk: Modify sector by sysfs as disk sector
|
|
|
|
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.
|
|
|
|
Reference:https://git.savannah.gnu.org/cgit/grub.git/commit?id=f7564844f82b57078d601befadc438b5bc1fa01b
|
|
Conflict:NA
|
|
|
|
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 | 7 ++++---
|
|
include/grub/disk.h | 7 +++++++
|
|
2 files changed, 11 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/grub-core/osdep/linux/hostdisk.c b/grub-core/osdep/linux/hostdisk.c
|
|
index 07058f6..7e24ae6 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,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;
|
|
}
|
|
diff --git a/include/grub/disk.h b/include/grub/disk.h
|
|
index 25c141e..071b2f7 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);
|
|
|
|
--
|
|
cgit v1.1
|
|
|