| Submitter | Christoph Hellwig |
|---|---|
| Date | Sept. 12, 2010, 9:44 p.m. |
| Message ID | <20100912214400.GD4893@lst.de> |
| Download | mbox | patch |
| Permalink | /patch/64566/ |
| State | New |
| Headers | show |
Comments
Am 12.09.2010 23:44, schrieb Christoph Hellwig: > IDE is a bit ugly in this respect. For one it doesn't really keep track > of a sector size - most of the protocol is in units of 512 bytes, and we > assume 2048 bytes for CDROMs which is correct most of the time. > > Second IDE allocates an I/O buffer long before we know if we're dealing > with a CDROM or not, so increase the alignment for the io_buffer > unconditionally. > > Signed-off-by: Christoph Hellwig <hch@lst.de> I'm not very happy about the last three patches in this series because they mix guest device and backend properties. But it's probably the best we can get without major effort. Applied all to the block branch. Kevin
Patch
Index: qemu/hw/ide/core.c =================================================================== --- qemu.orig/hw/ide/core.c 2010-09-12 18:30:06.000000000 -0300 +++ qemu/hw/ide/core.c 2010-09-12 18:32:29.133759395 -0300 @@ -2645,6 +2645,7 @@ int ide_init_drive(IDEState *s, BlockDri if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) { s->drive_kind = IDE_CD; bdrv_set_change_cb(bs, cdrom_change_cb, s); + bs->buffer_alignment = 2048; } else { if (!bdrv_is_inserted(s->bs)) { error_report("Device needs media, but drive is empty"); @@ -2679,7 +2680,8 @@ static void ide_init1(IDEBus *bus, int u s->bus = bus; s->unit = unit; s->drive_serial = drive_serial++; - s->io_buffer = qemu_blockalign(s->bs, IDE_DMA_BUF_SECTORS*512 + 4); + /* we need at least 2k alignment for accessing CDROMs using O_DIRECT */ + s->io_buffer = qemu_memalign(2048, IDE_DMA_BUF_SECTORS*512 + 4); s->io_buffer_total_len = IDE_DMA_BUF_SECTORS*512 + 4; s->smart_selftest_data = qemu_blockalign(s->bs, 512); s->sector_write_timer = qemu_new_timer(vm_clock,
IDE is a bit ugly in this respect. For one it doesn't really keep track of a sector size - most of the protocol is in units of 512 bytes, and we assume 2048 bytes for CDROMs which is correct most of the time. Second IDE allocates an I/O buffer long before we know if we're dealing with a CDROM or not, so increase the alignment for the io_buffer unconditionally. Signed-off-by: Christoph Hellwig <hch@lst.de>