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


Reply via email to