On Wed, 05/20 08:32, Paolo Bonzini wrote: > > > On 20/05/2015 08:16, Fam Zheng wrote: > > > > static void mirror_exit(BlockJob *job, void *opaque) > > @@ -328,6 +330,8 @@ static void mirror_exit(BlockJob *job, void *opaque) > > MirrorExitData *data = opaque; > > AioContext *replace_aio_context = NULL; > > > > + bdrv_op_unblock(s->common.bs, BLOCK_OP_TYPE_DEVICE_IO, data->blocker); > > + error_free(data->blocker); > > if (s->to_replace) { > > replace_aio_context = bdrv_get_aio_context(s->to_replace); > > aio_context_acquire(replace_aio_context); > > Why here and not after the "if (s->should_complete && data->ret == 0) { > ... }"? The commit message says "unblock it after bdrv_swap()." > > This is the only remaining issue.
Ouch, I thought I did that... It absolutely has to go after bdrv_swap(). Fam