+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>
* util/grub-mkrescue.in: Rename "ata" to "pata" and add ahci when
scsi = disk->data;
- /* Depending on the type, select a read function. */
- switch (scsi->devtype)
+ while (size)
{
- case grub_scsi_devtype_direct:
- return grub_scsi_read10 (disk, sector, size, buf);
-
- case grub_scsi_devtype_cdrom:
- return grub_scsi_read12 (disk, sector, size, buf);
+ /* PATA doesn't support more than 32K reads.
+ 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:
+ 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;
#if 0 /* Workaround - it works - but very slowly, from some reason