Commit 70559d49 authored by Alberto Garcia's avatar Alberto Garcia Committed by Kevin Wolf
Browse files

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: default avatarAlberto Garcia <berto@igalia.com>
Reviewed-by: default avatarKevin Wolf <kwolf@redhat.com>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 71aa9867
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -474,9 +474,9 @@ static void coroutine_fn backup_run(void *opaque)
    block_job_defer_to_main_loop(&job->common, backup_complete, data);
}

void backup_start(BlockDriverState *bs, BlockDriverState *target,
                  int64_t speed, MirrorSyncMode sync_mode,
                  BdrvDirtyBitmap *sync_bitmap,
void backup_start(const char *job_id, BlockDriverState *bs,
                  BlockDriverState *target, int64_t speed,
                  MirrorSyncMode sync_mode, BdrvDirtyBitmap *sync_bitmap,
                  BlockdevOnError on_source_error,
                  BlockdevOnError on_target_error,
                  BlockCompletionFunc *cb, void *opaque,
@@ -541,7 +541,7 @@ void backup_start(BlockDriverState *bs, BlockDriverState *target,
        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);
    if (!job) {
        goto error;
+24 −19
Original line number Diff line number Diff line
@@ -1836,9 +1836,9 @@ typedef struct DriveBackupState {
    BlockJob *job;
} DriveBackupState;

static void do_drive_backup(const char *device, const char *target,
                            bool has_format, const char *format,
                            enum MirrorSyncMode sync,
static void do_drive_backup(const char *job_id, const char *device,
                            const char *target, bool has_format,
                            const char *format, enum MirrorSyncMode sync,
                            bool has_mode, enum NewImageMode mode,
                            bool has_speed, int64_t speed,
                            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));
    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->sync,
                    backup->has_mode, backup->mode,
@@ -1921,8 +1922,8 @@ typedef struct BlockdevBackupState {
    AioContext *aio_context;
} BlockdevBackupState;

static void do_blockdev_backup(const char *device, const char *target,
                               enum MirrorSyncMode sync,
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,
@@ -1968,8 +1969,8 @@ static void blockdev_backup_prepare(BlkActionState *common, Error **errp)
    state->bs = blk_bs(blk);
    bdrv_drained_begin(state->bs);

    do_blockdev_backup(backup->device, backup->target,
                       backup->sync,
    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,
@@ -3182,9 +3183,9 @@ out:
    aio_context_release(aio_context);
}

static void do_drive_backup(const char *device, const char *target,
                            bool has_format, const char *format,
                            enum MirrorSyncMode sync,
static void do_drive_backup(const char *job_id, const char *device,
                            const char *target, bool has_format,
                            const char *format, enum MirrorSyncMode sync,
                            bool has_mode, enum NewImageMode mode,
                            bool has_speed, int64_t speed,
                            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,
                 block_job_cb, bs, txn, &local_err);
    bdrv_unref(target_bs);
@@ -3316,7 +3317,8 @@ out:
    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,
                      enum MirrorSyncMode sync,
                      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,
                      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_bitmap, bitmap,
                           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);
}

void do_blockdev_backup(const char *device, const char *target,
                         enum MirrorSyncMode sync,
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,
@@ -3395,7 +3398,7 @@ void do_blockdev_backup(const char *device, const char *target,
            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);
    if (local_err != NULL) {
        error_propagate(errp, local_err);
@@ -3404,7 +3407,8 @@ out:
    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,
                         bool has_speed, int64_t speed,
                         bool has_on_source_error,
@@ -3413,7 +3417,8 @@ void qmp_blockdev_backup(const char *device, const char *target,
                         BlockdevOnError on_target_error,
                         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_target_error, on_target_error,
                       NULL, errp);
+1 −1
Original line number Diff line number Diff line
@@ -1127,7 +1127,7 @@ void hmp_drive_backup(Monitor *mon, const QDict *qdict)
        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,
                     true, mode, false, 0, false, NULL,
                     false, 0, false, 0, &err);
+5 −3
Original line number Diff line number Diff line
@@ -732,6 +732,8 @@ void mirror_start(const char *job_id, BlockDriverState *bs,

/*
 * 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.
 * @target: Block device to write to.
 * @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
 * until the job is cancelled or manually completed.
 */
void backup_start(BlockDriverState *bs, BlockDriverState *target,
                  int64_t speed, MirrorSyncMode sync_mode,
                  BdrvDirtyBitmap *sync_bitmap,
void backup_start(const char *job_id, BlockDriverState *bs,
                  BlockDriverState *target, int64_t speed,
                  MirrorSyncMode sync_mode, BdrvDirtyBitmap *sync_bitmap,
                  BlockdevOnError on_source_error,
                  BlockdevOnError on_target_error,
                  BlockCompletionFunc *cb, void *opaque,
+9 −3
Original line number Diff line number Diff line
@@ -866,6 +866,9 @@
##
# @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.
#
# @target: the target of the new image. If the file exists, or if it
@@ -903,8 +906,8 @@
# Since: 1.6
##
{ 'struct': 'DriveBackup',
  'data': { 'device': 'str', 'target': 'str', '*format': 'str',
            'sync': 'MirrorSyncMode', '*mode': 'NewImageMode',
  'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
            '*format': 'str', 'sync': 'MirrorSyncMode', '*mode': 'NewImageMode',
            '*speed': 'int', '*bitmap': 'str',
            '*on-source-error': 'BlockdevOnError',
            '*on-target-error': 'BlockdevOnError' } }
@@ -912,6 +915,9 @@
##
# @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.
#
# @target: the name of the backup target device.
@@ -938,7 +944,7 @@
# Since: 2.3
##
{ 'struct': 'BlockdevBackup',
  'data': { 'device': 'str', 'target': 'str',
  'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
            'sync': 'MirrorSyncMode',
            '*speed': 'int',
            '*on-source-error': 'BlockdevOnError',
Loading