From 5604e090cba05e9ef881b5ff9ce09c6a2a1a476b Mon Sep 17 00:00:00 2001 From: balrog Date: Wed, 1 Oct 2008 01:43:16 +0000 Subject: [PATCH] Check that asynchronous (DMA) submission succeeds (Ian Jackson). If it does not, abort the command immediately rather than dropping it on the floor. Signed-off-by: Ian Jackson git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5369 c046a42c-6fe2-441c-8c8c-71466251a162 --- hw/ide.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/hw/ide.c b/hw/ide.c index cddc0d5..686d372 100644 --- a/hw/ide.c +++ b/hw/ide.c @@ -738,6 +738,14 @@ static inline void ide_abort_command(IDEState *s) s->error = ABRT_ERR; } +static inline void ide_dma_submit_check(IDEState *s, + BlockDriverCompletionFunc *dma_cb, BMDMAState *bm) +{ + if (bm->aiocb) + return; + dma_cb(bm, -1); +} + static inline void ide_set_irq(IDEState *s) { BMDMAState *bm = s->bmdma; @@ -954,6 +962,7 @@ static void ide_read_dma_cb(void *opaque, int ret) #endif bm->aiocb = bdrv_aio_read(s->bs, sector_num, s->io_buffer, n, ide_read_dma_cb, bm); + ide_dma_submit_check(s, ide_read_dma_cb, bm); } static void ide_sector_read_dma(IDEState *s) @@ -1065,6 +1074,7 @@ static void ide_write_dma_cb(void *opaque, int ret) #endif bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n, ide_write_dma_cb, bm); + ide_dma_submit_check(s, ide_write_dma_cb, bm); } static void ide_sector_write_dma(IDEState *s) -- 2.7.4