qemu/hw/ide
Jason Baron 61f52e06f0 ahci: Fix ahci cdrom read corruptions for reads > 128k
While testing q35, which has its cdrom attached to the ahci controller, I found
that the Fedora 17 install would panic on boot. The panic occurs while
squashfs is trying to read from the cdrom. The errors are:

[    8.622711] SQUASHFS error: xz_dec_run error, data probably corrupt
[    8.625180] SQUASHFS error: squashfs_read_data failed to read block
0x20be48a

I was also able to produce corrupt data reads using an installed piix based
qemu machine, using 'dd'. I found that the corruptions were only occuring when
then read size was greater than 128k. For example, the following command
results in corrupted reads:

dd if=/dev/sr0 of=/tmp/blah bs=256k iflag=direct

The > 128k size reads exercise a different code path than 128k and below. In
ide_atapi_cmd_read_dma_cb() s->io_buffer_size is capped at 128k. Thus,
ide_atapi_cmd_read_dma_cb() is called a second time when the read is > 128k.
However, ahci_dma_rw_buf() restart the read from offset 0, instead of at 128k.
Thus, resulting in a corrupted read.

To fix this, I've introduced 'io_buffer_offset' field in IDEState to keep
track of the offset. I've also modified ahci_populate_sglist() to take a new
3rd offset argument, so that the sglist is property initialized.

I've tested this patch using 'dd' testing, and Fedora 17 now correctly boots
and installs on q35 with the cdrom ahci controller.

Signed-off-by: Jason Baron <jbaron@redhat.com>
Tested-by: Andreas Färber <afaerber@suse.de>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
2012-08-10 10:25:12 +02:00
..
ahci.c ahci: Fix ahci cdrom read corruptions for reads > 128k 2012-08-10 10:25:12 +02:00
ahci.h ide/ahci: Use universal DMA helper functions 2012-06-27 16:33:25 -05:00
atapi.c atapi: implement READ DISC INFORMATION 2012-07-02 10:18:41 +02:00
cmd646.c Merge branch pci into master 2012-07-29 17:05:35 +03:00
core.c hw/block-common: Factor out fall back to legacy -drive cyls=... 2012-07-17 16:48:32 +02:00
ich.c Merge branch pci into master 2012-07-29 17:05:35 +03:00
internal.h ahci: Fix ahci cdrom read corruptions for reads > 128k 2012-08-10 10:25:12 +02:00
isa.c qom: Unify type registration 2012-02-15 09:39:21 -06:00
macio.c iommu: Make sglists and dma_bdrv helpers use new universal DMA helpers 2012-06-27 16:33:25 -05:00
Makefile.objs build: convert libhw to nested Makefile.objs 2012-06-07 09:21:17 +02:00
microdrive.c hw: Trim superfluous #include "block_int.h" 2011-09-12 15:17:21 +02:00
mmio.c ide/mmio: convert to memory API 2011-11-24 18:31:59 +02:00
pci.c ide: fix compilation errors when DEBUG_IDE is set 2012-02-10 10:44:52 +00:00
pci.h ide: convert to memory API 2011-08-08 10:15:54 -05:00
piix.c Merge branch pci into master 2012-07-29 17:05:35 +03:00
qdev.c ide scsi: Mess with geometry only for hard disk devices 2012-08-06 22:39:14 +02:00
via.c Merge branch pci into master 2012-07-29 17:05:35 +03:00