[5/5] ide: propagate the required alignment

Submitted by Christoph Hellwig on Sept. 12, 2010, 9:44 p.m.

Details

Message ID 20100912214400.GD4893@lst.de
State New
Headers show

Commit Message

Christoph Hellwig Sept. 12, 2010, 9:44 p.m.
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>

Comments

Kevin Wolf Sept. 21, 2010, 10:59 a.m.
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 hide | download patch | download mbox

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,