From: Juraj Marcin Date: Tue, 26 Aug 2025 11:51:40 +0000 (+0200) Subject: migration: Fix state transition in postcopy_start() error handling X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=725a9e5f7885a3c0d0cd82022d6eb5a758ac9d47;p=thirdparty%2Fqemu.git migration: Fix state transition in postcopy_start() error handling 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: qemu-stable@nongnu.org Fixes: 48814111366b ("migration: Always set DEVICE state") Signed-off-by: Juraj Marcin Reviewed-by: Peter Xu Reviewed-by: Fabiano Rosas Link: https://lore.kernel.org/r/20250826115145.871272-1-jmarcin@redhat.com Signed-off-by: Peter Xu --- diff --git a/migration/migration.c b/migration/migration.c index 3ff85098d5f..edb8ff0d461 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2878,8 +2878,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();