@@ -364,17 +364,14 @@ static void coroutine_fn mirror_co_read(void *opaque)
mirror_read_complete(op, ret);
}
-static void coroutine_fn mirror_co_zero(void *opaque)
+static int coroutine_fn mirror_co_zero(MirrorBlockJob *s,
+ int64_t offset, int64_t bytes)
{
- MirrorOp *op = opaque;
- int ret;
-
- op->s->in_flight++;
- op->s->bytes_in_flight += op->bytes;
+ s->in_flight++;
+ s->bytes_in_flight += bytes;
- ret = blk_co_pwrite_zeroes(op->s->target, op->offset, op->bytes,
- op->s->unmap ? BDRV_REQ_MAY_UNMAP : 0);
- mirror_write_complete(op, ret);
+ return blk_co_pwrite_zeroes(s->target, offset, bytes,
+ s->unmap ? BDRV_REQ_MAY_UNMAP : 0);
}
static void coroutine_fn mirror_co_discard(void *opaque)
@@ -392,20 +389,24 @@ static void coroutine_fn mirror_co_discard(void *opaque)
static void coroutine_fn mirror_co_perform(void *opaque)
{
MirrorOp *op = opaque;
+ MirrorBlockJob *s = op->s;
+ int ret;
switch (op->mirror_method) {
case MIRROR_METHOD_COPY:
mirror_co_read(opaque);
return;
case MIRROR_METHOD_ZERO:
- mirror_co_zero(opaque);
- return;
+ ret = mirror_co_zero(s, op->offset, op->bytes);
+ break;
case MIRROR_METHOD_DISCARD:
mirror_co_discard(opaque);
return;
default:
abort();
}
+
+ mirror_write_complete(op, ret);
}
/* If mirror_method == MIRROR_METHOD_COPY, *offset and *bytes will be
Signed-off-by: Max Reitz <mreitz@redhat.com> --- block/mirror.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)