Blame SOURCES/kvm-jobs-canonize-Error-object.patch

357786
From d384736e7c77d64142f33fabc0aa50878d8f252e Mon Sep 17 00:00:00 2001
357786
From: John Snow <jsnow@redhat.com>
357786
Date: Mon, 10 Sep 2018 18:17:40 +0200
357786
Subject: [PATCH 02/25] jobs: canonize Error object
357786
357786
RH-Author: John Snow <jsnow@redhat.com>
357786
Message-id: <20180910181803.11781-3-jsnow@redhat.com>
357786
Patchwork-id: 82085
357786
O-Subject: [RHEL-7.6 qemu-kvm-rhev PATCH 02/25] jobs: canonize Error object
357786
Bugzilla: 1626061
357786
RH-Acked-by: Max Reitz <mreitz@redhat.com>
357786
RH-Acked-by: Jeffrey Cody <jcody@redhat.com>
357786
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
357786
357786
Jobs presently use both an Error object in the case of the create job,
357786
and char strings in the case of generic errors elsewhere.
357786
357786
Unify the two paths as just j->err, and remove the extra argument from
357786
job_completed. The integer error code for job_completed is kept for now,
357786
to be removed shortly in a separate patch.
357786
357786
Signed-off-by: John Snow <jsnow@redhat.com>
357786
Message-id: 20180830015734.19765-3-jsnow@redhat.com
357786
[mreitz: Dropped a superfluous g_strdup()]
357786
Reviewed-by: Eric Blake <eblake@redhat.com>
357786
Signed-off-by: Max Reitz <mreitz@redhat.com>
357786
(cherry picked from commit 3d1f8b07a4c241f81949eff507d9f3a8fd73b87b)
357786
Signed-off-by: John Snow <jsnow@redhat.com>
357786
357786
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
357786
---
357786
 block/backup.c            |  2 +-
357786
 block/commit.c            |  2 +-
357786
 block/create.c            |  5 ++---
357786
 block/mirror.c            |  2 +-
357786
 block/stream.c            |  2 +-
357786
 include/qemu/job.h        | 14 ++++++++------
357786
 job-qmp.c                 |  5 +++--
357786
 job.c                     | 18 ++++++------------
357786
 tests/test-bdrv-drain.c   |  2 +-
357786
 tests/test-blockjob-txn.c |  2 +-
357786
 tests/test-blockjob.c     |  2 +-
357786
 11 files changed, 26 insertions(+), 30 deletions(-)
357786
357786
diff --git a/block/backup.c b/block/backup.c
357786
index a142518..a5bf699 100644
357786
--- a/block/backup.c
357786
+++ b/block/backup.c
357786
@@ -388,7 +388,7 @@ static void backup_complete(Job *job, void *opaque)
357786
 {
357786
     BackupCompleteData *data = opaque;
357786
 
357786
-    job_completed(job, data->ret, NULL);
357786
+    job_completed(job, data->ret);
357786
     g_free(data);
357786
 }
357786
 
357786
diff --git a/block/commit.c b/block/commit.c
357786
index 905a1c5..af7579d 100644
357786
--- a/block/commit.c
357786
+++ b/block/commit.c
357786
@@ -117,7 +117,7 @@ static void commit_complete(Job *job, void *opaque)
357786
      * bdrv_set_backing_hd() to fail. */
357786
     block_job_remove_all_bdrv(bjob);
357786
 
357786
-    job_completed(job, ret, NULL);
357786
+    job_completed(job, ret);
357786
     g_free(data);
357786
 
