* grub-core/disk/scsi.c (grub_scsi_read): Limit SCSI reads to 32K

because of underlying system restrictions.
This commit is contained in:
Vladimir 'phcoder' Serbinenko 2011-06-27 10:12:35 +02:00
parent efff4b1cc3
commit 1e3d9b8612
2 changed files with 31 additions and 7 deletions

View file

@ -1,3 +1,8 @@
2011-06-27 Vladimir Serbinenko <phcoder@gmail.com>
* grub-core/disk/scsi.c (grub_scsi_read): Limit SCSI reads to 32K
because of underlying system restrictions.
2011-06-27 Vladimir Serbinenko <phcoder@gmail.com> 2011-06-27 Vladimir Serbinenko <phcoder@gmail.com>
* util/grub-mkrescue.in: Rename "ata" to "pata" and add ahci when * util/grub-mkrescue.in: Rename "ata" to "pata" and add ahci when

View file

@ -524,17 +524,36 @@ grub_scsi_read (grub_disk_t disk, grub_disk_addr_t sector,
scsi = disk->data; scsi = disk->data;
/* Depending on the type, select a read function. */ while (size)
switch (scsi->devtype)
{ {
case grub_scsi_devtype_direct: /* PATA doesn't support more than 32K reads.
return grub_scsi_read10 (disk, sector, size, buf); Not sure about AHCI and USB. If it's confirmed that either of
them can do bigger reads reliably this value can be moved to 'scsi'
structure. */
grub_size_t len = 32768 >> disk->log_sector_size;
grub_err_t err;
if (len > size)
len = size;
/* Depending on the type, select a read function. */
switch (scsi->devtype)
{
case grub_scsi_devtype_direct:
err = grub_scsi_read10 (disk, sector, len, buf);
if (err)
return err;
break;
case grub_scsi_devtype_cdrom: case grub_scsi_devtype_cdrom:
return grub_scsi_read12 (disk, sector, size, buf); err = grub_scsi_read12 (disk, sector, len, buf);
if (err)
return err;
break;
}
size -= len;
sector += len;
buf += len << disk->log_sector_size;
} }
/* XXX: Never reached. */
return GRUB_ERR_NONE; return GRUB_ERR_NONE;
#if 0 /* Workaround - it works - but very slowly, from some reason #if 0 /* Workaround - it works - but very slowly, from some reason