9ae3a8
From d432da3600bfb48139ee10373122c250a9f5a003 Mon Sep 17 00:00:00 2001
9ae3a8
From: Fam Zheng <famz@redhat.com>
9ae3a8
Date: Fri, 17 Jan 2014 03:07:59 +0100
9ae3a8
Subject: [PATCH 16/34] block: Add commit_active_start()
9ae3a8
9ae3a8
RH-Author: Fam Zheng <famz@redhat.com>
9ae3a8
Message-id: <1389928083-8921-15-git-send-email-famz@redhat.com>
9ae3a8
Patchwork-id: 56776
9ae3a8
O-Subject: [RHEL-7 qemu-kvm PATCH 14/18] block: Add commit_active_start()
9ae3a8
Bugzilla: 1041301
9ae3a8
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
9ae3a8
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
RH-Acked-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
9ae3a8
commit_active_start is implemented in block/mirror.c, It will create a
9ae3a8
job with "commit" type and designated base in block-commit command. This
9ae3a8
will be used for committing active layer of device.
9ae3a8
9ae3a8
Sync mode is removed from MirrorBlockJob because there's no proper type
9ae3a8
for commit. The used information is is_none_mode.
9ae3a8
9ae3a8
The common part of mirror_start and commit_active_start is moved to
9ae3a8
mirror_start_job().
9ae3a8
9ae3a8
Fix the comment wording for commit_start.
9ae3a8
9ae3a8
Signed-off-by: Fam Zheng <famz@redhat.com>
9ae3a8
Reviewed-by: Kevin Wolf <kwolf@redhat.com>
9ae3a8
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
9ae3a8
(cherry picked from commit 03544a6e9ecc1be115e8a29bd929f83b467d4816)
9ae3a8
Signed-off-by: Fam Zheng <famz@redhat.com>
9ae3a8
---
9ae3a8
 block/mirror.c            | 66 +++++++++++++++++++++++++++++++++++------------
9ae3a8
 include/block/block_int.h | 22 +++++++++++++---
9ae3a8
 2 files changed, 69 insertions(+), 19 deletions(-)
9ae3a8
9ae3a8
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
9ae3a8
---
9ae3a8
 block/mirror.c            |   66 ++++++++++++++++++++++++++++++++++-----------
9ae3a8
 include/block/block_int.h |   22 +++++++++++++--
9ae3a8
 2 files changed, 69 insertions(+), 19 deletions(-)
