mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-01 23:03:54 -06:00
migration: disallow migrate_add_blocker during migration
If a migration is already in progress and somebody attempts to add a migration blocker, this should rightly fail. Add an errp parameter and a retcode return value to migrate_add_blocker. Signed-off-by: John Snow <jsnow@redhat.com> Signed-off-by: Ashijeet Acharya <ashijeetacharya@gmail.com> Message-Id: <1484566314-3987-5-git-send-email-ashijeetacharya@gmail.com> Reviewed-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Acked-by: Greg Kurz <groug@kaod.org> Signed-off-by: Dr. David Alan Gilbert <dgilbert@redhat.com> Merged with recent 'Allow invtsc migration' change
This commit is contained in:
parent
a3a3d8c738
commit
fe44dc9180
18 changed files with 222 additions and 81 deletions
|
@ -1044,6 +1044,31 @@ bool migration_in_postcopy_after_devices(MigrationState *s)
|
|||
return migration_in_postcopy(s) && s->postcopy_after_devices;
|
||||
}
|
||||
|
||||
bool migration_is_idle(MigrationState *s)
|
||||
{
|
||||
if (!s) {
|
||||
s = migrate_get_current();
|
||||
}
|
||||
|
||||
switch (s->state) {
|
||||
case MIGRATION_STATUS_NONE:
|
||||
case MIGRATION_STATUS_CANCELLED:
|
||||
case MIGRATION_STATUS_COMPLETED:
|
||||
case MIGRATION_STATUS_FAILED:
|
||||
return true;
|
||||
case MIGRATION_STATUS_SETUP:
|
||||
case MIGRATION_STATUS_CANCELLING:
|
||||
case MIGRATION_STATUS_ACTIVE:
|
||||
case MIGRATION_STATUS_POSTCOPY_ACTIVE:
|
||||
case MIGRATION_STATUS_COLO:
|
||||
return false;
|
||||
case MIGRATION_STATUS__MAX:
|
||||
g_assert_not_reached();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
MigrationState *migrate_init(const MigrationParams *params)
|
||||
{
|
||||
MigrationState *s = migrate_get_current();
|
||||
|
@ -1086,9 +1111,17 @@ MigrationState *migrate_init(const MigrationParams *params)
|
|||
|
||||
static GSList *migration_blockers;
|
||||
|
||||
void migrate_add_blocker(Error *reason)
|
||||
int migrate_add_blocker(Error *reason, Error **errp)
|
||||
{
|
||||
migration_blockers = g_slist_prepend(migration_blockers, reason);
|
||||
if (migration_is_idle(NULL)) {
|
||||
migration_blockers = g_slist_prepend(migration_blockers, reason);
|
||||
return 0;
|
||||
}
|
||||
|
||||
error_propagate(errp, error_copy(reason));
|
||||
error_prepend(errp, "disallowing migration blocker (migration in "
|
||||
"progress) for: ");
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
void migrate_del_blocker(Error *reason)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue