From 6297e19736dfede146eed2d44d849e8402450f73 Mon Sep 17 00:00:00 2001 From: Vladimir 'phcoder' Serbinenko Date: Sat, 2 Jun 2012 13:48:44 +0200 Subject: [PATCH] * grub-core/kern/emu/hostdisk.c (grub_util_biosdisk_write) [__linux__]: Fix MBR remapping workaround. (grub_util_biosdisk_read) [__linux__]: Likewise. --- ChangeLog | 6 ++++ grub-core/kern/emu/hostdisk.c | 55 ++++++++++++----------------------- 2 files changed, 24 insertions(+), 37 deletions(-) diff --git a/ChangeLog b/ChangeLog index 54eea4ab7..cccffb547 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2012-06-02 Vladimir Serbinenko + + * grub-core/kern/emu/hostdisk.c (grub_util_biosdisk_write) [__linux__]: + Fix MBR remapping workaround. + (grub_util_biosdisk_read) [__linux__]: Likewise. + 2012-06-01 Vladimir Serbinenko * util/grub-install.in: Check for ieee1275 and not ieee1276. diff --git a/grub-core/kern/emu/hostdisk.c b/grub-core/kern/emu/hostdisk.c index 772df26ee..983115127 100644 --- a/grub-core/kern/emu/hostdisk.c +++ b/grub-core/kern/emu/hostdisk.c @@ -1067,27 +1067,18 @@ grub_util_biosdisk_read (grub_disk_t disk, grub_disk_addr_t sector, if (fd < 0) return grub_errno; +#ifdef __linux__ + if (sector == 0) + /* Work around a bug in Linux ez remapping. Linux remaps all + sectors that are read together with the MBR in one read. It + should only remap the MBR, so we split the read in two + parts. -jochen */ + max = 1; +#endif /* __linux__ */ + if (max > size) max = size; -#ifdef __linux__ - if (sector == 0 && max > 1) - { - /* Work around a bug in Linux ez remapping. Linux remaps all - sectors that are read together with the MBR in one read. It - should only remap the MBR, so we split the read in two - parts. -jochen */ - if (grub_util_fd_read (fd, buf, (1 << disk->log_sector_size)) - != (1 << disk->log_sector_size)) - return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"), - map[disk->id].device, strerror (errno)); - - buf += (1 << disk->log_sector_size); - size--; - max--; - } -#endif /* __linux__ */ - if (grub_util_fd_read (fd, buf, max << disk->log_sector_size) != (ssize_t) (max << disk->log_sector_size)) return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"), @@ -1111,28 +1102,18 @@ grub_util_biosdisk_write (grub_disk_t disk, grub_disk_addr_t sector, if (fd < 0) return grub_errno; +#ifdef __linux__ + if (sector == 0) + /* Work around a bug in Linux ez remapping. Linux remaps all + sectors that are write together with the MBR in one write. It + should only remap the MBR, so we split the write in two + parts. -jochen */ + max = 1; +#endif /* __linux__ */ + if (max > size) max = size; -#ifdef __linux__ - if (sector == 0 && max > 1) - { - /* Work around a bug in Linux ez remapping. Linux remaps all - sectors that are write together with the MBR in one write. It - should only remap the MBR, so we split the write in two - parts. -jochen */ - if (grub_util_fd_write (fd, buf, (1 << disk->log_sector_size)) - != (1 << disk->log_sector_size)) - return grub_error (GRUB_ERR_WRITE_ERROR, - N_("cannot write to `%s': %s"), - map[disk->id].device, strerror (errno)); - - buf += (1 << disk->log_sector_size); - size--; - max--; - } -#endif /* __linux__ */ - if (grub_util_fd_write (fd, buf, max << disk->log_sector_size) != (ssize_t) (max << disk->log_sector_size)) return grub_error (GRUB_ERR_WRITE_ERROR, N_("cannot write to `%s': %s"),