return;
}
+ /* Stop things in parent-to-child order */
if (atomic_fetch_inc(&bs->quiesce_counter) == 0) {
aio_disable_external(bdrv_get_aio_context(bs));
bdrv_parent_drained_begin(bs);
return;
}
- bdrv_parent_drained_end(bs);
+ /* Re-enable things in child-to-parent order */
bdrv_drain_invoke(bs, false);
+ bdrv_parent_drained_end(bs);
aio_enable_external(bdrv_get_aio_context(bs));
}
for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
AioContext *aio_context = bdrv_get_aio_context(bs);
+ /* Stop things in parent-to-child order */
aio_context_acquire(aio_context);
- bdrv_parent_drained_begin(bs);
aio_disable_external(aio_context);
+ bdrv_parent_drained_begin(bs);
bdrv_drain_invoke(bs, true);
aio_context_release(aio_context);
for (bs = bdrv_first(&it); bs; bs = bdrv_next(&it)) {
AioContext *aio_context = bdrv_get_aio_context(bs);
+ /* Re-enable things in child-to-parent order */
aio_context_acquire(aio_context);
- aio_enable_external(aio_context);
- bdrv_parent_drained_end(bs);
bdrv_drain_invoke(bs, false);
+ bdrv_parent_drained_end(bs);
+ aio_enable_external(aio_context);
aio_context_release(aio_context);
}