The response type of query-migrate-parameters is MigrationParameters,
the members of which are marked as optional in
migration.json. However, the design of query-migrate-parameters is
that all members are to be non-optional.
The optionality is an attempt at compatibility with
MigrateSetParameters, which needs it to allow migrate-set-parameters
to be given only a subset of parameters.
To satisfy the design of query-migrate-parameters, the
qmp_query_migrate_parameters function sets all (but one) has_* fields
of MigrationParameters to true before returning. The
block-bitmap-mapping parameter is instead set conditionally. This is
incorrect.
Since block-bitmap-mapping is allowed to be passed as input by the
user as an empty list, technically the empty list value output in
query-migrate-parameters has always been valid for that
parameter. Make the parameter non-optional like the rest of
MigrationParameters.
Signed-off-by: Fabiano Rosas <farosas@suse.de>
---
migration/migration-hmp-cmds.c | 36 ++++++++++++++++------------------
migration/options.c | 10 ++++------
2 files changed, 21 insertions(+), 25 deletions(-)
diff --git a/migration/migration-hmp-cmds.c b/migration/migration-hmp-cmds.c
index aacffdc532..685c8ebd53 100644
--- a/migration/migration-hmp-cmds.c
+++ b/migration/migration-hmp-cmds.c
@@ -240,6 +240,7 @@ void hmp_info_migrate_capabilities(Monitor *mon, const QDict *qdict)
void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
{
MigrationParameters *params;
+ const BitmapMigrationNodeAliasList *bmnal;
params = qmp_query_migrate_parameters(NULL);
@@ -319,29 +320,26 @@ void hmp_info_migrate_parameters(Monitor *mon, const QDict *qdict)
MigrationParameter_str(MIGRATION_PARAMETER_TLS_AUTHZ),
params->tls_authz ? params->tls_authz->u.s : "");
- if (params->has_block_bitmap_mapping) {
- const BitmapMigrationNodeAliasList *bmnal;
+ assert(params->has_block_bitmap_mapping);
+ monitor_printf(mon, "%s:\n",
+ MigrationParameter_str(
+ MIGRATION_PARAMETER_BLOCK_BITMAP_MAPPING));
- monitor_printf(mon, "%s:\n",
- MigrationParameter_str(
- MIGRATION_PARAMETER_BLOCK_BITMAP_MAPPING));
+ for (bmnal = params->block_bitmap_mapping;
+ bmnal;
+ bmnal = bmnal->next)
+ {
+ const BitmapMigrationNodeAlias *bmna = bmnal->value;
+ const BitmapMigrationBitmapAliasList *bmbal;
- for (bmnal = params->block_bitmap_mapping;
- bmnal;
- bmnal = bmnal->next)
- {
- const BitmapMigrationNodeAlias *bmna = bmnal->value;
- const BitmapMigrationBitmapAliasList *bmbal;
+ monitor_printf(mon, " '%s' -> '%s'\n",
+ bmna->node_name, bmna->alias);
- monitor_printf(mon, " '%s' -> '%s'\n",
- bmna->node_name, bmna->alias);
+ for (bmbal = bmna->bitmaps; bmbal; bmbal = bmbal->next) {
+ const BitmapMigrationBitmapAlias *bmba = bmbal->value;
- for (bmbal = bmna->bitmaps; bmbal; bmbal = bmbal->next) {
- const BitmapMigrationBitmapAlias *bmba = bmbal->value;
-
- monitor_printf(mon, " '%s' -> '%s'\n",
- bmba->name, bmba->alias);
- }
+ monitor_printf(mon, " '%s' -> '%s'\n",
+ bmba->name, bmba->alias);
}
}
diff --git a/migration/options.c b/migration/options.c
index d4021bc520..190001f8ac 100644
--- a/migration/options.c
+++ b/migration/options.c
@@ -989,12 +989,10 @@ MigrationParameters *qmp_query_migrate_parameters(Error **errp)
params->has_announce_step = true;
params->announce_step = s->parameters.announce_step;
- if (s->has_block_bitmap_mapping) {
- params->has_block_bitmap_mapping = true;
- params->block_bitmap_mapping =
- QAPI_CLONE(BitmapMigrationNodeAliasList,
- s->parameters.block_bitmap_mapping);
- }
+ params->has_block_bitmap_mapping = true;
+ params->block_bitmap_mapping =
+ QAPI_CLONE(BitmapMigrationNodeAliasList,
+ s->parameters.block_bitmap_mapping);
params->has_x_vcpu_dirty_limit_period = true;
params->x_vcpu_dirty_limit_period = s->parameters.x_vcpu_dirty_limit_period;
--
2.35.3