mirror of
https://github.com/qemu/qemu.git
synced 2025-08-08 08:05:17 +00:00
block: simplify blockdev-backup
Now that we can support boxed commands, use it to greatly reduce the number of parameters (and likelihood of getting out of sync) when adjusting blockdev-backup parameters. Signed-off-by: Pavel Butsykin <pbutsykin@virtuozzo.com> Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Denis V. Lunev <den@openvz.org> CC: Jeff Cody <jcody@redhat.com> CC: Markus Armbruster <armbru@redhat.com> CC: Eric Blake <eblake@redhat.com> CC: John Snow <jsnow@redhat.com> CC: Stefan Hajnoczi <stefanha@redhat.com> CC: Kevin Wolf <kwolf@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
81206a8987
commit
dc7a4a9ed1
66
blockdev.c
66
blockdev.c
@ -1902,14 +1902,8 @@ typedef struct BlockdevBackupState {
|
|||||||
AioContext *aio_context;
|
AioContext *aio_context;
|
||||||
} BlockdevBackupState;
|
} BlockdevBackupState;
|
||||||
|
|
||||||
static void do_blockdev_backup(const char *job_id, const char *device,
|
static void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn,
|
||||||
const char *target, enum MirrorSyncMode sync,
|
Error **errp);
|
||||||
bool has_speed, int64_t speed,
|
|
||||||
bool has_on_source_error,
|
|
||||||
BlockdevOnError on_source_error,
|
|
||||||
bool has_on_target_error,
|
|
||||||
BlockdevOnError on_target_error,
|
|
||||||
BlockJobTxn *txn, Error **errp);
|
|
||||||
|
|
||||||
static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
||||||
{
|
{
|
||||||
@ -1942,12 +1936,7 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
|
|||||||
state->bs = bs;
|
state->bs = bs;
|
||||||
bdrv_drained_begin(state->bs);
|
bdrv_drained_begin(state->bs);
|
||||||
|
|
||||||
do_blockdev_backup(backup->has_job_id ? backup->job_id : NULL,
|
do_blockdev_backup(backup, common->block_job_txn, &local_err);
|
||||||
backup->device, backup->target, backup->sync,
|
|
||||||
backup->has_speed, backup->speed,
|
|
||||||
backup->has_on_source_error, backup->on_source_error,
|
|
||||||
backup->has_on_target_error, backup->on_target_error,
|
|
||||||
common->block_job_txn, &local_err);
|
|
||||||
if (local_err) {
|
if (local_err) {
|
||||||
error_propagate(errp, local_err);
|
error_propagate(errp, local_err);
|
||||||
return;
|
return;
|
||||||
@ -3243,31 +3232,27 @@ 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 *job_id, const char *device,
|
void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn, Error **errp)
|
||||||
const char *target, enum MirrorSyncMode sync,
|
|
||||||
bool has_speed, int64_t speed,
|
|
||||||
bool has_on_source_error,
|
|
||||||
BlockdevOnError on_source_error,
|
|
||||||
bool has_on_target_error,
|
|
||||||
BlockdevOnError on_target_error,
|
|
||||||
BlockJobTxn *txn, Error **errp)
|
|
||||||
{
|
{
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockDriverState *target_bs;
|
BlockDriverState *target_bs;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
AioContext *aio_context;
|
AioContext *aio_context;
|
||||||
|
|
||||||
if (!has_speed) {
|
if (!backup->has_speed) {
|
||||||
speed = 0;
|
backup->speed = 0;
|
||||||
}
|
}
|
||||||
if (!has_on_source_error) {
|
if (!backup->has_on_source_error) {
|
||||||
on_source_error = BLOCKDEV_ON_ERROR_REPORT;
|
backup->on_source_error = BLOCKDEV_ON_ERROR_REPORT;
|
||||||
}
|
}
|
||||||
if (!has_on_target_error) {
|
if (!backup->has_on_target_error) {
|
||||||
on_target_error = BLOCKDEV_ON_ERROR_REPORT;
|
backup->on_target_error = BLOCKDEV_ON_ERROR_REPORT;
|
||||||
|
}
|
||||||
|
if (!backup->has_job_id) {
|
||||||
|
backup->job_id = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
bs = qmp_get_root_bs(device, errp);
|
bs = qmp_get_root_bs(backup->device, errp);
|
||||||
if (!bs) {
|
if (!bs) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -3275,7 +3260,7 @@ void do_blockdev_backup(const char *job_id, const char *device,
|
|||||||
aio_context = bdrv_get_aio_context(bs);
|
aio_context = bdrv_get_aio_context(bs);
|
||||||
aio_context_acquire(aio_context);
|
aio_context_acquire(aio_context);
|
||||||
|
|
||||||
target_bs = bdrv_lookup_bs(target, target, errp);
|
target_bs = bdrv_lookup_bs(backup->target, backup->target, errp);
|
||||||
if (!target_bs) {
|
if (!target_bs) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
@ -3291,8 +3276,9 @@ void do_blockdev_backup(const char *job_id, const char *device,
|
|||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
backup_start(job_id, bs, target_bs, speed, sync, NULL, on_source_error,
|
backup_start(backup->job_id, bs, target_bs, backup->speed, backup->sync,
|
||||||
on_target_error, block_job_cb, bs, txn, &local_err);
|
NULL, backup->on_source_error, backup->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);
|
||||||
}
|
}
|
||||||
@ -3300,21 +3286,9 @@ out:
|
|||||||
aio_context_release(aio_context);
|
aio_context_release(aio_context);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qmp_blockdev_backup(bool has_job_id, const char *job_id,
|
void qmp_blockdev_backup(BlockdevBackup *arg, Error **errp)
|
||||||
const char *device, const char *target,
|
|
||||||
enum MirrorSyncMode sync,
|
|
||||||
bool has_speed, int64_t speed,
|
|
||||||
bool has_on_source_error,
|
|
||||||
BlockdevOnError on_source_error,
|
|
||||||
bool has_on_target_error,
|
|
||||||
BlockdevOnError on_target_error,
|
|
||||||
Error **errp)
|
|
||||||
{
|
{
|
||||||
do_blockdev_backup(has_job_id ? job_id : NULL, device, target,
|
do_blockdev_backup(arg, NULL, errp);
|
||||||
sync, has_speed, speed,
|
|
||||||
has_on_source_error, on_source_error,
|
|
||||||
has_on_target_error, on_target_error,
|
|
||||||
NULL, errp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Parameter check and block job starting for drive mirroring.
|
/* Parameter check and block job starting for drive mirroring.
|
||||||
|
@ -1105,9 +1105,13 @@
|
|||||||
#
|
#
|
||||||
# For the arguments, see the documentation of BlockdevBackup.
|
# For the arguments, see the documentation of BlockdevBackup.
|
||||||
#
|
#
|
||||||
|
# Returns: nothing on success
|
||||||
|
# If @device is not a valid block device, DeviceNotFound
|
||||||
|
#
|
||||||
# Since 2.3
|
# Since 2.3
|
||||||
##
|
##
|
||||||
{ 'command': 'blockdev-backup', 'data': 'BlockdevBackup' }
|
{ 'command': 'blockdev-backup', 'boxed': true,
|
||||||
|
'data': 'BlockdevBackup' }
|
||||||
|
|
||||||
|
|
||||||
##
|
##
|
||||||
|
Loading…
Reference in New Issue
Block a user