diff --git a/qapi-block-core-Introduce-BackupCommon.patch b/qapi-block-core-Introduce-BackupCommon.patch new file mode 100644 index 0000000..2d16074 --- /dev/null +++ b/qapi-block-core-Introduce-BackupCommon.patch @@ -0,0 +1,171 @@ +From 2204b4839fb90658e13ddc608df7b35ed1ea9fd0 Mon Sep 17 00:00:00 2001 +From: John Snow +Date: Mon, 29 Jul 2019 16:35:52 -0400 +Subject: [PATCH] qapi/block-core: Introduce BackupCommon + +drive-backup and blockdev-backup have an awful lot of things in common +that are the same. Let's fix that. + +I don't deduplicate 'target', because the semantics actually did change +between each structure. Leave that one alone so it can be documented +separately. + +Where documentation was not identical, use the most up-to-date version. +For "speed", use Blockdev-Backup's version. For "sync", use +Drive-Backup's version. + +Signed-off-by: John Snow +Reviewed-by: Max Reitz +[Maintainer edit: modified commit message. --js] +Reviewed-by: Markus Armbruster +Message-id: 20190709232550.10724-2-jsnow@redhat.com +Signed-off-by: John Snow +--- + qapi/block-core.json | 95 ++++++++++++++------------------------------ + 1 file changed, 29 insertions(+), 66 deletions(-) + +diff --git a/qapi/block-core.json b/qapi/block-core.json +index db24f0dfe5..37aa1b7b9a 100644 +--- a/qapi/block-core.json ++++ b/qapi/block-core.json +@@ -1315,32 +1315,23 @@ + 'data': { 'node': 'str', 'overlay': 'str' } } + + ## +-# @DriveBackup: ++# @BackupCommon: + # + # @job-id: identifier for the newly-created block job. If + # omitted, the device name will be used. (Since 2.7) + # + # @device: the device name or node-name of a root node which should be copied. + # +-# @target: the target of the new image. If the file exists, or if it +-# is a device, the existing file/device will be used as the new +-# destination. If it does not exist, a new file will be created. +-# +-# @format: the format of the new destination, default is to +-# probe if @mode is 'existing', else the format of the source +-# + # @sync: what parts of the disk image should be copied to the destination + # (all the disk, only the sectors allocated in the topmost image, from a + # dirty bitmap, or only new I/O). + # +-# @mode: whether and how QEMU should create a new image, default is +-# 'absolute-paths'. +-# +-# @speed: the maximum speed, in bytes per second ++# @speed: the maximum speed, in bytes per second. The default is 0, ++# for unlimited. + # + # @bitmap: the name of dirty bitmap if sync is "incremental". + # Must be present if sync is "incremental", must NOT be present +-# otherwise. (Since 2.4) ++# otherwise. (Since 2.4 (drive-backup), 3.1 (blockdev-backup)) + # + # @compress: true to compress data, if the target format supports it. + # (default: false) (since 2.8) +@@ -1370,75 +1361,47 @@ + # I/O. If an error occurs during a guest write request, the device's + # rerror/werror actions will be used. + # +-# Since: 1.6 ++# Since: 4.2 + ## +-{ 'struct': 'DriveBackup', +- 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', +- '*format': 'str', 'sync': 'MirrorSyncMode', +- '*mode': 'NewImageMode', '*speed': 'int', ++{ 'struct': 'BackupCommon', ++ 'data': { '*job-id': 'str', 'device': 'str', ++ 'sync': 'MirrorSyncMode', '*speed': 'int', + '*bitmap': 'str', '*compress': 'bool', + '*on-source-error': 'BlockdevOnError', + '*on-target-error': 'BlockdevOnError', + '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } } + + ## +-# @BlockdevBackup: +-# +-# @job-id: identifier for the newly-created block job. If +-# omitted, the device name will be used. (Since 2.7) +-# +-# @device: the device name or node-name of a root node which should be copied. +-# +-# @target: the device name or node-name of the backup target node. +-# +-# @sync: what parts of the disk image should be copied to the destination +-# (all the disk, only the sectors allocated in the topmost image, or +-# only new I/O). +-# +-# @speed: the maximum speed, in bytes per second. The default is 0, +-# for unlimited. +-# +-# @bitmap: the name of dirty bitmap if sync is "incremental". +-# Must be present if sync is "incremental", must NOT be present +-# otherwise. (Since 3.1) +-# +-# @compress: true to compress data, if the target format supports it. +-# (default: false) (since 2.8) ++# @DriveBackup: + # +-# @on-source-error: the action to take on an error on the source, +-# default 'report'. 'stop' and 'enospc' can only be used +-# if the block device supports io-status (see BlockInfo). ++# @target: the target of the new image. If the file exists, or if it ++# is a device, the existing file/device will be used as the new ++# destination. If it does not exist, a new file will be created. + # +-# @on-target-error: the action to take on an error on the target, +-# default 'report' (no limitations, since this applies to +-# a different block device than @device). ++# @format: the format of the new destination, default is to ++# probe if @mode is 'existing', else the format of the source + # +-# @auto-finalize: When false, this job will wait in a PENDING state after it has +-# finished its work, waiting for @block-job-finalize before +-# making any block graph changes. +-# When true, this job will automatically +-# perform its abort or commit actions. +-# Defaults to true. (Since 2.12) ++# @mode: whether and how QEMU should create a new image, default is ++# 'absolute-paths'. + # +-# @auto-dismiss: When false, this job will wait in a CONCLUDED state after it +-# has completely ceased all work, and awaits @block-job-dismiss. +-# When true, this job will automatically disappear from the query +-# list without user intervention. +-# Defaults to true. (Since 2.12) ++# Since: 1.6 ++## ++{ 'struct': 'DriveBackup', ++ 'base': 'BackupCommon', ++ 'data': { 'target': 'str', ++ '*format': 'str', ++ '*mode': 'NewImageMode' } } ++ ++## ++# @BlockdevBackup: + # +-# Note: @on-source-error and @on-target-error only affect background +-# I/O. If an error occurs during a guest write request, the device's +-# rerror/werror actions will be used. ++# @target: the device name or node-name of the backup target node. + # + # Since: 2.3 + ## + { 'struct': 'BlockdevBackup', +- 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', +- 'sync': 'MirrorSyncMode', '*speed': 'int', +- '*bitmap': 'str', '*compress': 'bool', +- '*on-source-error': 'BlockdevOnError', +- '*on-target-error': 'BlockdevOnError', +- '*auto-finalize': 'bool', '*auto-dismiss': 'bool' } } ++ 'base': 'BackupCommon', ++ 'data': { 'target': 'str' } } + + ## + # @blockdev-snapshot-sync: +-- +2.27.0 +