Commit f0c596cb authored by Thiemo Seufer's avatar Thiemo Seufer
Browse files

Last AIO patch, by Vladimir N. Oleynik.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3147 c046a42c-6fe2-441c-8c8c-71466251a162
parent 3ddf0b5c
Loading
Loading
Loading
Loading
+37 −17
Original line number Diff line number Diff line
@@ -864,10 +864,44 @@ static void ide_sector_write_timer_cb(void *opaque)
    ide_set_irq(s);
}

static void ide_sector_write_aio_cb(void *opaque, int ret)
{
    BMDMAState *bm = opaque;
    IDEState *s = bm->ide_if;

#ifdef TARGET_I386
    if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
	/* It seems there is a bug in the Windows 2000 installer HDD
	   IDE driver which fills the disk with empty logs when the
	   IDE write IRQ comes too early. This hack tries to correct
	   that at the expense of slower write performances. Use this
	   option _only_ to install Windows 2000. You must disable it
	   for normal use. */
	qemu_mod_timer(s->sector_write_timer,
		       qemu_get_clock(vm_clock) + (ticks_per_sec / 1000));
    } else
#endif
    {
	ide_set_irq(s);
    }
    bm->aiocb = NULL;
}

static void ide_sector_write(IDEState *s)
{
    BMDMAState *bm;
    int64_t sector_num;
    int ret, n, n1;
    int n, n1;

    s->io_buffer_index = 0;
    s->io_buffer_size = 0;
    bm = s->bmdma;
    if(bm == NULL) {
	bm = qemu_mallocz(sizeof(BMDMAState));
	s->bmdma = bm;
    }
    bm->ide_if = s;
    bm->dma_cb = ide_sector_write_aio_cb;

    s->status = READY_STAT | SEEK_STAT;
    sector_num = ide_get_sector(s);
@@ -877,7 +911,6 @@ static void ide_sector_write(IDEState *s)
    n = s->nsector;
    if (n > s->req_nb_sectors)
        n = s->req_nb_sectors;
    ret = bdrv_write(s->bs, sector_num, s->io_buffer, n);
    s->nsector -= n;
    if (s->nsector == 0) {
        /* no more sectors to write */
@@ -890,21 +923,8 @@ static void ide_sector_write(IDEState *s)
    }
    ide_set_sector(s, sector_num + n);
    
#ifdef TARGET_I386
    if (win2k_install_hack && ((++s->irq_count % 16) == 0)) {
        /* It seems there is a bug in the Windows 2000 installer HDD
           IDE driver which fills the disk with empty logs when the
           IDE write IRQ comes too early. This hack tries to correct
           that at the expense of slower write performances. Use this
           option _only_ to install Windows 2000. You must disable it
           for normal use. */
        qemu_mod_timer(s->sector_write_timer, 
                       qemu_get_clock(vm_clock) + (ticks_per_sec / 1000));
    } else 
#endif
    {
        ide_set_irq(s);
    }
    bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n,
			       ide_sector_write_aio_cb, bm);
}

/* XXX: handle errors */