@@ -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)
@@ -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.
*/
@@ -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;
}
@@ -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:
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(-)