[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform(
From: |
Max Reitz |
Subject: |
[Qemu-block] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform() |
Date: |
Mon, 13 Aug 2018 04:19:58 +0200 |
Signed-off-by: Max Reitz <address@hidden>
---
block/mirror.c | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index 85b08086cc..6330269156 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -196,7 +196,6 @@ static void coroutine_fn mirror_write_complete(MirrorOp
*op, int ret)
{
MirrorBlockJob *s = op->s;
- aio_context_acquire(blk_get_aio_context(s->common.blk));
if (ret < 0) {
BlockErrorAction action;
@@ -207,14 +206,12 @@ static void coroutine_fn mirror_write_complete(MirrorOp
*op, int ret)
}
}
mirror_iteration_done(op, ret);
- aio_context_release(blk_get_aio_context(s->common.blk));
}
static void coroutine_fn mirror_read_complete(MirrorOp *op, int ret)
{
MirrorBlockJob *s = op->s;
- aio_context_acquire(blk_get_aio_context(s->common.blk));
if (ret < 0) {
BlockErrorAction action;
@@ -230,7 +227,6 @@ static void coroutine_fn mirror_read_complete(MirrorOp *op,
int ret)
op->qiov.size, &op->qiov, 0);
mirror_write_complete(op, ret);
}
- aio_context_release(blk_get_aio_context(s->common.blk));
}
/* Clip bytes relative to offset to not exceed end-of-file */
@@ -387,12 +383,16 @@ static void coroutine_fn mirror_co_perform(void *opaque)
{
MirrorOp *op = opaque;
MirrorBlockJob *s = op->s;
+ AioContext *aio_context;
int ret;
+ aio_context = blk_get_aio_context(s->common.blk);
+ aio_context_acquire(aio_context);
+
switch (op->mirror_method) {
case MIRROR_METHOD_COPY:
mirror_co_read(opaque);
- return;
+ goto done;
case MIRROR_METHOD_ZERO:
ret = mirror_co_zero(s, op->offset, op->bytes);
break;
@@ -404,6 +404,9 @@ static void coroutine_fn mirror_co_perform(void *opaque)
}
mirror_write_complete(op, ret);
+
+done:
+ aio_context_release(aio_context);
}
/* If mirror_method == MIRROR_METHOD_COPY, *offset and *bytes will be
--
2.17.1
- Re: [Qemu-block] [Qemu-devel] [PATCH 02/17] mirror: Make wait_for_any_operation() coroutine_fn, (continued)
- [Qemu-block] [PATCH 03/17] mirror: Pull *_align_for_copy() from *_co_read(), Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 04/17] mirror: Remove bytes_handled, part 1, Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 05/17] mirror: Remove bytes_handled, part 2, Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 06/17] mirror: Create mirror_co_perform(), Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 07/17] mirror: Make mirror_co_zero() nicer, Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 08/17] mirror: Make mirror_co_discard() nicer, Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform(),
Max Reitz <=
- [Qemu-block] [PATCH 10/17] mirror: Create mirror_co_alloc_qiov(), Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 11/17] mirror: Inline mirror_write_complete(), part 1, Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 12/17] mirror: Put QIOV locally into mirror_co_read, Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 13/17] mirror: Linearize mirror_co_read(), Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 14/17] mirror: Inline mirror_iteration_done(), Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 15/17] mirror: Release AioCtx before queue_restart_all(), Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 16/17] mirror: Support COR with write-blocking, Max Reitz, 2018/08/12
- [Qemu-block] [PATCH 17/17] iotests: Add test for active mirror with COR, Max Reitz, 2018/08/12