On 06/09/2017 15:40, Dr. David Alan Gilbert wrote: >> There's a race if someone does a 'stop' near the end of migrate; >> the migration process goes through two runstates: >> 'finish migrate' >> 'postmigrate' >> >> If the user issues a 'stop' between the two we end up with invalid >> state transitions. >> Add the transitions as valid. >> >> Signed-off-by: Dr. David Alan Gilbert <dgilb...@redhat.com> > Queued > >> --- >> vl.c | 2 ++ >> 1 file changed, 2 insertions(+) >> >> diff --git a/vl.c b/vl.c >> index 99fcfa0442..bacb03f49d 100644 >> --- a/vl.c >> +++ b/vl.c >> @@ -621,6 +621,7 @@ static const RunStateTransition >> runstate_transitions_def[] = { >> >> { RUN_STATE_PAUSED, RUN_STATE_RUNNING }, >> { RUN_STATE_PAUSED, RUN_STATE_FINISH_MIGRATE }, >> + { RUN_STATE_PAUSED, RUN_STATE_POSTMIGRATE },
There is: if (s->state == MIGRATION_STATUS_COMPLETED) { ... runstate_set(RUN_STATE_POSTMIGRATE); } else { ... if (old_vm_running && !entered_postcopy) { vm_start(); } else { if (runstate_check(RUN_STATE_FINISH_MIGRATE)) { runstate_set(RUN_STATE_POSTMIGRATE); } } } Maybe the runstate_check should be in the "then" branch too, instead of adding this transition? Paolo >> { RUN_STATE_PAUSED, RUN_STATE_PRELAUNCH }, >> { RUN_STATE_PAUSED, RUN_STATE_COLO}, >> >> @@ -633,6 +634,7 @@ static const RunStateTransition >> runstate_transitions_def[] = { >> { RUN_STATE_PRELAUNCH, RUN_STATE_INMIGRATE }, >> >> { RUN_STATE_FINISH_MIGRATE, RUN_STATE_RUNNING }, >> + { RUN_STATE_FINISH_MIGRATE, RUN_STATE_PAUSED }, >> { RUN_STATE_FINISH_MIGRATE, RUN_STATE_POSTMIGRATE }, >> { RUN_STATE_FINISH_MIGRATE, RUN_STATE_PRELAUNCH }, >> { RUN_STATE_FINISH_MIGRATE, RUN_STATE_COLO}, >> -- >> 2.13.3 >> >>