357786
     /* If bdrv_drop_intermediate() didn't already do that, remove the commit
357786
diff --git a/block/create.c b/block/create.c
357786
index 04733c3..26a385c 100644
357786
--- a/block/create.c
357786
+++ b/block/create.c
357786
@@ -35,14 +35,13 @@ typedef struct BlockdevCreateJob {
357786
     BlockDriver *drv;
357786
     BlockdevCreateOptions *opts;
357786
     int ret;
357786
-    Error *err;
357786
 } BlockdevCreateJob;
357786
 
357786
 static void blockdev_create_complete(Job *job, void *opaque)
357786
 {
357786
     BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common);
357786
 
357786
-    job_completed(job, s->ret, s->err);
357786
+    job_completed(job, s->ret);
357786
 }
357786
 
357786
 static int coroutine_fn blockdev_create_run(Job *job, Error **errp)
357786
@@ -50,7 +49,7 @@ static int coroutine_fn blockdev_create_run(Job *job, Error **errp)
357786
     BlockdevCreateJob *s = container_of(job, BlockdevCreateJob, common);
357786
 
357786
     job_progress_set_remaining(&s->common, 1);
357786
-    s->ret = s->drv->bdrv_co_create(s->opts, &s->err);
357786
+    s->ret = s->drv->bdrv_co_create(s->opts, errp);
357786
     job_progress_update(&s->common, 1);
357786
 
357786
     qapi_free_BlockdevCreateOptions(s->opts);
357786
diff --git a/block/mirror.c b/block/mirror.c
357786
index 03b326d..459f944 100644
357786
--- a/block/mirror.c
357786
+++ b/block/mirror.c
357786
@@ -581,7 +581,7 @@ static void mirror_exit(Job *job, void *opaque)
357786
     blk_set_perm(bjob->blk, 0, BLK_PERM_ALL, &error_abort);
357786
     blk_insert_bs(bjob->blk, mirror_top_bs, &error_abort);
357786
 
357786
-    job_completed(job, data->ret, NULL);
357786
+    job_completed(job, data->ret);
357786
 
357786
     g_free(data);
357786
     bdrv_drained_end(src);
357786
diff --git a/block/stream.c b/block/stream.c
357786
index b4b987d..26a7753 100644
357786
--- a/block/stream.c
357786
+++ b/block/stream.c
357786
@@ -93,7 +93,7 @@ out:
357786
     }
357786
 
357786
     g_free(s->backing_file_str);
357786
-    job_completed(job, data->ret, NULL);
357786
+    job_completed(job, data->ret);
357786
     g_free(data);
357786
 }
357786
 
357786
diff --git a/include/qemu/job.h b/include/qemu/job.h
357786
index e81cc34..905dfdd 100644
357786
--- a/include/qemu/job.h
357786
+++ b/include/qemu/job.h
357786
@@ -124,12 +124,16 @@ typedef struct Job {
357786
     /** Estimated progress_current value at the completion of the job */
357786
     int64_t progress_total;
357786
 
357786
-    /** Error string for a failed job (NULL if, and only if, job->ret == 0) */
357786
-    char *error;
357786
-
357786
     /** ret code passed to job_completed. */
357786
     int ret;
357786
 
357786
+    /**
357786
+     * Error object for a failed job.
357786
+     * If job->ret is nonzero and an error object was not set, it will be set
357786
+     * to strerror(-job->ret) during job_completed.
357786
+     */
357786
+    Error *err;
357786
+
357786
     /** The completion function that will be called when the job completes.  */
357786
     BlockCompletionFunc *cb;
357786
 
357786
@@ -469,15 +473,13 @@ void job_transition_to_ready(Job *job);
357786
 /**
357786
  * @job: The job being completed.
357786
  * @ret: The status code.
357786
- * @error: The error message for a failing job (only with @ret < 0). If @ret is
357786
- *         negative, but NULL is given for @error, strerror() is used.
357786
  *
357786
  * Marks @job as completed. If @ret is non-zero, the job transaction it is part
357786
  * of is aborted. If @ret is zero, the job moves into the WAITING state. If it
357786
  * is the last job to complete in its transaction, all jobs in the transaction
357786
  * move from WAITING to PENDING.
357786
  */
357786
-void job_completed(Job *job, int ret, Error *error);
357786
+void job_completed(Job *job, int ret);
357786
 
357786
 /** Asynchronously complete the specified @job. */
357786
 void job_complete(Job *job, Error **errp);
357786
diff --git a/job-qmp.c b/job-qmp.c
357786
index 410775d..a969b2b 100644
357786
--- a/job-qmp.c
357786
+++ b/job-qmp.c
357786
@@ -146,8 +146,9 @@ static JobInfo *job_query_single(Job *job, Error **errp)
357786
         .status             = job->status,
357786
         .current_progress   = job->progress_current,
357786
         .total_progress     = job->progress_total,
357786
-        .has_error          = !!job->error,
357786
-        .error              = g_strdup(job->error),
357786
+        .has_error          = !!job->err,
357786
+        .error              = job->err ? \
357786
+                              g_strdup(error_get_pretty(job->err)) : NULL,
357786
     };
