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