Currently, the mirror block job only knows passive operations. But once we introduce active writes, we need to distinguish between the two; for example, mirror_wait_for_free_in_flight_slot() should wait for a passive operation because active writes will not use the same in-flight slots.
Signed-off-by: Max Reitz <mre...@redhat.com> --- block/mirror.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/block/mirror.c b/block/mirror.c index 2363e79563..bb46f3c4e9 100644 --- a/block/mirror.c +++ b/block/mirror.c @@ -89,6 +89,7 @@ struct MirrorOp { int64_t *bytes_handled; bool is_pseudo_op; + bool is_active_write; CoQueue waiting_requests; QTAILQ_ENTRY(MirrorOp) next; @@ -281,8 +282,10 @@ static inline void mirror_wait_for_free_in_flight_slot(MirrorBlockJob *s) * some other operation to start, which may in fact be the * caller of this function. Since there is only one pseudo op * at any given time, we will always find some real operation - * to wait on. */ - if (!op->is_pseudo_op) { + * to wait on. + * Also, only non-active operations use up in-flight slots, so + * we can ignore active operations. */ + if (!op->is_pseudo_op && !op->is_active_write) { qemu_co_queue_wait(&op->waiting_requests, NULL); return; } -- 2.14.3