diff mbox series

[RFC,10/15] qapi: query-jobs: add information specific for job type

Message ID 20240313150907.623462-11-vsementsov@yandex-team.ru
State New
Headers show
Series block job API | expand

Commit Message

Vladimir Sementsov-Ogievskiy March 13, 2024, 3:09 p.m. UTC
Duplicate the feature from query-block-jobs. It's a step to finally
deprecate query-block-jobs command and move to query-jobs.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
 block/mirror.c     | 14 ++++++++++++--
 include/qemu/job.h |  5 +++++
 job-qmp.c          |  6 ++++++
 qapi/job.json      | 22 +++++++++++++++++++---
 4 files changed, 42 insertions(+), 5 deletions(-)
diff mbox series

Patch

diff --git a/block/mirror.c b/block/mirror.c
index e95c54fbc6..96dcbbc3e8 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1294,7 +1294,7 @@  static bool mirror_change(Job *job, JobChangeOptions *opts, Error **errp)
     return true;
 }
 
-static void mirror_query(BlockJob *job, BlockJobInfo *info)
+static void mirror_query_old(BlockJob *job, BlockJobInfo *info)
 {
     MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
 
@@ -1303,6 +1303,15 @@  static void mirror_query(BlockJob *job, BlockJobInfo *info)
     };
 }
 
+static void mirror_query(Job *job, JobInfo *info)
+{
+    MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
+
+    info->u.mirror = (JobInfoMirror) {
+        .actively_synced = qatomic_read(&s->actively_synced),
+    };
+}
+
 static const BlockJobDriver mirror_job_driver = {
     .job_driver = {
         .instance_size          = sizeof(MirrorBlockJob),
@@ -1316,9 +1325,10 @@  static const BlockJobDriver mirror_job_driver = {
         .complete               = mirror_complete,
         .cancel                 = mirror_cancel,
         .change                 = mirror_change,
+        .query                  = mirror_query,
     },
     .drained_poll           = mirror_drained_poll,
-    .query                  = mirror_query,
+    .query                  = mirror_query_old,
 };
 
 static bool commit_active_change(Job *job, JobChangeOptions *opts, Error **errp)
diff --git a/include/qemu/job.h b/include/qemu/job.h
index eee1d5b50f..8a238b8658 100644
--- a/include/qemu/job.h
+++ b/include/qemu/job.h
@@ -315,6 +315,11 @@  struct JobDriver {
      */
     bool (*change)(Job *job, JobChangeOptions *opts, Error **errp);
 
+    /*
+     * Query information specific to this kind of block job.
+     */
+    void (*query)(Job *job, JobInfo *info);
+
     /**
      * Called when the job is freed.
      */
diff --git a/job-qmp.c b/job-qmp.c
index c048e03d9f..9643c5424d 100644
--- a/job-qmp.c
+++ b/job-qmp.c
@@ -177,6 +177,12 @@  static JobInfo *job_query_single_locked(Job *job, Error **errp)
                               g_strdup(error_get_pretty(job->err)) : NULL,
     };
 
+    if (job->driver->query) {
+        job_unlock();
+        job->driver->query(job, info);
+        job_lock();
+    }
+
     return info;
 }
 
diff --git a/qapi/job.json b/qapi/job.json
index 2f1b839cfc..036fec1b57 100644
--- a/qapi/job.json
+++ b/qapi/job.json
@@ -251,6 +251,20 @@ 
 ##
 { 'command': 'job-finalize', 'data': { 'id': 'str' } }
 
+##
+# @JobInfoMirror:
+#
+# Information specific to mirror block jobs.
+#
+# @actively-synced: Whether the source is actively synced to the
+#     target, i.e. same data and new writes are done synchronously to
+#     both.
+#
+# Since: 9.1
+##
+{ 'struct': 'JobInfoMirror',
+  'data': { 'actively-synced': 'bool' } }
+
 ##
 # @JobInfo:
 #
@@ -281,10 +295,12 @@ 
 #
 # Since: 3.0
 ##
-{ 'struct': 'JobInfo',
-  'data': { 'id': 'str', 'type': 'JobType', 'status': 'JobStatus',
+{ 'union': 'JobInfo',
+  'base': { 'id': 'str', 'type': 'JobType', 'status': 'JobStatus',
             'current-progress': 'int', 'total-progress': 'int',
-            '*error': 'str' } }
+            '*error': 'str' },
+  'discriminator': 'type',
+  'data': { 'mirror': 'JobInfoMirror' } }
 
 ##
 # @query-jobs: