Commit 5604e090cba05e9ef881b5ff9ce09c6a2a1a476b
1 parent
e162cfb0
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 <ian.jackson@eu.citrix.com> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5369 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
10 additions
and
0 deletions
hw/ide.c
... | ... | @@ -738,6 +738,14 @@ static inline void ide_abort_command(IDEState *s) |
738 | 738 | s->error = ABRT_ERR; |
739 | 739 | } |
740 | 740 | |
741 | +static inline void ide_dma_submit_check(IDEState *s, | |
742 | + BlockDriverCompletionFunc *dma_cb, BMDMAState *bm) | |
743 | +{ | |
744 | + if (bm->aiocb) | |
745 | + return; | |
746 | + dma_cb(bm, -1); | |
747 | +} | |
748 | + | |
741 | 749 | static inline void ide_set_irq(IDEState *s) |
742 | 750 | { |
743 | 751 | BMDMAState *bm = s->bmdma; |
... | ... | @@ -954,6 +962,7 @@ static void ide_read_dma_cb(void *opaque, int ret) |
954 | 962 | #endif |
955 | 963 | bm->aiocb = bdrv_aio_read(s->bs, sector_num, s->io_buffer, n, |
956 | 964 | ide_read_dma_cb, bm); |
965 | + ide_dma_submit_check(s, ide_read_dma_cb, bm); | |
957 | 966 | } |
958 | 967 | |
959 | 968 | static void ide_sector_read_dma(IDEState *s) |
... | ... | @@ -1065,6 +1074,7 @@ static void ide_write_dma_cb(void *opaque, int ret) |
1065 | 1074 | #endif |
1066 | 1075 | bm->aiocb = bdrv_aio_write(s->bs, sector_num, s->io_buffer, n, |
1067 | 1076 | ide_write_dma_cb, bm); |
1077 | + ide_dma_submit_check(s, ide_write_dma_cb, bm); | |
1068 | 1078 | } |
1069 | 1079 | |
1070 | 1080 | static void ide_sector_write_dma(IDEState *s) | ... | ... |