mirror of
https://github.com/mii443/qemu.git
synced 2025-08-22 15:15:46 +00:00
block/backup: support bitmap sync modes for non-bitmap backups
Accept bitmaps and sync policies for the other backup modes. This allows us to do things like create a bitmap synced to a full backup without a transaction, or start a resumable backup process. Some combinations don't make sense, though: - NEVER policy combined with any non-BITMAP mode doesn't do anything, because the bitmap isn't used for input or output. It's harmless, but is almost certainly never what the user wanted. - sync=NONE is more questionable. It can't use on-success because this job never completes with success anyway, and the resulting artifact of 'always' is suspect: because we start with a full bitmap and only copy out segments that get written to, the final output bitmap will always be ... a fully set bitmap. Maybe there's contexts in which bitmaps make sense for sync=none, but not without more severe changes to the current job, and omitting it here doesn't prevent us from adding it later. Signed-off-by: John Snow <jsnow@redhat.com> Reviewed-by: Max Reitz <mreitz@redhat.com> Message-id: 20190716000117.25219-11-jsnow@redhat.com Signed-off-by: John Snow <jsnow@redhat.com>
This commit is contained in:
22
blockdev.c
22
blockdev.c
@ -3567,6 +3567,28 @@ static BlockJob *do_backup_common(BackupCommon *backup,
|
||||
if (bdrv_dirty_bitmap_check(bmap, BDRV_BITMAP_ALLOW_RO, errp)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* This does not produce a useful bitmap artifact: */
|
||||
if (backup->sync == MIRROR_SYNC_MODE_NONE) {
|
||||
error_setg(errp, "sync mode '%s' does not produce meaningful bitmap"
|
||||
" outputs", MirrorSyncMode_str(backup->sync));
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* If the bitmap isn't used for input or output, this is useless: */
|
||||
if (backup->bitmap_mode == BITMAP_SYNC_MODE_NEVER &&
|
||||
backup->sync != MIRROR_SYNC_MODE_BITMAP) {
|
||||
error_setg(errp, "Bitmap sync mode '%s' has no meaningful effect"
|
||||
" when combined with sync mode '%s'",
|
||||
BitmapSyncMode_str(backup->bitmap_mode),
|
||||
MirrorSyncMode_str(backup->sync));
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
if (!backup->has_bitmap && backup->has_bitmap_mode) {
|
||||
error_setg(errp, "Cannot specify bitmap sync mode without a bitmap");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (!backup->auto_finalize) {
|
||||
|
Reference in New Issue
Block a user