blk_drain() needs the lock because it calls AIO_WAIT_WHILE(). The s->rq loop doesn't need the lock because dataplane has been stopped when virtio_blk_reset() is called.
Signed-off-by: Stefan Hajnoczi <[email protected]> --- hw/block/virtio-blk.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/hw/block/virtio-blk.c b/hw/block/virtio-blk.c index 771d87cfbe..0b411b3065 100644 --- a/hw/block/virtio-blk.c +++ b/hw/block/virtio-blk.c @@ -898,6 +898,7 @@ static void virtio_blk_reset(VirtIODevice *vdev) ctx = blk_get_aio_context(s->blk); aio_context_acquire(ctx); blk_drain(s->blk); + aio_context_release(ctx); /* We drop queued requests after blk_drain() because blk_drain() itself can * produce them. */ @@ -908,8 +909,6 @@ static void virtio_blk_reset(VirtIODevice *vdev) virtio_blk_free_request(req); } - aio_context_release(ctx); - assert(!s->dataplane_started); blk_set_enable_write_cache(s->blk, s->original_wce); } -- 2.38.1
