mirror of https://github.com/xemu-project/xemu.git
backup: Add 'job-id' parameter to 'blockdev-backup' and 'drive-backup'
This patch adds a new optional 'job-id' parameter to 'blockdev-backup' and 'drive-backup', allowing the user to specify the ID of the block job to be created. The HMP 'drive_backup' command remains unchanged. Signed-off-by: Alberto Garcia <berto@igalia.com> Reviewed-by: Kevin Wolf <kwolf@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
71aa98678c
commit
70559d499c
|
@ -474,9 +474,9 @@ static void coroutine_fn backup_run(void *opaque)
|
||||||
block_job_defer_to_main_loop(&job->common, backup_complete, data);
|
block_job_defer_to_main_loop(&job->common, backup_complete, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void backup_start(BlockDriverState *bs, BlockDriverState *target,
|
void backup_start(const char *job_id, BlockDriverState *bs,
|
||||||
int64_t speed, MirrorSyncMode sync_mode,
|
BlockDriverState *target, int64_t speed,
|
||||||
BdrvDirtyBitmap *sync_bitmap,
|
MirrorSyncMode sync_mode, BdrvDirtyBitmap *sync_bitmap,
|
||||||
BlockdevOnError on_source_error,
|
BlockdevOnError on_source_error,
|
||||||
BlockdevOnError on_target_error,
|
BlockdevOnError on_target_error,
|
||||||
BlockCompletionFunc *cb, void *opaque,
|
BlockCompletionFunc *cb, void *opaque,
|
||||||
|
@ -541,7 +541,7 @@ void backup_start(BlockDriverState *bs, BlockDriverState *target,
|
||||||
goto error;
|
goto error;
|
||||||
}
|
}
|
||||||
|
|
||||||
job = block_job_create(NULL, &backup_job_driver, bs, speed,
|
job = block_job_create(job_id, &backup_job_driver, bs, speed,
|
||||||
cb, opaque, errp);
|
cb, opaque, errp);
|
||||||
if (!job) {
|
if (!job) {
|
||||||
goto error;
|
goto error;
|
||||||
|
|
43
blockdev.c
43
blockdev.c
|
@ -1836,9 +1836,9 @@ typedef struct DriveBackupState {
|
||||||
BlockJob *job;
|
BlockJob *job;
|
||||||
} DriveBackupState;
|
} DriveBackupState;
|
||||||
|
|
||||||
static void do_drive_backup(const char *device, const char *target,
|
static void do_drive_backup(const char *job_id, const char *device,
|
||||||
bool has_format, const char *format,
|
const char *target, bool has_format,
|
||||||
enum MirrorSyncMode sync,
|
const char *format, enum MirrorSyncMode sync,
|
||||||
bool has_mode, enum NewImageMode mode,
|
bool has_mode, enum NewImageMode mode,
|
||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
bool has_bitmap, const char *bitmap,
|
bool has_bitmap, const char *bitmap,
|
||||||
|
@ -1876,7 +1876,8 @@ static void drive_backup_prepare(BlkActionState *common, Error **errp)
|
||||||
bdrv_drained_begin(blk_bs(blk));
|
bdrv_drained_begin(blk_bs(blk));
|
||||||
state->bs = blk_bs(blk);
|
state->bs = blk_bs(blk);
|
||||||
|
|
||||||
do_drive_backup(backup->device, backup->target,
|
do_drive_backup(backup->has_job_id ? backup->job_id : NULL,
|
||||||
|
backup->device, backup->target,
|
||||||
backup->has_format, backup->format,
|
backup->has_format, backup->format,
|
||||||
backup->sync,
|
backup->sync,
|
||||||
backup->has_mode, backup->mode,
|
backup->has_mode, backup->mode,
|
||||||
|
@ -1921,8 +1922,8 @@ typedef struct BlockdevBackupState {
|
||||||
AioContext *aio_context;
|
AioContext *aio_context;
|
||||||
} BlockdevBackupState;
|
} BlockdevBackupState;
|
||||||
|
|
||||||
static void do_blockdev_backup(const char *device, const char *target,
|
static void do_blockdev_backup(const char *job_id, const char *device,
|
||||||
enum MirrorSyncMode sync,
|
const char *target, enum MirrorSyncMode sync,
|
||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
bool has_on_source_error,
|
bool has_on_source_error,
|
||||||
BlockdevOnError on_source_error,
|
BlockdevOnError on_source_error,
|
||||||
|
@ -1968,8 +1969,8 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||||
state->bs = blk_bs(blk);
|
state->bs = blk_bs(blk);
|
||||||
bdrv_drained_begin(state->bs);
|
bdrv_drained_begin(state->bs);
|
||||||
|
|
||||||
do_blockdev_backup(backup->device, backup->target,
|
do_blockdev_backup(backup->has_job_id ? backup->job_id : NULL,
|
||||||
backup->sync,
|
backup->device, backup->target, backup->sync,
|
||||||
backup->has_speed, backup->speed,
|
backup->has_speed, backup->speed,
|
||||||
backup->has_on_source_error, backup->on_source_error,
|
backup->has_on_source_error, backup->on_source_error,
|
||||||
backup->has_on_target_error, backup->on_target_error,
|
backup->has_on_target_error, backup->on_target_error,
|
||||||
|
@ -3182,9 +3183,9 @@ out:
|
||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void do_drive_backup(const char *device, const char *target,
|
static void do_drive_backup(const char *job_id, const char *device,
|
||||||
bool has_format, const char *format,
|
const char *target, bool has_format,
|
||||||
enum MirrorSyncMode sync,
|
const char *format, enum MirrorSyncMode sync,
|
||||||
bool has_mode, enum NewImageMode mode,
|
bool has_mode, enum NewImageMode mode,
|
||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
bool has_bitmap, const char *bitmap,
|
bool has_bitmap, const char *bitmap,
|
||||||
|
@ -3303,7 +3304,7 @@ static void do_drive_backup(const char *device, const char *target,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
backup_start(bs, target_bs, speed, sync, bmap,
|
backup_start(job_id, bs, target_bs, speed, sync, bmap,
|
||||||
on_source_error, on_target_error,
|
on_source_error, on_target_error,
|
||||||
block_job_cb, bs, txn, &local_err);
|
block_job_cb, bs, txn, &local_err);
|
||||||
bdrv_unref(target_bs);
|
bdrv_unref(target_bs);
|
||||||
|
@ -3316,7 +3317,8 @@ out:
|
||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_drive_backup(const char *device, const char *target,
|
void qmp_drive_backup(bool has_job_id, const char *job_id,
|
||||||
|
const char *device, const char *target,
|
||||||
bool has_format, const char *format,
|
bool has_format, const char *format,
|
||||||
enum MirrorSyncMode sync,
|
enum MirrorSyncMode sync,
|
||||||
bool has_mode, enum NewImageMode mode,
|
bool has_mode, enum NewImageMode mode,
|
||||||
|
@ -3326,7 +3328,8 @@ void qmp_drive_backup(const char *device, const char *target,
|
||||||
bool has_on_target_error, BlockdevOnError on_target_error,
|
bool has_on_target_error, BlockdevOnError on_target_error,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
return do_drive_backup(device, target, has_format, format, sync,
|
return do_drive_backup(has_job_id ? job_id : NULL, device, target,
|
||||||
|
has_format, format, sync,
|
||||||
has_mode, mode, has_speed, speed,
|
has_mode, mode, has_speed, speed,
|
||||||
has_bitmap, bitmap,
|
has_bitmap, bitmap,
|
||||||
has_on_source_error, on_source_error,
|
has_on_source_error, on_source_error,
|
||||||
|
@ -3339,8 +3342,8 @@ BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
|
||||||
return bdrv_named_nodes_list(errp);
|
return bdrv_named_nodes_list(errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void do_blockdev_backup(const char *device, const char *target,
|
void do_blockdev_backup(const char *job_id, const char *device,
|
||||||
enum MirrorSyncMode sync,
|
const char *target, enum MirrorSyncMode sync,
|
||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
bool has_on_source_error,
|
bool has_on_source_error,
|
||||||
BlockdevOnError on_source_error,
|
BlockdevOnError on_source_error,
|
||||||
|
@ -3395,7 +3398,7 @@ void do_blockdev_backup(const char *device, const char *target,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
backup_start(bs, target_bs, speed, sync, NULL, on_source_error,
|
backup_start(job_id, bs, target_bs, speed, sync, NULL, on_source_error,
|
||||||
on_target_error, block_job_cb, bs, txn, &local_err);
|
on_target_error, block_job_cb, bs, txn, &local_err);
|
||||||
if (local_err != NULL) {
|
if (local_err != NULL) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
|
@ -3404,7 +3407,8 @@ out:
|
||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_blockdev_backup(const char *device, const char *target,
|
void qmp_blockdev_backup(bool has_job_id, const char *job_id,
|
||||||
|
const char *device, const char *target,
|
||||||
enum MirrorSyncMode sync,
|
enum MirrorSyncMode sync,
|
||||||
bool has_speed, int64_t speed,
|
bool has_speed, int64_t speed,
|
||||||
bool has_on_source_error,
|
bool has_on_source_error,
|
||||||
|
@ -3413,7 +3417,8 @@ void qmp_blockdev_backup(const char *device, const char *target,
|
||||||
BlockdevOnError on_target_error,
|
BlockdevOnError on_target_error,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
do_blockdev_backup(device, target, sync, has_speed, speed,
|
do_blockdev_backup(has_job_id ? job_id : NULL, device, target,
|
||||||
|
sync, has_speed, speed,
|
||||||
has_on_source_error, on_source_error,
|
has_on_source_error, on_source_error,
|
||||||
has_on_target_error, on_target_error,
|
has_on_target_error, on_target_error,
|
||||||
NULL, errp);
|
NULL, errp);
|
||||||
|
|
2
hmp.c
2
hmp.c
|
@ -1127,7 +1127,7 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
|
||||||
mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
|
mode = NEW_IMAGE_MODE_ABSOLUTE_PATHS;
|
||||||
}
|
}
|
||||||
|
|
||||||
qmp_drive_backup(device, filename, !!format, format,
|
qmp_drive_backup(false, NULL, device, filename, !!format, format,
|
||||||
full ? MIRROR_SYNC_MODE_FULL : MIRROR_SYNC_MODE_TOP,
|
full ? MIRROR_SYNC_MODE_FULL : MIRROR_SYNC_MODE_TOP,
|
||||||
true, mode, false, 0, false, NULL,
|
true, mode, false, 0, false, NULL,
|
||||||
false, 0, false, 0, &err);
|
false, 0, false, 0, &err);
|
||||||
|
|
|
@ -732,6 +732,8 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* backup_start:
|
* backup_start:
|
||||||
|
* @job_id: The id of the newly-created job, or %NULL to use the
|
||||||
|
* device name of @bs.
|
||||||
* @bs: Block device to operate on.
|
* @bs: Block device to operate on.
|
||||||
* @target: Block device to write to.
|
* @target: Block device to write to.
|
||||||
* @speed: The maximum speed, in bytes per second, or 0 for unlimited.
|
* @speed: The maximum speed, in bytes per second, or 0 for unlimited.
|
||||||
|
@ -746,9 +748,9 @@ void mirror_start(const char *job_id, BlockDriverState *bs,
|
||||||
* Start a backup operation on @bs. Clusters in @bs are written to @target
|
* Start a backup operation on @bs. Clusters in @bs are written to @target
|
||||||
* until the job is cancelled or manually completed.
|
* until the job is cancelled or manually completed.
|
||||||
*/
|
*/
|
||||||
void backup_start(BlockDriverState *bs, BlockDriverState *target,
|
void backup_start(const char *job_id, BlockDriverState *bs,
|
||||||
int64_t speed, MirrorSyncMode sync_mode,
|
BlockDriverState *target, int64_t speed,
|
||||||
BdrvDirtyBitmap *sync_bitmap,
|
MirrorSyncMode sync_mode, BdrvDirtyBitmap *sync_bitmap,
|
||||||
BlockdevOnError on_source_error,
|
BlockdevOnError on_source_error,
|
||||||
BlockdevOnError on_target_error,
|
BlockdevOnError on_target_error,
|
||||||
BlockCompletionFunc *cb, void *opaque,
|
BlockCompletionFunc *cb, void *opaque,
|
||||||
|
|
|
@ -866,6 +866,9 @@
|
||||||
##
|
##
|
||||||
# @DriveBackup
|
# @DriveBackup
|
||||||
#
|
#
|
||||||
|
# @job-id: #optional identifier for the newly-created block job. If
|
||||||
|
# omitted, the device name will be used. (Since 2.7)
|
||||||
|
#
|
||||||
# @device: the name of the device which should be copied.
|
# @device: the name of the device which should be copied.
|
||||||
#
|
#
|
||||||
# @target: the target of the new image. If the file exists, or if it
|
# @target: the target of the new image. If the file exists, or if it
|
||||||
|
@ -903,8 +906,8 @@
|
||||||
# Since: 1.6
|
# Since: 1.6
|
||||||
##
|
##
|
||||||
{ 'struct': 'DriveBackup',
|
{ 'struct': 'DriveBackup',
|
||||||
'data': { 'device': 'str', 'target': 'str', '*format': 'str',
|
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
||||||
'sync': 'MirrorSyncMode', '*mode': 'NewImageMode',
|
'*format': 'str', 'sync': 'MirrorSyncMode', '*mode': 'NewImageMode',
|
||||||
'*speed': 'int', '*bitmap': 'str',
|
'*speed': 'int', '*bitmap': 'str',
|
||||||
'*on-source-error': 'BlockdevOnError',
|
'*on-source-error': 'BlockdevOnError',
|
||||||
'*on-target-error': 'BlockdevOnError' } }
|
'*on-target-error': 'BlockdevOnError' } }
|
||||||
|
@ -912,6 +915,9 @@
|
||||||
##
|
##
|
||||||
# @BlockdevBackup
|
# @BlockdevBackup
|
||||||
#
|
#
|
||||||
|
# @job-id: #optional identifier for the newly-created block job. If
|
||||||
|
# omitted, the device name will be used. (Since 2.7)
|
||||||
|
#
|
||||||
# @device: the name of the device which should be copied.
|
# @device: the name of the device which should be copied.
|
||||||
#
|
#
|
||||||
# @target: the name of the backup target device.
|
# @target: the name of the backup target device.
|
||||||
|
@ -938,7 +944,7 @@
|
||||||
# Since: 2.3
|
# Since: 2.3
|
||||||
##
|
##
|
||||||
{ 'struct': 'BlockdevBackup',
|
{ 'struct': 'BlockdevBackup',
|
||||||
'data': { 'device': 'str', 'target': 'str',
|
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
||||||
'sync': 'MirrorSyncMode',
|
'sync': 'MirrorSyncMode',
|
||||||
'*speed': 'int',
|
'*speed': 'int',
|
||||||
'*on-source-error': 'BlockdevOnError',
|
'*on-source-error': 'BlockdevOnError',
|
||||||
|
|
|
@ -1212,8 +1212,8 @@ EQMP
|
||||||
|
|
||||||
{
|
{
|
||||||
.name = "drive-backup",
|
.name = "drive-backup",
|
||||||
.args_type = "sync:s,device:B,target:s,speed:i?,mode:s?,format:s?,"
|
.args_type = "job-id:s?,sync:s,device:B,target:s,speed:i?,mode:s?,"
|
||||||
"bitmap:s?,on-source-error:s?,on-target-error:s?",
|
"format:s?,bitmap:s?,on-source-error:s?,on-target-error:s?",
|
||||||
.mhandler.cmd_new = qmp_marshal_drive_backup,
|
.mhandler.cmd_new = qmp_marshal_drive_backup,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -1229,6 +1229,8 @@ block-job-cancel command.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
|
- "job-id": Identifier for the newly-created block job. If omitted,
|
||||||
|
the device name will be used. (json-string, optional)
|
||||||
- "device": the name of the device which should be copied.
|
- "device": the name of the device which should be copied.
|
||||||
(json-string)
|
(json-string)
|
||||||
- "target": the target of the new image. If the file exists, or if it is a
|
- "target": the target of the new image. If the file exists, or if it is a
|
||||||
|
@ -1266,7 +1268,7 @@ EQMP
|
||||||
|
|
||||||
{
|
{
|
||||||
.name = "blockdev-backup",
|
.name = "blockdev-backup",
|
||||||
.args_type = "sync:s,device:B,target:B,speed:i?,"
|
.args_type = "job-id:s?,sync:s,device:B,target:B,speed:i?,"
|
||||||
"on-source-error:s?,on-target-error:s?",
|
"on-source-error:s?,on-target-error:s?",
|
||||||
.mhandler.cmd_new = qmp_marshal_blockdev_backup,
|
.mhandler.cmd_new = qmp_marshal_blockdev_backup,
|
||||||
},
|
},
|
||||||
|
@ -1280,6 +1282,8 @@ as backup target.
|
||||||
|
|
||||||
Arguments:
|
Arguments:
|
||||||
|
|
||||||
|
- "job-id": Identifier for the newly-created block job. If omitted,
|
||||||
|
the device name will be used. (json-string, optional)
|
||||||
- "device": the name of the device which should be copied.
|
- "device": the name of the device which should be copied.
|
||||||
(json-string)
|
(json-string)
|
||||||
- "target": the name of the backup target device. (json-string)
|
- "target": the name of the backup target device. (json-string)
|
||||||
|
|
Loading…
Reference in New Issue