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: 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:
Pavel Butsykin 2016-07-22 11:17:53 +03:00 committed by Kevin Wolf
parent 13b9414b57
commit 3b7b123659
3 changed files with 12 additions and 3 deletions

View file

@ -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)
} }
} }
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);
} }

View file

@ -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 @@
'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' } }

View file

@ -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:
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.