提交 3b7b1236 编写于 作者: P Pavel Butsykin 提交者: Kevin Wolf

blockdev-backup: added support for data compression

The idea is simple - backup is "written-once" data. It is written block
by block and it is large enough. It would be nice to save storage
space and compress it.
Signed-off-by: NPavel Butsykin <pbutsykin@virtuozzo.com>
Reviewed-by: NStefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: NDenis 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: NKevin Wolf <kwolf@redhat.com>
上级 13b9414b
...@@ -3254,6 +3254,9 @@ void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn, Error **errp) ...@@ -3254,6 +3254,9 @@ void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn, Error **errp)
if (!backup->has_job_id) { if (!backup->has_job_id) {
backup->job_id = NULL; backup->job_id = NULL;
} }
if (!backup->has_compress) {
backup->compress = false;
}
bs = qmp_get_root_bs(backup->device, errp); bs = qmp_get_root_bs(backup->device, errp);
if (!bs) { if (!bs) {
...@@ -3280,8 +3283,8 @@ void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn, Error **errp) ...@@ -3280,8 +3283,8 @@ void do_blockdev_backup(BlockdevBackup *backup, BlockJobTxn *txn, Error **errp)
} }
} }
backup_start(backup->job_id, bs, target_bs, backup->speed, backup->sync, backup_start(backup->job_id, bs, target_bs, backup->speed, backup->sync,
NULL, false, backup->on_source_error, backup->on_target_error, NULL, backup->compress, backup->on_source_error,
block_job_cb, bs, txn, &local_err); 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);
} }
......
...@@ -939,6 +939,9 @@ ...@@ -939,6 +939,9 @@
# @speed: #optional the maximum speed, in bytes per second. The default is 0, # @speed: #optional the maximum speed, in bytes per second. The default is 0,
# for unlimited. # for unlimited.
# #
# @compress: #optional true to compress data, if the target format supports it.
# (default: false) (since 2.7)
#
# @on-source-error: #optional the action to take on an error on the source, # @on-source-error: #optional the action to take on an error on the source,
# default 'report'. 'stop' and 'enospc' can only be used # default 'report'. 'stop' and 'enospc' can only be used
# if the block device supports io-status (see BlockInfo). # if the block device supports io-status (see BlockInfo).
...@@ -957,6 +960,7 @@ ...@@ -957,6 +960,7 @@
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str', 'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
'sync': 'MirrorSyncMode', 'sync': 'MirrorSyncMode',
'*speed': 'int', '*speed': 'int',
'*compress': 'bool',
'*on-source-error': 'BlockdevOnError', '*on-source-error': 'BlockdevOnError',
'*on-target-error': 'BlockdevOnError' } } '*on-target-error': 'BlockdevOnError' } }
......
...@@ -1275,7 +1275,7 @@ EQMP ...@@ -1275,7 +1275,7 @@ EQMP
{ {
.name = "blockdev-backup", .name = "blockdev-backup",
.args_type = "job-id:s?,sync:s,device:B,target:B,speed:i?," .args_type = "job-id:s?,sync:s,device:B,target:B,speed:i?,compress:b?,"
"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,
}, },
...@@ -1299,6 +1299,8 @@ Arguments: ...@@ -1299,6 +1299,8 @@ Arguments:
sectors allocated in the topmost image, or "none" to only replicate sectors allocated in the topmost image, or "none" to only replicate
new I/O (MirrorSyncMode). new I/O (MirrorSyncMode).
- "speed": the maximum speed, in bytes per second (json-int, optional) - "speed": the maximum speed, in bytes per second (json-int, optional)
- "compress": true to compress data, if the target format supports it.
(json-bool, optional, default false)
- "on-source-error": the action to take on an error on the source, default - "on-source-error": the action to take on an error on the source, default
'report'. 'stop' and 'enospc' can only be used 'report'. 'stop' and 'enospc' can only be used
if the block device supports io-status. if the block device supports io-status.
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册