Patchwork [5/5] ide: propagate the required alignment

login
register
mail settings
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

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>
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

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,