From: Juraj Marcin <[email protected]> Commit 48814111366b ("migration: Always set DEVICE state") introduced DEVICE state to postcopy, which moved the actual state transition that leads to POSTCOPY_ACTIVE.
However, the error handling part of the postcopy_start() function still expects the state POSTCOPY_ACTIVE, but depending on where an error happens, now the state can be either ACTIVE, DEVICE or CANCELLING, but never POSTCOPY_ACTIVE, as this transition now happens just before a successful return from the function. Instead, accept any state except CANCELLING when transitioning to FAILED state. Cc: [email protected] Fixes: 48814111366b ("migration: Always set DEVICE state") Signed-off-by: Juraj Marcin <[email protected]> Reviewed-by: Peter Xu <[email protected]> Reviewed-by: Fabiano Rosas <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Peter Xu <[email protected]> (cherry picked from commit 725a9e5f7885a3c0d0cd82022d6eb5a758ac9d47) Signed-off-by: Michael Tokarev <[email protected]> diff --git a/migration/migration.c b/migration/migration.c index d46e776e24..50bd2dd51f 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2843,8 +2843,9 @@ static int postcopy_start(MigrationState *ms, Error **errp) fail_closefb: qemu_fclose(fb); fail: - migrate_set_state(&ms->state, MIGRATION_STATUS_POSTCOPY_ACTIVE, - MIGRATION_STATUS_FAILED); + if (ms->state != MIGRATION_STATUS_CANCELLING) { + migrate_set_state(&ms->state, ms->state, MIGRATION_STATUS_FAILED); + } migration_block_activate(NULL); migration_call_notifiers(ms, MIG_EVENT_PRECOPY_FAILED, NULL); bql_unlock(); -- 2.47.3
