From bb9aaecaf1d9b9d7da8f8c73a4cbf3afd9848abe Mon Sep 17 00:00:00 2001 From: Kevin Wolf Date: Wed, 11 May 2016 14:57:23 +0200 Subject: [PATCH] block/io: Quiesce parents between drained_begin/end So far, bdrv_parent_drained_begin/end() was called for the duration of the actual bdrv_drain() at the beginning of a drained section, but we really should keep parents quiesced until the end of the drained section. This does not actually change behaviour at this point because the only user of the .drained_begin/end BdrvChildRole callback is I/O throttling, which already doesn't send any new requests after flushing its queue in .drained_begin. The patch merely removes a trap for future users. Reported-by: Stefan Hajnoczi Signed-off-by: Kevin Wolf Acked-by: Stefan Hajnoczi --- block/io.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/block/io.c b/block/io.c index 7c213ec226a..23abbc52fe0 100644 --- a/block/io.c +++ b/block/io.c @@ -2749,11 +2749,14 @@ void bdrv_drained_begin(BlockDriverState *bs) if (!bs->quiesce_counter++) { aio_disable_external(bdrv_get_aio_context(bs)); } + bdrv_parent_drained_begin(bs); bdrv_drain(bs); } void bdrv_drained_end(BlockDriverState *bs) { + bdrv_parent_drained_end(bs); + assert(bs->quiesce_counter > 0); if (--bs->quiesce_counter > 0) { return; -- 2.39.5