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 60e8d83e4f..63e35114f3 100644
--- a/block/mirror.c
+++ b/block/mirror.c
@@ -1258,10 +1258,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;
@@ -1316,9 +1315,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 626f53102d..b1c3de3862 100644
--- a/blockdev.c
+++ b/blockdev.c
@@ -3262,7 +3262,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 788cb1e07d..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 (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 2b873f2576..6fa525dac3 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 9e26fa899f..c764bd3801 100644
--- a/job-qmp.c
+++ b/job-qmp.c
@@ -26,6 +26,7 @@
#include "qemu/osdep.h"
#include "qemu/job.h"
#include "qapi/qapi-commands-job.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..7b004fe12e 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 (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
Am 02.10.2024 um 16:06 hat Vladimir Sementsov-Ogievskiy geschrieben: > 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> > diff --git a/include/qemu/job.h b/include/qemu/job.h > index 2b873f2576..6fa525dac3 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); Other functions in this header document the locking behaviour. The right one here seems to be: "Called with job_lock held, but might release it temporarily." Kevin
© 2016 - 2024 Red Hat, Inc.