ide: Fix ide_dma_cancel
When cancelling a request, bdrv_aio_cancel may decide that it waits for completion of a request rather than for cancellation. IDE therefore can't abandon its DMA status before calling bdrv_aio_cancel; otherwise the callback of a completed request would use invalid data. Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
20be49e47e
commit
38d8dfa193
|
@ -2838,10 +2838,6 @@ static void ide_dma_restart(IDEState *s, int is_read)
|
||||||
void ide_dma_cancel(BMDMAState *bm)
|
void ide_dma_cancel(BMDMAState *bm)
|
||||||
{
|
{
|
||||||
if (bm->status & BM_STATUS_DMAING) {
|
if (bm->status & BM_STATUS_DMAING) {
|
||||||
bm->status &= ~BM_STATUS_DMAING;
|
|
||||||
/* cancel DMA request */
|
|
||||||
bm->unit = -1;
|
|
||||||
bm->dma_cb = NULL;
|
|
||||||
if (bm->aiocb) {
|
if (bm->aiocb) {
|
||||||
#ifdef DEBUG_AIO
|
#ifdef DEBUG_AIO
|
||||||
printf("aio_cancel\n");
|
printf("aio_cancel\n");
|
||||||
|
@ -2849,6 +2845,10 @@ void ide_dma_cancel(BMDMAState *bm)
|
||||||
bdrv_aio_cancel(bm->aiocb);
|
bdrv_aio_cancel(bm->aiocb);
|
||||||
bm->aiocb = NULL;
|
bm->aiocb = NULL;
|
||||||
}
|
}
|
||||||
|
bm->status &= ~BM_STATUS_DMAING;
|
||||||
|
/* cancel DMA request */
|
||||||
|
bm->unit = -1;
|
||||||
|
bm->dma_cb = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue