diff --git a/migration.c b/migration.c index 41c3c24e09..6764d3a44c 100644 --- a/migration.c +++ b/migration.c @@ -398,6 +398,18 @@ static MigrationState *migrate_init(Monitor *mon, int detach, int blk, int inc) return s; } +static GSList *migration_blockers; + +void migrate_add_blocker(Error *reason) +{ + migration_blockers = g_slist_prepend(migration_blockers, reason); +} + +void migrate_del_blocker(Error *reason) +{ + migration_blockers = g_slist_remove(migration_blockers, reason); +} + int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) { MigrationState *s = migrate_get_current(); @@ -417,6 +429,12 @@ int do_migrate(Monitor *mon, const QDict *qdict, QObject **ret_data) return -1; } + if (migration_blockers) { + Error *err = migration_blockers->data; + qerror_report_err(err); + return -1; + } + s = migrate_init(mon, detach, blk, inc); if (strstart(uri, "tcp:", &p)) { diff --git a/migration.h b/migration.h index 1b8ee58530..0682179bde 100644 --- a/migration.h +++ b/migration.h @@ -17,6 +17,7 @@ #include "qdict.h" #include "qemu-common.h" #include "notify.h" +#include "error.h" typedef struct MigrationState MigrationState; @@ -89,4 +90,18 @@ int ram_load(QEMUFile *f, void *opaque, int version_id); extern int incoming_expected; +/** + * @migrate_add_blocker - prevent migration from proceeding + * + * @reason - an error to be returned whenever migration is attempted + */ +void migrate_add_blocker(Error *reason); + +/** + * @migrate_del_blocker - remove a blocking error from migration + * + * @reason - the error blocking migration + */ +void migrate_del_blocker(Error *reason); + #endif