Blame SOURCES/kvm-jobs-change-start-callback-to-run-callback.patch

1bdc94
From 751387e28f5006dd063010ff0b0912ff9b44c2fe Mon Sep 17 00:00:00 2001
1bdc94
From: John Snow <jsnow@redhat.com>
1bdc94
Date: Mon, 10 Sep 2018 18:17:39 +0200
1bdc94
Subject: [PATCH 01/25] jobs: change start callback to run callback
1bdc94
1bdc94
RH-Author: John Snow <jsnow@redhat.com>
1bdc94
Message-id: <20180910181803.11781-2-jsnow@redhat.com>
1bdc94
Patchwork-id: 82102
1bdc94
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 01/25] jobs: change start callback to run callback
1bdc94
Bugzilla: 1626061
1bdc94
RH-Acked-by: Max Reitz <mreitz@redhat.com>
1bdc94
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
1bdc94
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
1bdc94
1bdc94
Presently we codify the entry point for a job as the "start" callback,
1bdc94
but a more apt name would be "run" to clarify the idea that when this
1bdc94
function returns we consider the job to have "finished," except for
1bdc94
any cleanup which occurs in separate callbacks later.
1bdc94
1bdc94
As part of this clarification, change the signature to include an error
1bdc94
object and a return code. The error ptr is not yet used, and the return
1bdc94
code while captured, will be overwritten by actions in the job_completed
1bdc94
function.
1bdc94
1bdc94
Signed-off-by: John Snow <jsnow@redhat.com>
1bdc94
Reviewed-by: Max Reitz <mreitz@redhat.com>
1bdc94
Message-id: 20180830015734.19765-2-jsnow@redhat.com
1bdc94
Reviewed-by: Jeff Cody <jcody@redhat.com>
1bdc94
Signed-off-by: Max Reitz <mreitz@redhat.com>
1bdc94
(cherry picked from commit f67432a2019caf05b57a146bf45c1024a5cb608e)
1bdc94
Signed-off-by: John Snow <jsnow@redhat.com>
1bdc94
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
1bdc94
---
1bdc94
 block/backup.c            |  7 ++++---
1bdc94
 block/commit.c            |  7 ++++---
1bdc94
 block/create.c            |  8 +++++---
1bdc94
 block/mirror.c            | 10 ++++++----
1bdc94
 block/stream.c            |  7 ++++---
1bdc94
 include/qemu/job.h        |  2 +-
1bdc94
 job.c                     |  6 +++---
1bdc94
 tests/test-bdrv-drain.c   |  7 ++++---
1bdc94
 tests/test-blockjob-txn.c | 16 ++++++++--------
1bdc94
 tests/test-blockjob.c     |  7 ++++---
1bdc94
 10 files changed, 43 insertions(+), 34 deletions(-)
1bdc94
1bdc94
diff --git a/block/backup.c b/block/backup.c
1bdc94
index 4ba1a6a..a142518 100644
1bdc94
--- a/block/backup.c
1bdc94
+++ b/block/backup.c
1bdc94
@@ -480,9 +480,9 @@ static void backup_incremental_init_copy_bitmap(BackupBlockJob *job)
1bdc94
     bdrv_dirty_iter_free(dbi);
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn backup_run(void *opaque)
1bdc94
+static int coroutine_fn backup_run(Job *opaque_job, Error **errp)
1bdc94
 {
1bdc94
-    BackupBlockJob *job = opaque;
1bdc94
+    BackupBlockJob *job = container_of(opaque_job, BackupBlockJob, common.job);
1bdc94
     BackupCompleteData *data;
1bdc94
     BlockDriverState *bs = blk_bs(job->common.blk);
1bdc94
     int64_t offset, nb_clusters;
1bdc94
@@ -587,6 +587,7 @@ static void coroutine_fn backup_run(void *opaque)
1bdc94
     data = g_malloc(sizeof(*data));
1bdc94
     data->ret = ret;
1bdc94
     job_defer_to_main_loop(&job->common.job, backup_complete, data);
1bdc94
+    return ret;
1bdc94
 }
1bdc94
 
