mirror of https://gitee.com/openkylin/qemu.git
ide: set retry_unit for PIO and FLUSH requests
The following sequence of tests discovered a problem in IDE emulation: 1. Send DMA write to IDE device 0 2. Send CMD_FLUSH_CACHE to same IDE device which will be failed by block layer using blkdebug script in tests/ide-test:test_retry_flush When doing DMA request ide/core.c will set s->retry_unit to s->unit in ide_start_dma. When dma completes ide_set_inactive sets retry_unit to -1. After that ide_flush_cache runs and fails thanks to blkdebug. ide_flush_cb calls ide_handle_rw_error which asserts that s->retry_unit == s->unit. But s->retry_unit is still -1 after previous DMA completion and flush does not use anything related to retry. This patch restricts retry unit assertion only to ops that actually use retry logic. Signed-off-by: Evgeny Yakovlev <eyakovlev@virtuozzo.com> Signed-off-by: Denis V. Lunev <den@openvz.org> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-id: 1468870792-7411-3-git-send-email-den@openvz.org CC: Kevin Wolf <kwolf@redhat.com> CC: Max Reitz <mreitz@redhat.com> CC: Stefan Hajnoczi <stefanha@redhat.com> CC: Fam Zheng <famz@redhat.com> CC: John Snow <jsnow@redhat.com> Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
0eeee07e24
commit
35f78ab469
|
@ -487,6 +487,7 @@ void ide_transfer_start(IDEState *s, uint8_t *buf, int size,
|
|||
s->end_transfer_func = end_transfer_func;
|
||||
s->data_ptr = buf;
|
||||
s->data_end = buf + size;
|
||||
ide_set_retry(s);
|
||||
if (!(s->status & ERR_STAT)) {
|
||||
s->status |= DRQ_STAT;
|
||||
}
|
||||
|
@ -1056,6 +1057,7 @@ static void ide_flush_cache(IDEState *s)
|
|||
}
|
||||
|
||||
s->status |= BUSY_STAT;
|
||||
ide_set_retry(s);
|
||||
block_acct_start(blk_get_stats(s->blk), &s->acct, 0, BLOCK_ACCT_FLUSH);
|
||||
s->pio_aiocb = blk_aio_flush(s->blk, ide_flush_cb, s);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue