[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 06/17] mirror: Create mirror_co_perform()
From: |
Max Reitz |
Subject: |
[Qemu-devel] [PATCH 06/17] mirror: Create mirror_co_perform() |
Date: |
Mon, 13 Aug 2018 04:19:55 +0200 |
While very simple now, this function will be fattened in future patches.
Signed-off-by: Max Reitz <address@hidden>
---
block/mirror.c | 48 +++++++++++++++++++++++++++++-------------------
1 file changed, 29 insertions(+), 19 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index f05404e557..89452ad371 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -85,8 +85,16 @@ typedef struct MirrorBDSOpaque {
MirrorBlockJob *job;
} MirrorBDSOpaque;
+typedef enum MirrorMethod {
+ MIRROR_METHOD_COPY,
+ MIRROR_METHOD_ZERO,
+ MIRROR_METHOD_DISCARD,
+} MirrorMethod;
+
struct MirrorOp {
MirrorBlockJob *s;
+ MirrorMethod mirror_method;
+
QEMUIOVector qiov;
int64_t offset;
int64_t bytes;
@@ -98,12 +106,6 @@ struct MirrorOp {
QTAILQ_ENTRY(MirrorOp) next;
};
-typedef enum MirrorMethod {
- MIRROR_METHOD_COPY,
- MIRROR_METHOD_ZERO,
- MIRROR_METHOD_DISCARD,
-} MirrorMethod;
-
static BlockErrorAction mirror_error_action(MirrorBlockJob *s, bool read,
int error)
{
@@ -387,6 +389,25 @@ static void coroutine_fn mirror_co_discard(void *opaque)
mirror_write_complete(op, ret);
}
+static void coroutine_fn mirror_co_perform(void *opaque)
+{
+ MirrorOp *op = opaque;
+
+ switch (op->mirror_method) {
+ case MIRROR_METHOD_COPY:
+ mirror_co_read(opaque);
+ return;
+ case MIRROR_METHOD_ZERO:
+ mirror_co_zero(opaque);
+ return;
+ case MIRROR_METHOD_DISCARD:
+ mirror_co_discard(opaque);
+ return;
+ default:
+ abort();
+ }
+}
+
/* If mirror_method == MIRROR_METHOD_COPY, *offset and *bytes will be
* aligned as necessary */
static void mirror_perform(MirrorBlockJob *s, int64_t *offset, int64_t *bytes,
@@ -402,24 +423,13 @@ static void mirror_perform(MirrorBlockJob *s, int64_t
*offset, int64_t *bytes,
op = g_new(MirrorOp, 1);
*op = (MirrorOp){
.s = s,
+ .mirror_method = mirror_method,
.offset = *offset,
.bytes = *bytes,
};
qemu_co_queue_init(&op->waiting_requests);
- switch (mirror_method) {
- case MIRROR_METHOD_COPY:
- co = qemu_coroutine_create(mirror_co_read, op);
- break;
- case MIRROR_METHOD_ZERO:
- co = qemu_coroutine_create(mirror_co_zero, op);
- break;
- case MIRROR_METHOD_DISCARD:
- co = qemu_coroutine_create(mirror_co_discard, op);
- break;
- default:
- abort();
- }
+ co = qemu_coroutine_create(mirror_co_perform, op);
QTAILQ_INSERT_TAIL(&s->ops_in_flight, op, next);
qemu_coroutine_enter(co);
--
2.17.1
- [Qemu-devel] [PATCH 00/17] mirror: Mainly coroutine refinements, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 01/17] iotests: Try reading while mirroring in 156, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 02/17] mirror: Make wait_for_any_operation() coroutine_fn, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 03/17] mirror: Pull *_align_for_copy() from *_co_read(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 04/17] mirror: Remove bytes_handled, part 1, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 06/17] mirror: Create mirror_co_perform(),
Max Reitz <=
- [Qemu-devel] [PATCH 05/17] mirror: Remove bytes_handled, part 2, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 07/17] mirror: Make mirror_co_zero() nicer, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 08/17] mirror: Make mirror_co_discard() nicer, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 09/17] mirror: Lock AioContext in mirror_co_perform(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 10/17] mirror: Create mirror_co_alloc_qiov(), Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 11/17] mirror: Inline mirror_write_complete(), part 1, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 12/17] mirror: Put QIOV locally into mirror_co_read, Max Reitz, 2018/08/12
- [Qemu-devel] [PATCH 13/17] mirror: Linearize mirror_co_read(), Max Reitz, 2018/08/12