migration: Create migrate_cap_set()

And remove the convoluted use of qmp_migrate_set_capabilities() to
enable disable MIGRATION_CAPABILITY_BLOCK.

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Fabiano Rosas <farosas@suse.de>
This commit is contained in:
Juan Quintela 2023-03-01 21:02:42 +01:00
parent f9e1ef7482
commit 9eb1109cfb
1 changed files with 16 additions and 18 deletions

View File

@ -1912,25 +1912,24 @@ void migrate_set_state(int *state, int old_state, int new_state)
} }
} }
static MigrationCapabilityStatus *migrate_cap_add(MigrationCapability index, static bool migrate_cap_set(int cap, bool value, Error **errp)
bool state)
{ {
MigrationCapabilityStatus *cap; MigrationState *s = migrate_get_current();
bool new_caps[MIGRATION_CAPABILITY__MAX];
cap = g_new0(MigrationCapabilityStatus, 1); if (migration_is_running(s->state)) {
cap->capability = index; error_setg(errp, QERR_MIGRATION_ACTIVE);
cap->state = state; return false;
}
return cap; memcpy(new_caps, s->capabilities, sizeof(new_caps));
} new_caps[cap] = value;
void migrate_set_block_enabled(bool value, Error **errp) if (!migrate_caps_check(s->capabilities, new_caps, errp)) {
{ return false;
MigrationCapabilityStatusList *cap = NULL; }
s->capabilities[cap] = value;
QAPI_LIST_PREPEND(cap, migrate_cap_add(MIGRATION_CAPABILITY_BLOCK, value)); return true;
qmp_migrate_set_capabilities(cap, errp);
qapi_free_MigrationCapabilityStatusList(cap);
} }
static void migrate_set_block_incremental(MigrationState *s, bool value) static void migrate_set_block_incremental(MigrationState *s, bool value)
@ -1942,7 +1941,7 @@ static void block_cleanup_parameters(MigrationState *s)
{ {
if (s->must_remove_block_options) { if (s->must_remove_block_options) {
/* setting to false can never fail */ /* setting to false can never fail */
migrate_set_block_enabled(false, &error_abort); migrate_cap_set(MIGRATION_CAPABILITY_BLOCK, false, &error_abort);
migrate_set_block_incremental(s, false); migrate_set_block_incremental(s, false);
s->must_remove_block_options = false; s->must_remove_block_options = false;
} }
@ -2429,8 +2428,7 @@ static bool migrate_prepare(MigrationState *s, bool blk, bool blk_inc,
"current migration capabilities"); "current migration capabilities");
return false; return false;
} }
migrate_set_block_enabled(true, &local_err); if (!migrate_cap_set(MIGRATION_CAPABILITY_BLOCK, true, &local_err)) {
if (local_err) {
error_propagate(errp, local_err); error_propagate(errp, local_err);
return false; return false;
} }