blockjob: introduce block-job-change QMP command
which will allow changing job-type-specific options after job creation. In the JobVerbTable, the same allow bits as for set-speed are used, because set-speed can be considered an existing change command. Signed-off-by: Fiona Ebner <f.ebner@proxmox.com> Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru> Message-ID: <20231031135431.393137-2-f.ebner@proxmox.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
073458da56
commit
61a3a5a76a
14
blockdev.c
14
blockdev.c
@ -3392,6 +3392,20 @@ void qmp_block_job_dismiss(const char *id, Error **errp)
|
||||
job_dismiss_locked(&job, errp);
|
||||
}
|
||||
|
||||
void qmp_block_job_change(BlockJobChangeOptions *opts, Error **errp)
|
||||
{
|
||||
BlockJob *job;
|
||||
|
||||
JOB_LOCK_GUARD();
|
||||
job = find_block_job_locked(opts->id, errp);
|
||||
|
||||
if (!job) {
|
||||
return;
|
||||
}
|
||||
|
||||
block_job_change_locked(job, opts, errp);
|
||||
}
|
||||
|
||||
void qmp_change_backing_file(const char *device,
|
||||
const char *image_node_name,
|
||||
const char *backing_file,
|
||||
|
20
blockjob.c
20
blockjob.c
@ -330,6 +330,26 @@ 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, BlockJobChangeOptions *opts,
|
||||
Error **errp)
|
||||
{
|
||||
const BlockJobDriver *drv = block_job_driver(job);
|
||||
|
||||
GLOBAL_STATE_CODE();
|
||||
|
||||
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();
|
||||
|
@ -172,6 +172,17 @@ 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, BlockJobChangeOptions *opts,
|
||||
Error **errp);
|
||||
|
||||
/**
|
||||
* block_job_query_locked:
|
||||
* @job: The job to get information about.
|
||||
|
@ -67,6 +67,13 @@ struct BlockJobDriver {
|
||||
void (*attached_aio_context)(BlockJob *job, AioContext *new_context);
|
||||
|
||||
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, BlockJobChangeOptions *opts, Error **errp);
|
||||
};
|
||||
|
||||
/*
|
||||
|
1
job.c
1
job.c
@ -80,6 +80,7 @@ bool JobVerbTable[JOB_VERB__MAX][JOB_STATUS__MAX] = {
|
||||
[JOB_VERB_COMPLETE] = {0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0},
|
||||
[JOB_VERB_FINALIZE] = {0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0},
|
||||
[JOB_VERB_DISMISS] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0},
|
||||
[JOB_VERB_CHANGE] = {0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0},
|
||||
};
|
||||
|
||||
/* Transactional group of jobs */
|
||||
|
@ -3044,6 +3044,32 @@
|
||||
{ 'command': 'block-job-finalize', 'data': { 'id': 'str' },
|
||||
'allow-preconfig': true }
|
||||
|
||||
##
|
||||
# @BlockJobChangeOptions:
|
||||
#
|
||||
# Block job options that can be changed after job creation.
|
||||
#
|
||||
# @id: The job identifier
|
||||
#
|
||||
# @type: The job type
|
||||
#
|
||||
# Since 8.2
|
||||
##
|
||||
{ 'union': 'BlockJobChangeOptions',
|
||||
'base': { 'id': 'str', 'type': 'JobType' },
|
||||
'discriminator': 'type',
|
||||
'data': {} }
|
||||
|
||||
##
|
||||
# @block-job-change:
|
||||
#
|
||||
# Change the block job's options.
|
||||
#
|
||||
# Since: 8.2
|
||||
##
|
||||
{ 'command': 'block-job-change',
|
||||
'data': 'BlockJobChangeOptions', 'boxed': true }
|
||||
|
||||
##
|
||||
# @BlockdevDiscardOptions:
|
||||
#
|
||||
|
@ -105,11 +105,13 @@
|
||||
#
|
||||
# @finalize: see @job-finalize
|
||||
#
|
||||
# @change: see @block-job-change (since 8.2)
|
||||
#
|
||||
# Since: 2.12
|
||||
##
|
||||
{ 'enum': 'JobVerb',
|
||||
'data': ['cancel', 'pause', 'resume', 'set-speed', 'complete', 'dismiss',
|
||||
'finalize' ] }
|
||||
'finalize', 'change' ] }
|
||||
|
||||
##
|
||||
# @JOB_STATUS_CHANGE:
|
||||
|
Loading…
Reference in New Issue
Block a user