[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC 06/15] blockjob: move change action implementation to job from bloc
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
[RFC 06/15] blockjob: move change action implementation to job from block-job |
Date: |
Wed, 13 Mar 2024 18:08:58 +0300 |
Like for other block-job-* APIs we want have the actual functionality
in job layer and make block-job-change to be a deprecated duplication
of job-change in the following commit.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
---
block/mirror.c | 7 +++----
blockdev.c | 2 +-
blockjob.c | 26 --------------------------
include/block/blockjob.h | 11 -----------
include/block/blockjob_int.h | 7 -------
include/qemu/job.h | 12 ++++++++++++
job-qmp.c | 1 +
job.c | 23 +++++++++++++++++++++++
8 files changed, 40 insertions(+), 49 deletions(-)
diff --git a/block/mirror.c b/block/mirror.c
index 2d0cd22c06..e670d0dd4f 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1251,10 +1251,9 @@ static bool commit_active_cancel(Job *job, bool force)
return force || !job_is_ready(job);
}
-static void mirror_change(BlockJob *job, JobChangeOptions *opts,
- Error **errp)
+static void mirror_change(Job *job, JobChangeOptions *opts, Error **errp)
{
- MirrorBlockJob *s = container_of(job, MirrorBlockJob, common);
+ MirrorBlockJob *s = container_of(job, MirrorBlockJob, common.job);
JobChangeOptionsMirror *change_opts = &opts->u.mirror;
MirrorCopyMode current;
@@ -1310,9 +1309,9 @@ static const BlockJobDriver mirror_job_driver = {
.pause = mirror_pause,
.complete = mirror_complete,
.cancel = mirror_cancel,
+ .change = mirror_change,
},
.drained_poll = mirror_drained_poll,
- .change = mirror_change,
.query = mirror_query,
};
diff --git a/blockdev.c b/blockdev.c
index 7881f6e5a6..7e13213040 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -3256,7 +3256,7 @@ void qmp_block_job_change(JobChangeOptions *opts, Error
**errp)
return;
}
- block_job_change_locked(job, opts, errp);
+ job_change_locked(&job->job, opts, errp);
}
void qmp_change_backing_file(const char *device,
diff --git a/blockjob.c b/blockjob.c
index 33c40e7d25..2769722b37 100644
--- a/blockjob.c
+++ b/blockjob.c
@@ -312,32 +312,6 @@ static bool block_job_set_speed(BlockJob *job, int64_t
speed, Error **errp)
return block_job_set_speed_locked(job, speed, errp);
}
-void block_job_change_locked(BlockJob *job, JobChangeOptions *opts,
- Error **errp)
-{
- const BlockJobDriver *drv = block_job_driver(job);
-
- GLOBAL_STATE_CODE();
-
- if (opts->has_type && job_type(&job->job) != opts->type) {
- error_setg(errp, "Job '%s' is '%s' job, not '%s'", job->job.id,
- job_type_str(&job->job), JobType_str(opts->type));
- return;
- }
-
- if (job_apply_verb_locked(&job->job, JOB_VERB_CHANGE, errp)) {
- return;
- }
-
- if (drv->change) {
- job_unlock();
- drv->change(job, opts, errp);
- job_lock();
- } else {
- error_setg(errp, "Job type does not support change");
- }
-}
-
void block_job_ratelimit_processed_bytes(BlockJob *job, uint64_t n)
{
IO_CODE();
diff --git a/include/block/blockjob.h b/include/block/blockjob.h
index 5dd1b08909..72e849a140 100644
--- a/include/block/blockjob.h
+++ b/include/block/blockjob.h
@@ -173,17 +173,6 @@ bool block_job_has_bdrv(BlockJob *job, BlockDriverState
*bs);
*/
bool block_job_set_speed_locked(BlockJob *job, int64_t speed, Error **errp);
-/**
- * block_job_change_locked:
- * @job: The job to change.
- * @opts: The new options.
- * @errp: Error object.
- *
- * Change the job according to opts.
- */
-void block_job_change_locked(BlockJob *job, JobChangeOptions *opts,
- Error **errp);
-
/**
* block_job_query_locked:
* @job: The job to get information about.
diff --git a/include/block/blockjob_int.h b/include/block/blockjob_int.h
index d9c3b911d0..58bc7a5cea 100644
--- a/include/block/blockjob_int.h
+++ b/include/block/blockjob_int.h
@@ -68,13 +68,6 @@ struct BlockJobDriver {
void (*set_speed)(BlockJob *job, int64_t speed);
- /*
- * Change the @job's options according to @opts.
- *
- * Note that this can already be called before the job coroutine is
running.
- */
- void (*change)(BlockJob *job, JobChangeOptions *opts, Error **errp);
-
/*
* Query information specific to this kind of block job.
*/
diff --git a/include/qemu/job.h b/include/qemu/job.h
index 9ea98b5927..d44cdb0cc8 100644
--- a/include/qemu/job.h
+++ b/include/qemu/job.h
@@ -27,6 +27,7 @@
#define JOB_H
#include "qapi/qapi-types-job.h"
+#include "qapi/qapi-types-block-core.h"
#include "qemu/queue.h"
#include "qemu/progress_meter.h"
#include "qemu/coroutine.h"
@@ -307,6 +308,12 @@ struct JobDriver {
*/
bool (*cancel)(Job *job, bool force);
+ /**
+ * Change the @job's options according to @opts.
+ *
+ * Note that this can already be called before the job coroutine is
running.
+ */
+ void (*change)(Job *job, JobChangeOptions *opts, Error **errp);
/**
* Called when the job is freed.
@@ -705,6 +712,11 @@ void job_finalize_locked(Job *job, Error **errp);
*/
void job_dismiss_locked(Job **job, Error **errp);
+/**
+ * Change the job according to opts.
+ */
+void job_change_locked(Job *job, JobChangeOptions *opts, Error **errp);
+
/**
* Synchronously finishes the given @job. If @finish is given, it is called to
* trigger completion or cancellation of the job.
diff --git a/job-qmp.c b/job-qmp.c
index c486df9579..abe9b59487 100644
--- a/job-qmp.c
+++ b/job-qmp.c
@@ -28,6 +28,7 @@
#include "qapi/qapi-commands-job.h"
#include "qapi/qapi-types-block-core.h"
#include "qapi/qapi-visit-block-core.h"
+#include "qapi/qapi-commands-block-core.h"
#include "qapi/error.h"
#include "trace/trace-root.h"
diff --git a/job.c b/job.c
index 660ce22c56..69630852dc 100644
--- a/job.c
+++ b/job.c
@@ -1262,3 +1262,26 @@ int job_finish_sync_locked(Job *job,
job_unref_locked(job);
return ret;
}
+
+void job_change_locked(Job *job, JobChangeOptions *opts, Error **errp)
+{
+ GLOBAL_STATE_CODE();
+
+ if (opts->has_type && job_type(job) != opts->type) {
+ error_setg(errp, "Job '%s' is '%s' job, not '%s'", job->id,
+ job_type_str(job), JobType_str(opts->type));
+ return;
+ }
+
+ if (job_apply_verb_locked(job, JOB_VERB_CHANGE, errp)) {
+ return;
+ }
+
+ if (job->driver->change) {
+ job_unlock();
+ job->driver->change(job, opts, errp);
+ job_lock();
+ } else {
+ error_setg(errp, "Job type does not support change");
+ }
+}
--
2.34.1
- Re: [RFC 01/15] scripts/qapi: support type-based unions, (continued)
- [RFC 03/15] blockjob: block_job_change_locked(): check job type, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 07/15] qapi: add job-change, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 12/15] qapi: rename BlockDeviceIoStatus to IoStatus, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 13/15] qapi: move IoStatus to common.json, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 08/15] qapi: job-change: support speed parameter, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 09/15] qapi: job-complete: introduce no-block-replace option for mirror, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 02/15] qapi: rename BlockJobChangeOptions to JobChangeOptions, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 06/15] blockjob: move change action implementation to job from block-job,
Vladimir Sementsov-Ogievskiy <=
- [RFC 10/15] qapi: query-jobs: add information specific for job type, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 14/15] qapi: query-job: add block-job specific information, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 04/15] qapi: block-job-change: make copy-mode parameter optional, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 15/15] qapi/block-core: derpecate block-job- APIs, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 05/15] qapi: JobChangeOptions: make type member optional and deprecated, Vladimir Sementsov-Ogievskiy, 2024/03/13
- [RFC 11/15] job-qmp: job_query_single_locked: add assertion on job ret, Vladimir Sementsov-Ogievskiy, 2024/03/13