357786
 
357786
     return info;
357786
diff --git a/job.c b/job.c
357786
index 0d07700..020ee0d 100644
357786
--- a/job.c
357786
+++ b/job.c
357786
@@ -369,7 +369,7 @@ void job_unref(Job *job)
357786
 
357786
         QLIST_REMOVE(job, job_list);
357786
 
357786
-        g_free(job->error);
357786
+        error_free(job->err);
357786
         g_free(job->id);
357786
         g_free(job);
357786
     }
357786
@@ -541,7 +541,7 @@ static void coroutine_fn job_co_entry(void *opaque)
357786
 
357786
     assert(job && job->driver && job->driver->run);
357786
     job_pause_point(job);
357786
-    job->ret = job->driver->run(job, NULL);
357786
+    job->ret = job->driver->run(job, &job->err);
357786
 }
357786
 
357786
 
357786
@@ -661,8 +661,8 @@ static void job_update_rc(Job *job)
357786
         job->ret = -ECANCELED;
357786
     }
357786
     if (job->ret) {
357786
-        if (!job->error) {
357786
-            job->error = g_strdup(strerror(-job->ret));
357786
+        if (!job->err) {
357786
+            error_setg(&job->err, "%s", strerror(-job->ret));
357786
         }
357786
         job_state_transition(job, JOB_STATUS_ABORTING);
357786
     }
357786
@@ -860,17 +860,11 @@ static void job_completed_txn_success(Job *job)
357786
     }
357786
 }
357786
 
357786
-void job_completed(Job *job, int ret, Error *error)
357786
+void job_completed(Job *job, int ret)
357786
 {
357786
     assert(job && job->txn && !job_is_completed(job));
357786
 
357786
     job->ret = ret;
357786
-    if (error) {
357786
-        assert(job->ret < 0);
357786
-        job->error = g_strdup(error_get_pretty(error));
357786
-        error_free(error);
357786
-    }
357786
-
357786
     job_update_rc(job);
357786
     trace_job_completed(job, ret, job->ret);
357786
     if (job->ret) {
357786
@@ -888,7 +882,7 @@ void job_cancel(Job *job, bool force)
357786
     }
357786
     job_cancel_async(job, force);
357786
     if (!job_started(job)) {
357786
-        job_completed(job, -ECANCELED, NULL);
357786
+        job_completed(job, -ECANCELED);
357786
     } else if (job->deferred_to_main_loop) {
357786
         job_completed_txn_abort(job);
357786
     } else {
357786
diff --git a/tests/test-bdrv-drain.c b/tests/test-bdrv-drain.c
357786
index 798445a..8937894 100644
357786
--- a/tests/test-bdrv-drain.c
357786
+++ b/tests/test-bdrv-drain.c
357786
@@ -498,7 +498,7 @@ typedef struct TestBlockJob {
357786
 
357786
 static void test_job_completed(Job *job, void *opaque)
357786
 {
357786
-    job_completed(job, 0, NULL);
357786
+    job_completed(job, 0);
357786
 }
357786
 
357786
 static int coroutine_fn test_job_run(Job *job, Error **errp)
357786
diff --git a/tests/test-blockjob-txn.c b/tests/test-blockjob-txn.c
357786
index 3194924..82cedee 100644
357786
--- a/tests/test-blockjob-txn.c
357786
+++ b/tests/test-blockjob-txn.c
357786
@@ -34,7 +34,7 @@ static void test_block_job_complete(Job *job, void *opaque)
357786
         rc = -ECANCELED;
357786
     }
357786
 
357786
-    job_completed(job, rc, NULL);
357786
+    job_completed(job, rc);
357786
     bdrv_unref(bs);
357786
 }
357786
 
357786
diff --git a/tests/test-blockjob.c b/tests/test-blockjob.c
357786
index b0462bf..408a226 100644
357786
--- a/tests/test-blockjob.c
357786
+++ b/tests/test-blockjob.c
357786
@@ -167,7 +167,7 @@ static void cancel_job_completed(Job *job, void *opaque)
357786
 {
357786
     CancelJob *s = opaque;
357786
     s->completed = true;
357786
-    job_completed(job, 0, NULL);
357786
+    job_completed(job, 0);
357786
 }
357786
 
357786
 static void cancel_job_complete(Job *job, Error **errp)
357786
-- 
357786
1.8.3.1
357786