From: Valdimir Serbinenko Subject: Fix MBR remapping workaround. upstream rev 4405 --- a/grub-core/kern/emu/hostdisk.c 2012-05-27 11:19:09 +0000 +++ b/grub-core/kern/emu/hostdisk.c 2012-06-02 11:48:44 +0000 @@ -1067,27 +1067,18 @@ 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 @@ 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"),