* grub-core/kern/emu/hostdisk.c (grub_util_biosdisk_write) [__linux__]:

Fix MBR remapping workaround.
	(grub_util_biosdisk_read) [__linux__]: Likewise.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2012-06-02 13:48:44 +02:00
parent 8a7ecad3ab
commit 6297e19736
2 changed files with 24 additions and 37 deletions

View file

@ -1,3 +1,9 @@
2012-06-02 Vladimir Serbinenko <phcoder@gmail.com>
* 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 <phcoder@gmail.com> 2012-06-01 Vladimir Serbinenko <phcoder@gmail.com>
* util/grub-install.in: Check for ieee1275 and not ieee1276. * util/grub-install.in: Check for ieee1275 and not ieee1276.

View file

@ -1067,27 +1067,18 @@ grub_util_biosdisk_read (grub_disk_t disk, grub_disk_addr_t sector,
if (fd < 0) if (fd < 0)
return grub_errno; return grub_errno;
if (max > size)
max = size;
#ifdef __linux__ #ifdef __linux__
if (sector == 0 && max > 1) if (sector == 0)
{
/* Work around a bug in Linux ez remapping. Linux remaps all /* Work around a bug in Linux ez remapping. Linux remaps all
sectors that are read together with the MBR in one read. It sectors that are read together with the MBR in one read. It
should only remap the MBR, so we split the read in two should only remap the MBR, so we split the read in two
parts. -jochen */ parts. -jochen */
if (grub_util_fd_read (fd, buf, (1 << disk->log_sector_size)) max = 1;
!= (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__ */ #endif /* __linux__ */
if (max > size)
max = size;
if (grub_util_fd_read (fd, buf, max << disk->log_sector_size) if (grub_util_fd_read (fd, buf, max << disk->log_sector_size)
!= (ssize_t) (max << disk->log_sector_size)) != (ssize_t) (max << disk->log_sector_size))
return grub_error (GRUB_ERR_READ_ERROR, N_("cannot read `%s': %s"), 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) if (fd < 0)
return grub_errno; return grub_errno;
if (max > size)
max = size;
#ifdef __linux__ #ifdef __linux__
if (sector == 0 && max > 1) if (sector == 0)
{
/* Work around a bug in Linux ez remapping. Linux remaps all /* Work around a bug in Linux ez remapping. Linux remaps all
sectors that are write together with the MBR in one write. It sectors that are write together with the MBR in one write. It
should only remap the MBR, so we split the write in two should only remap the MBR, so we split the write in two
parts. -jochen */ parts. -jochen */
if (grub_util_fd_write (fd, buf, (1 << disk->log_sector_size)) max = 1;
!= (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__ */ #endif /* __linux__ */
if (max > size)
max = size;
if (grub_util_fd_write (fd, buf, max << disk->log_sector_size) if (grub_util_fd_write (fd, buf, max << disk->log_sector_size)
!= (ssize_t) (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"), return grub_error (GRUB_ERR_WRITE_ERROR, N_("cannot write to `%s': %s"),