From 31566a415b69d58fdf09f05e362685fcc3aee00b Mon Sep 17 00:00:00 2001 From: "Dr. David Alan Gilbert" Date: Thu, 7 Mar 2019 12:26:21 +0000 Subject: [PATCH 1/2] migration: Fix cancel state RH-Author: Dr. David Alan Gilbert Message-id: <20190307122622.9387-2-dgilbert@redhat.com> Patchwork-id: 84820 O-Subject: [RHEL-8.0 qemu-kvm AV PATCH 1/2] migration: Fix cancel state Bugzilla: 1608649 RH-Acked-by: Laurent Vivier RH-Acked-by: Peter Xu RH-Acked-by: Pankaj Gupta From: "Dr. David Alan Gilbert" During a cancelled migration there's a race where the fd can go into an error state before we get back around the migration loop and migration_detect_error transitions from cancelling->failed. Check for cancelled/cancelling and don't change the state. Red Hat bug: https://bugzilla.redhat.com/show_bug.cgi?id=1608649 Fixes: b23c2ade250 Signed-off-by: Dr. David Alan Gilbert Message-Id: <20190219195928.12289-1-dgilbert@redhat.com> Signed-off-by: Dr. David Alan Gilbert Reviewed-by: Peter Xu Reviewed-by: Juan Quintela (cherry picked from commit c3c5eae6ac69d9f7d4618407aa6c8ac5edc2267c) Signed-off-by: Danilo C. L. de Paula --- migration/migration.c | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/migration/migration.c b/migration/migration.c index 0d9cb7a..ecdf01d 100644 --- a/migration/migration.c +++ b/migration/migration.c @@ -2824,6 +2824,13 @@ static MigThrError postcopy_pause(MigrationState *s) static MigThrError migration_detect_error(MigrationState *s) { int ret; + int state = s->state; + + if (state == MIGRATION_STATUS_CANCELLING || + state == MIGRATION_STATUS_CANCELLED) { + /* End the migration, but don't set the state to failed */ + return MIG_THR_ERR_FATAL; + } /* Try to detect any file errors */ ret = qemu_file_get_error(s->to_dst_file); @@ -2833,7 +2840,7 @@ static MigThrError migration_detect_error(MigrationState *s) return MIG_THR_ERR_NONE; } - if (s->state == MIGRATION_STATUS_POSTCOPY_ACTIVE && ret == -EIO) { + if (state == MIGRATION_STATUS_POSTCOPY_ACTIVE && ret == -EIO) { /* * For postcopy, we allow the network to be down for a * while. After that, it can be continued by a @@ -2845,7 +2852,7 @@ static MigThrError migration_detect_error(MigrationState *s) * For precopy (or postcopy with error outside IO), we fail * with no time. */ - migrate_set_state(&s->state, s->state, MIGRATION_STATUS_FAILED); + migrate_set_state(&s->state, state, MIGRATION_STATUS_FAILED); trace_migration_thread_file_err(); /* Time to stop the migration, now. */ -- 1.8.3.1