On 05/12/2017 15:54, Kevin Wolf wrote: > } > > + bdrv_drain_invoke(bs, true); > bdrv_drain_recurse(bs, true); > } > > @@ -294,6 +298,7 @@ void bdrv_drained_end(BlockDriverState *bs) > } > > bdrv_parent_drained_end(bs); > + bdrv_drain_invoke(bs, false); > bdrv_drain_recurse(bs, false); > aio_enable_external(bdrv_get_aio_context(bs));
I think invoke should be done after recurse from bdrv_drain*end. In the end aio_enable_external is a special kind of drain_end callback, so bdrv_drain_invoke should go together with it. Thanks, Paolo