9ae3a8
9ae3a8
diff --git a/block/mirror.c b/block/mirror.c
9ae3a8
index 8ccde2f..01fe379 100644
9ae3a8
--- a/block/mirror.c
9ae3a8
+++ b/block/mirror.c
9ae3a8
@@ -32,7 +32,7 @@ typedef struct MirrorBlockJob {
9ae3a8
     RateLimit limit;
9ae3a8
     BlockDriverState *target;
9ae3a8
     BlockDriverState *base;
9ae3a8
-    MirrorSyncMode mode;
9ae3a8
+    bool is_none_mode;
9ae3a8
     BlockdevOnError on_source_error, on_target_error;
9ae3a8
     bool synced;
9ae3a8
     bool should_complete;
9ae3a8
@@ -333,7 +333,7 @@ static void coroutine_fn mirror_run(void *opaque)
9ae3a8
     sectors_per_chunk = s->granularity >> BDRV_SECTOR_BITS;
9ae3a8
     mirror_free_init(s);
9ae3a8
 
9ae3a8
-    if (s->mode != MIRROR_SYNC_MODE_NONE) {
9ae3a8
+    if (!s->is_none_mode) {
9ae3a8
         /* First part, loop on the sectors and initialize the dirty bitmap.  */
9ae3a8
         BlockDriverState *base = s->base;
9ae3a8
         for (sector_num = 0; sector_num < end; ) {
9ae3a8
@@ -532,15 +532,26 @@ static const BlockJobDriver mirror_job_driver = {
9ae3a8
     .complete      = mirror_complete,
9ae3a8
 };
9ae3a8
 
9ae3a8
-void mirror_start(BlockDriverState *bs, BlockDriverState *target,
9ae3a8
-                  int64_t speed, int64_t granularity, int64_t buf_size,
9ae3a8
-                  MirrorSyncMode mode, BlockdevOnError on_source_error,
9ae3a8
-                  BlockdevOnError on_target_error,
9ae3a8
-                  BlockDriverCompletionFunc *cb,
9ae3a8
-                  void *opaque, Error **errp)
9ae3a8
+static const BlockJobDriver commit_active_job_driver = {
9ae3a8
+    .instance_size = sizeof(MirrorBlockJob),
9ae3a8
+    .job_type      = BLOCK_JOB_TYPE_COMMIT,
9ae3a8
+    .set_speed     = mirror_set_speed,
9ae3a8
+    .iostatus_reset
9ae3a8
+                   = mirror_iostatus_reset,
9ae3a8
+    .complete      = mirror_complete,
9ae3a8
+};
9ae3a8
+
9ae3a8
+static void mirror_start_job(BlockDriverState *bs, BlockDriverState *target,
9ae3a8
+                            int64_t speed, int64_t granularity,
9ae3a8
+                            int64_t buf_size,
9ae3a8
+                            BlockdevOnError on_source_error,
9ae3a8
+                            BlockdevOnError on_target_error,
9ae3a8
+                            BlockDriverCompletionFunc *cb,
9ae3a8
+                            void *opaque, Error **errp,
9ae3a8
+                            const BlockJobDriver *driver,
9ae3a8
+                            bool is_none_mode, BlockDriverState *base)
9ae3a8
 {
9ae3a8
     MirrorBlockJob *s;
9ae3a8
-    BlockDriverState *base = NULL;
9ae3a8
 
9ae3a8
     if (granularity == 0) {
9ae3a8
         /* Choose the default granularity based on the target file's cluster
9ae3a8
@@ -563,13 +574,8 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target,
9ae3a8
         return;
9ae3a8
     }
9ae3a8
 
9ae3a8
-    if (mode == MIRROR_SYNC_MODE_TOP) {
9ae3a8
-        base = bs->backing_hd;
9ae3a8
-    } else {
9ae3a8
-        base = NULL;
9ae3a8
-    }
9ae3a8
 
9ae3a8
-    s = block_job_create(&mirror_job_driver, bs, speed, cb, opaque, errp);
9ae3a8
+    s = block_job_create(driver, bs, speed, cb, opaque, errp);
9ae3a8
     if (!s) {
9ae3a8
         return;
9ae3a8
     }
9ae3a8
@@ -577,7 +583,7 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target,
9ae3a8
     s->on_source_error = on_source_error;
9ae3a8
     s->on_target_error = on_target_error;
9ae3a8
     s->target = target;
9ae3a8
-    s->mode = mode;
9ae3a8
+    s->is_none_mode = is_none_mode;
9ae3a8
     s->base = base;
9ae3a8
     s->granularity = granularity;
9ae3a8
     s->buf_size = MAX(buf_size, granularity);
9ae3a8
@@ -590,3 +596,31 @@ void mirror_start(BlockDriverState *bs, BlockDriverState *target,
9ae3a8
     trace_mirror_start(bs, s, s->common.co, opaque);
9ae3a8
     qemu_coroutine_enter(s->common.co, s);
9ae3a8
 }
9ae3a8
+
9ae3a8
+void mirror_start(BlockDriverState *bs, BlockDriverState *target,
9ae3a8
+                  int64_t speed, int64_t granularity, int64_t buf_size,
9ae3a8
+                  MirrorSyncMode mode, BlockdevOnError on_source_error,
9ae3a8
+                  BlockdevOnError on_target_error,
9ae3a8
+                  BlockDriverCompletionFunc *cb,
9ae3a8
+                  void *opaque, Error **errp)
9ae3a8
+{
9ae3a8
+    bool is_none_mode;
9ae3a8
+    BlockDriverState *base;
9ae3a8
+
9ae3a8
+    is_none_mode = mode == MIRROR_SYNC_MODE_NONE;
9ae3a8
+    base = mode == MIRROR_SYNC_MODE_TOP ? bs->backing_hd : NULL;
9ae3a8
+    mirror_start_job(bs, target, speed, granularity, buf_size,
9ae3a8
+                     on_source_error, on_target_error, cb, opaque, errp,
9ae3a8
+                     &mirror_job_driver, is_none_mode, base);
9ae3a8
+}
9ae3a8
+
9ae3a8
+void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
9ae3a8
+                         int64_t speed,
9ae3a8
+                         BlockdevOnError on_error,
9ae3a8
+                         BlockDriverCompletionFunc *cb,
9ae3a8
+                         void *opaque, Error **errp)
9ae3a8
+{
9ae3a8
+    mirror_start_job(bs, base, speed, 0, 0,
9ae3a8
+                     on_error, on_error, cb, opaque, errp,
9ae3a8
+                     &commit_active_job_driver, false, base);
9ae3a8
+}
9ae3a8
diff --git a/include/block/block_int.h b/include/block/block_int.h
9ae3a8
index fbfdab7..c8f30fd 100644
9ae3a8
--- a/include/block/block_int.h
9ae3a8
+++ b/include/block/block_int.h
9ae3a8
@@ -374,8 +374,9 @@ void stream_start(BlockDriverState *bs, BlockDriverState *base,
9ae3a8
 
9ae3a8
 /**
9ae3a8
  * commit_start:
9ae3a8
- * @bs: Top Block device
9ae3a8
- * @base: Block device that will be written into, and become the new top
9ae3a8
+ * @bs: Active block device.
9ae3a8
+ * @top: Top block device to be committed.
9ae3a8
+ * @base: Block device that will be written into, and become the new top.
9ae3a8
  * @speed: The maximum speed, in bytes per second, or 0 for unlimited.
9ae3a8
  * @on_error: The action to take upon error.
9ae3a8
  * @cb: Completion function for the job.
9ae3a8
@@ -387,7 +388,22 @@ void commit_start(BlockDriverState *bs, BlockDriverState *base,
9ae3a8
                  BlockDriverState *top, int64_t speed,
9ae3a8
                  BlockdevOnError on_error, BlockDriverCompletionFunc *cb,
9ae3a8
                  void *opaque, Error **errp);
9ae3a8
-
9ae3a8
+/**
9ae3a8
+ * commit_active_start:
9ae3a8
+ * @bs: Active block device to be committed.
9ae3a8
+ * @base: Block device that will be written into, and become the new top.
9ae3a8
+ * @speed: The maximum speed, in bytes per second, or 0 for unlimited.
9ae3a8
+ * @on_error: The action to take upon error.
9ae3a8
+ * @cb: Completion function for the job.
9ae3a8
+ * @opaque: Opaque pointer value passed to @cb.
9ae3a8
+ * @errp: Error object.
9ae3a8
+ *
9ae3a8
+ */
9ae3a8
+void commit_active_start(BlockDriverState *bs, BlockDriverState *base,
9ae3a8
+                         int64_t speed,
9ae3a8
+                         BlockdevOnError on_error,
9ae3a8
+                         BlockDriverCompletionFunc *cb,
9ae3a8
+                         void *opaque, Error **errp);
9ae3a8
 /*
9ae3a8
  * mirror_start:
9ae3a8
  * @bs: Block device to operate on.
9ae3a8
-- 
9ae3a8
1.7.1
9ae3a8