blockdev-backup: add bitmap argument
It is only an oversight that we don't allow incremental backup with blockdev-backup. Add the bitmap argument which enables this. Signed-off-by: John Snow <jsnow@redhat.com> Message-id: 20180830211605.13683-2-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
parent
62b658db1d
commit
945c1ee0cb
18
blockdev.c
18
blockdev.c
|
@ -3545,6 +3545,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||||
BlockDriverState *bs;
|
BlockDriverState *bs;
|
||||||
BlockDriverState *target_bs;
|
BlockDriverState *target_bs;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
BdrvDirtyBitmap *bmap = NULL;
|
||||||
AioContext *aio_context;
|
AioContext *aio_context;
|
||||||
BlockJob *job = NULL;
|
BlockJob *job = NULL;
|
||||||
int job_flags = JOB_DEFAULT;
|
int job_flags = JOB_DEFAULT;
|
||||||
|
@ -3595,6 +3596,21 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (backup->has_bitmap) {
|
||||||
|
bmap = bdrv_find_dirty_bitmap(bs, backup->bitmap);
|
||||||
|
if (!bmap) {
|
||||||
|
error_setg(errp, "Bitmap '%s' could not be found", backup->bitmap);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
if (bdrv_dirty_bitmap_qmp_locked(bmap)) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Bitmap '%s' is currently locked and cannot be used for "
|
||||||
|
"backup", backup->bitmap);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!backup->auto_finalize) {
|
if (!backup->auto_finalize) {
|
||||||
job_flags |= JOB_MANUAL_FINALIZE;
|
job_flags |= JOB_MANUAL_FINALIZE;
|
||||||
}
|
}
|
||||||
|
@ -3602,7 +3618,7 @@ BlockJob *do_blockdev_backup(BlockdevBackup *backup, JobTxn *txn,
|
||||||
job_flags |= JOB_MANUAL_DISMISS;
|
job_flags |= JOB_MANUAL_DISMISS;
|
||||||
}
|
}
|
||||||
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
job = backup_job_create(backup->job_id, bs, target_bs, backup->speed,
|
||||||
backup->sync, NULL, backup->compress,
|
backup->sync, bmap, backup->compress,
|
||||||
backup->on_source_error, backup->on_target_error,
|
backup->on_source_error, backup->on_target_error,
|
||||||
job_flags, NULL, NULL, txn, &local_err);
|
job_flags, NULL, NULL, txn, &local_err);
|
||||||
if (local_err != NULL) {
|
if (local_err != NULL) {
|
||||||
|
|
|
@ -1316,6 +1316,10 @@
|
||||||
# @speed: the maximum speed, in bytes per second. The default is 0,
|
# @speed: the maximum speed, in bytes per second. The default is 0,
|
||||||
# for unlimited.
|
# 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.
|
# @compress: true to compress data, if the target format supports it.
|
||||||
# (default: false) (since 2.8)
|
# (default: false) (since 2.8)
|
||||||
#
|
#
|
||||||
|
@ -1348,7 +1352,8 @@
|
||||||
##
|
##
|
||||||
{ 'struct': 'BlockdevBackup',
|
{ 'struct': 'BlockdevBackup',
|
||||||
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
'data': { '*job-id': 'str', 'device': 'str', 'target': 'str',
|
||||||
'sync': 'MirrorSyncMode', '*speed': 'int', '*compress': 'bool',
|
'sync': 'MirrorSyncMode', '*speed': 'int',
|
||||||
|
'*bitmap': 'str', '*compress': 'bool',
|
||||||
'*on-source-error': 'BlockdevOnError',
|
'*on-source-error': 'BlockdevOnError',
|
||||||
'*on-target-error': 'BlockdevOnError',
|
'*on-target-error': 'BlockdevOnError',
|
||||||
'*auto-finalize': 'bool', '*auto-dismiss': 'bool' } }
|
'*auto-finalize': 'bool', '*auto-dismiss': 'bool' } }
|
||||||
|
|
Loading…
Reference in New Issue