If the guest issues a discard during a block drain section, the blk_aio_pdiscard() may not be processed, but queued instead. And so the callback will never be called to issue the bh and decrease the BB in-flight number again. This causes a hang in the drain code, since it will wait forever for the BB in-flight counter to decrease.
This reverts commit 7e5cdb34 "ide: Increment BB in-flight counter for TRIM BH" to fix this hang. The bug fixed by that commit will be fixed differently in the next commit. Signed-off-by: Lukas Straub <lukasstra...@web.de> --- hw/ide/core.c | 7 ------- 1 file changed, 7 deletions(-) diff --git a/hw/ide/core.c b/hw/ide/core.c index de48ff9f86..d172e70f1e 100644 --- a/hw/ide/core.c +++ b/hw/ide/core.c @@ -436,16 +436,12 @@ static const AIOCBInfo trim_aiocb_info = { static void ide_trim_bh_cb(void *opaque) { TrimAIOCB *iocb = opaque; - BlockBackend *blk = iocb->s->blk; iocb->common.cb(iocb->common.opaque, iocb->ret); qemu_bh_delete(iocb->bh); iocb->bh = NULL; qemu_aio_unref(iocb); - - /* Paired with an increment in ide_issue_trim() */ - blk_dec_in_flight(blk); } static void ide_issue_trim_cb(void *opaque, int ret) @@ -516,9 +512,6 @@ BlockAIOCB *ide_issue_trim( IDEDevice *dev = s->unit ? s->bus->slave : s->bus->master; TrimAIOCB *iocb; - /* Paired with a decrement in ide_trim_bh_cb() */ - blk_inc_in_flight(s->blk); - iocb = blk_aio_get(&trim_aiocb_info, s->blk, cb, cb_opaque); iocb->s = s; iocb->bh = qemu_bh_new_guarded(ide_trim_bh_cb, iocb, -- 2.39.2
pgp2YGl9QWr0N.pgp
Description: OpenPGP digital signature