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

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