qemu-block
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-block] [PATCH 06/17] mirror: Create mirror_co_perform()


From: Max Reitz
Subject: [Qemu-block] [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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]