From: Ian Jackson Date: Wed, 20 Feb 2008 15:24:14 +0000 (+0000) Subject: Actually check read/write errors when doing IDE DMA and IDE PIO writes X-Git-Tag: xen-3.3.0-rc1~248 X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=e0e7a0afe0e324a1f7d64c240f567b15dbe454cf;p=qemu-xen-4.1-testing.git Actually check read/write errors when doing IDE DMA and IDE PIO writes --- diff --git a/hw/ide.c b/hw/ide.c index 25f5b9f8e..370a41241 100644 --- a/hw/ide.c +++ b/hw/ide.c @@ -792,6 +792,11 @@ static void ide_set_sector(IDEState *s, int64_t sector_num) } } +static void ide_rw_error(IDEState *s) { + ide_abort_command(s); + ide_set_irq(s); +} + static void ide_sector_read(IDEState *s) { int64_t sector_num; @@ -811,6 +816,10 @@ static void ide_sector_read(IDEState *s) if (n > s->req_nb_sectors) n = s->req_nb_sectors; ret = bdrv_read(s->bs, sector_num, s->io_buffer, n); + if (ret != 0) { + ide_rw_error(s); + return; + } ide_transfer_start(s, s->io_buffer, 512 * n, ide_sector_read); ide_set_irq(s); ide_set_sector(s, sector_num + n); @@ -818,6 +827,14 @@ static void ide_sector_read(IDEState *s) } } +static void ide_dma_error(IDEState *s) +{ + ide_transfer_stop(s); + s->error = ABRT_ERR; + s->status = READY_STAT | ERR_STAT; + ide_set_irq(s); +} + /* return 0 if buffer completed */ static int dma_buf_rw(BMDMAState *bm, int is_write) { @@ -866,7 +883,6 @@ static int dma_buf_rw(BMDMAState *bm, int is_write) return 1; } -/* XXX: handle errors */ static void ide_read_dma_cb(void *opaque, int ret) { BMDMAState *bm = opaque; @@ -874,6 +890,11 @@ static void ide_read_dma_cb(void *opaque, int ret) int n; int64_t sector_num; + if (ret < 0) { + ide_dma_error(s); + return; + } + n = s->io_buffer_size >> 9; sector_num = ide_get_sector(s); if (n > 0) { @@ -938,6 +959,11 @@ static void ide_sector_write(IDEState *s) if (n > s->req_nb_sectors) n = s->req_nb_sectors; ret = bdrv_write(s->bs, sector_num, s->io_buffer, n); + if (ret != 0) { + ide_rw_error(s); + return; + } + s->nsector -= n; if (s->nsector == 0) { /* no more sectors to write */ @@ -967,7 +993,6 @@ static void ide_sector_write(IDEState *s) } } -/* XXX: handle errors */ static void ide_write_dma_cb(void *opaque, int ret) { BMDMAState *bm = opaque; @@ -975,6 +1000,11 @@ static void ide_write_dma_cb(void *opaque, int ret) int n; int64_t sector_num; + if (ret < 0) { + ide_dma_error(s); + return; + } + n = s->io_buffer_size >> 9; sector_num = ide_get_sector(s); if (n > 0) {