migration: dirty-bitmap: Allow control of bitmap persistence
Bitmap's source persistence is transported over the migration stream and the destination mirrors it. In some cases the destination might want to persist bitmaps which are not persistent on the source (e.g. the result of merging bitmaps from a number of layers on the source when migrating into a squashed image) but currently it would need to create another set of persistent bitmaps and merge them. This patch adds a 'transform' property to the alias map which allows overriding the persistence of migrated bitmaps both on the source and destination sides. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Message-Id: <b20afb675917b86f6359ac3591166ac6d4233573.1613150869.git.pkrempa@redhat.com> Reviewed-by: Eric Blake <eblake@redhat.com> [eblake: grammar tweaks, drop dead conditional] Signed-off-by: Eric Blake <eblake@redhat.com>
This commit is contained in:
parent
0d1e450c7b
commit
6e9f21a2aa
@ -150,6 +150,7 @@ typedef struct DBMLoadState {
|
||||
BdrvDirtyBitmap *bitmap;
|
||||
|
||||
bool before_vm_start_handled; /* set in dirty_bitmap_mig_before_vm_start */
|
||||
BitmapMigrationBitmapAlias *bmap_inner;
|
||||
|
||||
/*
|
||||
* cancelled
|
||||
@ -529,6 +530,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
||||
}
|
||||
|
||||
FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
|
||||
BitmapMigrationBitmapAliasTransform *bitmap_transform = NULL;
|
||||
bitmap_name = bdrv_dirty_bitmap_name(bitmap);
|
||||
if (!bitmap_name) {
|
||||
continue;
|
||||
@ -549,6 +551,9 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
||||
}
|
||||
|
||||
bitmap_alias = bmap_inner->alias;
|
||||
if (bmap_inner->has_transform) {
|
||||
bitmap_transform = bmap_inner->transform;
|
||||
}
|
||||
} else {
|
||||
if (strlen(bitmap_name) > UINT8_MAX) {
|
||||
error_report("Cannot migrate bitmap '%s' on node '%s': "
|
||||
@ -574,8 +579,15 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
||||
if (bdrv_dirty_bitmap_enabled(bitmap)) {
|
||||
dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
|
||||
}
|
||||
if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
|
||||
dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
||||
if (bitmap_transform &&
|
||||
bitmap_transform->has_persistent) {
|
||||
if (bitmap_transform->persistent) {
|
||||
dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
||||
}
|
||||
} else {
|
||||
if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
|
||||
dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
||||
}
|
||||
}
|
||||
|
||||
QSIMPLEQ_INSERT_TAIL(&s->dbms_list, dbms, entry);
|
||||
@ -783,6 +795,7 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
|
||||
uint32_t granularity = qemu_get_be32(f);
|
||||
uint8_t flags = qemu_get_byte(f);
|
||||
LoadBitmapState *b;
|
||||
bool persistent;
|
||||
|
||||
if (s->cancelled) {
|
||||
return 0;
|
||||
@ -807,7 +820,15 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
|
||||
if (s->bmap_inner &&
|
||||
s->bmap_inner->has_transform &&
|
||||
s->bmap_inner->transform->has_persistent) {
|
||||
persistent = s->bmap_inner->transform->persistent;
|
||||
} else {
|
||||
persistent = flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
||||
}
|
||||
|
||||
if (persistent) {
|
||||
bdrv_dirty_bitmap_set_persistence(s->bitmap, true);
|
||||
}
|
||||
|
||||
@ -1091,6 +1112,8 @@ static int dirty_bitmap_load_header(QEMUFile *f, DBMLoadState *s,
|
||||
} else {
|
||||
bitmap_name = bmap_inner->name;
|
||||
}
|
||||
|
||||
s->bmap_inner = bmap_inner;
|
||||
}
|
||||
|
||||
if (!s->cancelled) {
|
||||
|
@ -536,6 +536,19 @@
|
||||
'data': [ 'none', 'zlib',
|
||||
{ 'name': 'zstd', 'if': 'defined(CONFIG_ZSTD)' } ] }
|
||||
|
||||
##
|
||||
# @BitmapMigrationBitmapAliasTransform:
|
||||
#
|
||||
# @persistent: If present, the bitmap will be made persistent
|
||||
# or transient depending on this parameter.
|
||||
#
|
||||
# Since: 6.0
|
||||
##
|
||||
{ 'struct': 'BitmapMigrationBitmapAliasTransform',
|
||||
'data': {
|
||||
'*persistent': 'bool'
|
||||
} }
|
||||
|
||||
##
|
||||
# @BitmapMigrationBitmapAlias:
|
||||
#
|
||||
@ -544,12 +557,16 @@
|
||||
# @alias: An alias name for migration (for example the bitmap name on
|
||||
# the opposite site).
|
||||
#
|
||||
# @transform: Allows the modification of the migrated bitmap.
|
||||
# (since 6.0)
|
||||
#
|
||||
# Since: 5.2
|
||||
##
|
||||
{ 'struct': 'BitmapMigrationBitmapAlias',
|
||||
'data': {
|
||||
'name': 'str',
|
||||
'alias': 'str'
|
||||
'alias': 'str',
|
||||
'*transform': 'BitmapMigrationBitmapAliasTransform'
|
||||
} }
|
||||
|
||||
##
|
||||
|
Loading…
Reference in New Issue
Block a user