1bdc94
 static const BlockJobDriver backup_job_driver = {
1bdc94
@@ -596,7 +597,7 @@ static const BlockJobDriver backup_job_driver = {
1bdc94
         .free                   = block_job_free,
1bdc94
         .user_resume            = block_job_user_resume,
1bdc94
         .drain                  = block_job_drain,
1bdc94
-        .start                  = backup_run,
1bdc94
+        .run                    = backup_run,
1bdc94
         .commit                 = backup_commit,
1bdc94
         .abort                  = backup_abort,
1bdc94
         .clean                  = backup_clean,
1bdc94
diff --git a/block/commit.c b/block/commit.c
1bdc94
index e1814d9..905a1c5 100644
1bdc94
--- a/block/commit.c
1bdc94
+++ b/block/commit.c
1bdc94
@@ -134,9 +134,9 @@ static void commit_complete(Job *job, void *opaque)
1bdc94
     bdrv_unref(top);
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn commit_run(void *opaque)
1bdc94
+static int coroutine_fn commit_run(Job *job, Error **errp)
1bdc94
 {
1bdc94
-    CommitBlockJob *s = opaque;
1bdc94
+    CommitBlockJob *s = container_of(job, CommitBlockJob, common.job);
1bdc94
     CommitCompleteData *data;
1bdc94
     int64_t offset;
1bdc94
     uint64_t delay_ns = 0;
1bdc94
@@ -213,6 +213,7 @@ out:
1bdc94
     data = g_malloc(sizeof(*data));
1bdc94
     data->ret = ret;
1bdc94
     job_defer_to_main_loop(&s->common.job, commit_complete, data);
1bdc94
+    return ret;
1bdc94
 }
1bdc94
 
1bdc94
 static const BlockJobDriver commit_job_driver = {
1bdc94
@@ -222,7 +223,7 @@ static const BlockJobDriver commit_job_driver = {
1bdc94
         .free          = block_job_free,
1bdc94
         .user_resume   = block_job_user_resume,
1bdc94
         .drain         = block_job_drain,
1bdc94
-        .start         = commit_run,
1bdc94
+        .run           = commit_run,
1bdc94
     },
1bdc94
 };
1bdc94
 
1bdc94
diff --git a/block/create.c b/block/create.c
1bdc94
index 915cd41..04733c3 100644
1bdc94
--- a/block/create.c
1bdc94
+++ b/block/create.c
1bdc94
@@ -45,9 +45,9 @@ static void blockdev_create_complete(Job *job, void *opaque)
1bdc94
     job_completed(job, s->ret, s->err);
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn blockdev_create_run(void *opaque)
1bdc94
+static int coroutine_fn blockdev_create_run(Job *job, Error **errp)
1bdc94
 {
1bdc94
-    BlockdevCreateJob *s = opaque;
1bdc94
+    BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common);
1bdc94
 
1bdc94
     job_progress_set_remaining(&s->common, 1);
1bdc94
     s->ret = s->drv->bdrv_co_create(s->opts, &s->err);
1bdc94
@@ -55,12 +55,14 @@ static void coroutine_fn blockdev_create_run(void *opaque)
1bdc94
 
1bdc94
     qapi_free_BlockdevCreateOptions(s->opts);
1bdc94
     job_defer_to_main_loop(&s->common, blockdev_create_complete, NULL);
1bdc94
+
1bdc94
+    return s->ret;
1bdc94
 }
1bdc94
 
1bdc94
 static const JobDriver blockdev_create_job_driver = {
1bdc94
     .instance_size = sizeof(BlockdevCreateJob),
1bdc94
     .job_type      = JOB_TYPE_CREATE,
1bdc94
-    .start         = blockdev_create_run,
1bdc94
+    .run           = blockdev_create_run,
1bdc94
 };
1bdc94
 
1bdc94
 void qmp_blockdev_create(const char *job_id, BlockdevCreateOptions *options,
1bdc94
diff --git a/block/mirror.c b/block/mirror.c
1bdc94
index 65cf43d..03b326d 100644
1bdc94
--- a/block/mirror.c
1bdc94
+++ b/block/mirror.c
1bdc94
@@ -683,9 +683,9 @@ static int mirror_flush(MirrorBlockJob *s)
1bdc94
     return ret;
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn mirror_run(void *opaque)
1bdc94
+static int coroutine_fn mirror_run(Job *job, Error **errp)
1bdc94
 {
1bdc94
-    MirrorBlockJob *s = opaque;
1bdc94
+    MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
1bdc94
     MirrorExitData *data;
1bdc94
     BlockDriverState *bs = s->source;
1bdc94
     BlockDriverState *target_bs = blk_bs(s->target);
1bdc94
@@ -902,7 +902,9 @@ immediate_exit:
1bdc94
     if (need_drain) {
1bdc94
         bdrv_drained_begin(bs);
1bdc94
     }
1bdc94
+
1bdc94
     job_defer_to_main_loop(&s->common.job, mirror_exit, data);
1bdc94
+    return ret;
1bdc94
 }
1bdc94
 
1bdc94
 static void mirror_complete(Job *job, Error **errp)
1bdc94
@@ -993,7 +995,7 @@ static const BlockJobDriver mirror_job_driver = {
1bdc94
         .free                   = block_job_free,
1bdc94
         .user_resume            = block_job_user_resume,
1bdc94
         .drain                  = block_job_drain,
1bdc94
-        .start                  = mirror_run,
1bdc94
+        .run                    = mirror_run,
1bdc94
         .pause                  = mirror_pause,
1bdc94
         .complete               = mirror_complete,
1bdc94
     },
1bdc94
@@ -1008,7 +1010,7 @@ static const BlockJobDriver commit_active_job_driver = {
1bdc94
         .free                   = block_job_free,
1bdc94
         .user_resume            = block_job_user_resume,
1bdc94
         .drain                  = block_job_drain,
1bdc94
-        .start                  = mirror_run,
1bdc94
+        .run                    = mirror_run,
1bdc94
         .pause                  = mirror_pause,
1bdc94
         .complete               = mirror_complete,
1bdc94
     },
1bdc94
diff --git a/block/stream.c b/block/stream.c
1bdc94
index 9264b68..b4b987d 100644
1bdc94
--- a/block/stream.c
1bdc94
+++ b/block/stream.c
1bdc94
@@ -97,9 +97,9 @@ out:
1bdc94
     g_free(data);
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn stream_run(void *opaque)
1bdc94
+static int coroutine_fn stream_run(Job *job, Error **errp)
1bdc94
 {
1bdc94
-    StreamBlockJob *s = opaque;
1bdc94
+    StreamBlockJob *s = container_of(job, StreamBlockJob, common.job);
1bdc94
     StreamCompleteData *data;
1bdc94
     BlockBackend *blk = s->common.blk;
1bdc94
     BlockDriverState *bs = blk_bs(blk);
1bdc94
@@ -206,6 +206,7 @@ out:
1bdc94
     data = g_malloc(sizeof(*data));
1bdc94
     data->ret = ret;
1bdc94
     job_defer_to_main_loop(&s->common.job, stream_complete, data);
1bdc94
+    return ret;
1bdc94
 }
1bdc94
 
1bdc94
 static const BlockJobDriver stream_job_driver = {
1bdc94
@@ -213,7 +214,7 @@ static const BlockJobDriver stream_job_driver = {
1bdc94
         .instance_size = sizeof(StreamBlockJob),
1bdc94
         .job_type      = JOB_TYPE_STREAM,
1bdc94
         .free          = block_job_free,
1bdc94
-        .start         = stream_run,
1bdc94
+        .run           = stream_run,
1bdc94
         .user_resume   = block_job_user_resume,
1bdc94
         .drain         = block_job_drain,
1bdc94
     },
1bdc94
diff --git a/include/qemu/job.h b/include/qemu/job.h
1bdc94
index 1d82053..e81cc34 100644
1bdc94
--- a/include/qemu/job.h
1bdc94
+++ b/include/qemu/job.h
1bdc94
@@ -169,7 +169,7 @@ struct JobDriver {
1bdc94
     JobType job_type;
1bdc94
 
1bdc94
     /** Mandatory: Entrypoint for the Coroutine. */
1bdc94
-    CoroutineEntry *start;
1bdc94
+    int coroutine_fn (*run)(Job *job, Error **errp);
1bdc94
 
1bdc94
     /**
1bdc94
      * If the callback is not NULL, it will be invoked when the job transitions
1bdc94
diff --git a/job.c b/job.c
1bdc94
index 95dc998..0d07700 100644
1bdc94
--- a/job.c
1bdc94
+++ b/job.c
1bdc94
@@ -539,16 +539,16 @@ static void coroutine_fn job_co_entry(void *opaque)
1bdc94
 {
1bdc94
     Job *job = opaque;
1bdc94
 
1bdc94
-    assert(job && job->driver && job->driver->start);
1bdc94
+    assert(job && job->driver && job->driver->run);
1bdc94
     job_pause_point(job);
1bdc94
-    job->driver->start(job);
1bdc94
+    job->ret = job->driver->run(job, NULL);
1bdc94
 }
1bdc94
 
1bdc94
 
1bdc94
 void job_start(Job *job)
1bdc94
 {
1bdc94
     assert(job && !job_started(job) && job->paused &&
1bdc94
-           job->driver && job->driver->start);
1bdc94
+           job->driver && job->driver->run);
1bdc94
     job->co = qemu_coroutine_create(job_co_entry, job);
1bdc94
     job->pause_count--;
1bdc94
     job->busy = true;
1bdc94
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
1bdc94
index a11c4cf..798445a 100644
1bdc94
--- a/tests/test-bdrv-drain.c
1bdc94
+++ b/tests/test-bdrv-drain.c
1bdc94
@@ -501,9 +501,9 @@ static void test_job_completed(Job *job, void *opaque)
1bdc94
     job_completed(job, 0, NULL);
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn test_job_start(void *opaque)
1bdc94
+static int coroutine_fn test_job_run(Job *job, Error **errp)
1bdc94
 {
1bdc94
-    TestBlockJob *s = opaque;
1bdc94
+    TestBlockJob *s = container_of(job, TestBlockJob, common.job);
1bdc94
 
1bdc94
     job_transition_to_ready(&s->common.job);
1bdc94
     while (!s->should_complete) {
1bdc94
@@ -511,6 +511,7 @@ static void coroutine_fn test_job_start(void *opaque)
1bdc94
     }
1bdc94
 
1bdc94
     job_defer_to_main_loop(&s->common.job, test_job_completed, NULL);
1bdc94
+    return 0;
1bdc94
 }
1bdc94
 
1bdc94
 static void test_job_complete(Job *job, Error **errp)
1bdc94
@@ -525,7 +526,7 @@ BlockJobDriver test_job_driver = {
1bdc94
         .free           = block_job_free,
1bdc94
         .user_resume    = block_job_user_resume,
1bdc94
         .drain          = block_job_drain,
1bdc94
-        .start          = test_job_start,
1bdc94
+        .run            = test_job_run,
1bdc94
         .complete       = test_job_complete,
1bdc94
     },
1bdc94
 };
1bdc94
diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c
1bdc94
index 58d9b87..3194924 100644
1bdc94
--- a/tests/test-blockjob-txn.c
1bdc94
+++ b/tests/test-blockjob-txn.c
1bdc94
@@ -38,25 +38,25 @@ static void test_block_job_complete(Job *job, void *opaque)
1bdc94
     bdrv_unref(bs);
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn test_block_job_run(void *opaque)
1bdc94
+static int coroutine_fn test_block_job_run(Job *job, Error **errp)
1bdc94
 {
1bdc94
-    TestBlockJob *s = opaque;
1bdc94
-    BlockJob *job = &s->common;
1bdc94
+    TestBlockJob *s = container_of(job, TestBlockJob, common.job);
1bdc94
 
1bdc94
     while (s->iterations--) {
1bdc94
         if (s->use_timer) {
1bdc94
-            job_sleep_ns(&job->job, 0);
1bdc94
+            job_sleep_ns(job, 0);
1bdc94
         } else {
1bdc94
-            job_yield(&job->job);
1bdc94
+            job_yield(job);
1bdc94
         }
1bdc94
 
1bdc94
-        if (job_is_cancelled(&job->job)) {
1bdc94
+        if (job_is_cancelled(job)) {
1bdc94
             break;
1bdc94
         }
1bdc94
     }
1bdc94
 
1bdc94
-    job_defer_to_main_loop(&job->job, test_block_job_complete,
1bdc94
+    job_defer_to_main_loop(job, test_block_job_complete,
1bdc94
                            (void *)(intptr_t)s->rc);
1bdc94
+    return s->rc;
1bdc94
 }
1bdc94
 
1bdc94
 typedef struct {
1bdc94
@@ -80,7 +80,7 @@ static const BlockJobDriver test_block_job_driver = {
1bdc94
         .free          = block_job_free,
1bdc94
         .user_resume   = block_job_user_resume,
1bdc94
         .drain         = block_job_drain,
1bdc94
-        .start         = test_block_job_run,
1bdc94
+        .run           = test_block_job_run,
1bdc94
     },
1bdc94
 };
1bdc94
 
1bdc94
diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c
1bdc94
index cb42f06..b0462bf 100644
1bdc94
--- a/tests/test-blockjob.c
1bdc94
+++ b/tests/test-blockjob.c
1bdc94
@@ -176,9 +176,9 @@ static void cancel_job_complete(Job *job, Error **errp)
1bdc94
     s->should_complete = true;
1bdc94
 }
1bdc94
 
1bdc94
-static void coroutine_fn cancel_job_start(void *opaque)
1bdc94
+static int coroutine_fn cancel_job_run(Job *job, Error **errp)
1bdc94
 {
1bdc94
-    CancelJob *s = opaque;
1bdc94
+    CancelJob *s = container_of(job, CancelJob, common.job);
1bdc94
 
1bdc94
     while (!s->should_complete) {
1bdc94
         if (job_is_cancelled(&s->common.job)) {
1bdc94
@@ -194,6 +194,7 @@ static void coroutine_fn cancel_job_start(void *opaque)
1bdc94
 
1bdc94
  defer:
1bdc94
     job_defer_to_main_loop(&s->common.job, cancel_job_completed, s);
1bdc94
+    return 0;
1bdc94
 }
1bdc94
 
1bdc94
 static const BlockJobDriver test_cancel_driver = {
1bdc94
@@ -202,7 +203,7 @@ static const BlockJobDriver test_cancel_driver = {
1bdc94
         .free          = block_job_free,
1bdc94
         .user_resume   = block_job_user_resume,
1bdc94
         .drain         = block_job_drain,
1bdc94
-        .start         = cancel_job_start,
1bdc94
+        .run           = cancel_job_run,
1bdc94
         .complete      = cancel_job_complete,
1bdc94
     },
1bdc94
 };
1bdc94
-- 
1bdc94
1.8.3.1
1bdc94