Commit dc7a4a9e authored by Pavel Butsykin's avatar Pavel Butsykin Committed by Kevin Wolf
Browse files

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: default avatarPavel Butsykin <pbutsykin@virtuozzo.com>
Reviewed-by: default avatarStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: default avatarDenis 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: default avatarKevin Wolf <kwolf@redhat.com>
parent 81206a89
Loading
Loading
Loading
Loading
+20 −46
Original line number Diff line number Diff line
@@ -1902,14 +1902,8 @@ typedef struct BlockdevBackupState {
    AioContext *aio_context;
} BlockdevBackupState;

static void do_blockdev_backup(const char *job_id, 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,
                               BlockJobTxn *txn, Error **errp);
static void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn,
                               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;
    bdrv_drained_begin(state->bs);

    do_blockdev_backup(backup->has_job_id ? backup->job_id : NULL,
                       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);
    do_blockdev_backup(backup, common->block_job_txn, &local_err);
    if (local_err) {
        error_propagate(errp, local_err);
        return;
@@ -3243,31 +3232,27 @@ BlockDeviceInfoList *qmp_query_named_block_nodes(Error **errp)
    return bdrv_named_nodes_list(errp);
}

void do_blockdev_backup(const char *job_id, 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,
                         BlockJobTxn *txn, Error **errp)
void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn, Error **errp)
{
    BlockDriverState *bs;
    BlockDriverState *target_bs;
    Error *local_err = NULL;
    AioContext *aio_context;

    if (!has_speed) {
        speed = 0;
    if (!backup->has_speed) {
        backup->speed = 0;
    }
    if (!has_on_source_error) {
        on_source_error = BLOCKDEV_ON_ERROR_REPORT;
    if (!backup->has_on_source_error) {
        backup->on_source_error = BLOCKDEV_ON_ERROR_REPORT;
    }
    if (!has_on_target_error) {
        on_target_error = BLOCKDEV_ON_ERROR_REPORT;
    if (!backup->has_on_target_error) {
        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) {
        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_acquire(aio_context);

    target_bs = bdrv_lookup_bs(target, target, errp);
    target_bs = bdrv_lookup_bs(backup->target, backup->target, errp);
    if (!target_bs) {
        goto out;
    }
@@ -3291,8 +3276,9 @@ void do_blockdev_backup(const char *job_id, const char *device,
            goto out;
        }
    }
    backup_start(job_id, bs, target_bs, speed, sync, NULL, on_source_error,
                 on_target_error, block_job_cb, bs, txn, &local_err);
    backup_start(backup->job_id, bs, target_bs, backup->speed, backup->sync,
                 NULL, backup->on_source_error, backup->on_target_error,
                 block_job_cb, bs, txn, &local_err);
    if (local_err != NULL) {
        error_propagate(errp, local_err);
    }
@@ -3300,21 +3286,9 @@ out:
    aio_context_release(aio_context);
}

void qmp_blockdev_backup(bool has_job_id, const char *job_id,
                         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)
void qmp_blockdev_backup(BlockdevBackup *arg, Error **errp)
{
    do_blockdev_backup(has_job_id ? job_id : NULL, device, target,
                       sync, has_speed, speed,
                       has_on_source_error, on_source_error,
                       has_on_target_error, on_target_error,
                       NULL, errp);
    do_blockdev_backup(arg, NULL, errp);
}

/* Parameter check and block job starting for drive mirroring.
+5 −1
Original line number Diff line number Diff line
@@ -1105,9 +1105,13 @@
#
# For the arguments, see the documentation of BlockdevBackup.
#
# Returns: nothing on success
#          If @device is not a valid block device, DeviceNotFound
#
# Since 2.3
##
{ 'command': 'blockdev-backup', 'data': 'BlockdevBackup' }
{ 'command': 'blockdev-backup', 'boxed': true,
  'data': 'BlockdevBackup' }


##