|
@@ -12,51 +12,12 @@
|
|
|
#include "qemu/error-report.h"
|
|
|
#include "trace.h"
|
|
|
|
|
|
-/*
|
|
|
- * Migration-only cache to remember the block layer activation status.
|
|
|
- * Protected by BQL.
|
|
|
- *
|
|
|
- * We need this because..
|
|
|
- *
|
|
|
- * - Migration can fail after block devices are invalidated (during
|
|
|
- * switchover phase). When that happens, we need to be able to recover
|
|
|
- * the block drive status by re-activating them.
|
|
|
- *
|
|
|
- * - Currently bdrv_inactivate_all() is not safe to be invoked on top of
|
|
|
- * invalidated drives (even if bdrv_activate_all() is actually safe to be
|
|
|
- * called any time!). It means remembering this could help migration to
|
|
|
- * make sure it won't invalidate twice in a row, crashing QEMU. It can
|
|
|
- * happen when we migrate a PAUSED VM from host1 to host2, then migrate
|
|
|
- * again to host3 without starting it. TODO: a cleaner solution is to
|
|
|
- * allow safe invoke of bdrv_inactivate_all() at anytime, like
|
|
|
- * bdrv_activate_all().
|
|
|
- *
|
|
|
- * For freshly started QEMU, the flag is initialized to TRUE reflecting the
|
|
|
- * scenario where QEMU owns block device ownerships.
|
|
|
- *
|
|
|
- * For incoming QEMU taking a migration stream, the flag is initialized to
|
|
|
- * FALSE reflecting that the incoming side doesn't own the block devices,
|
|
|
- * not until switchover happens.
|
|
|
- */
|
|
|
-static bool migration_block_active;
|
|
|
-
|
|
|
-/* Setup the disk activation status */
|
|
|
-void migration_block_active_setup(bool active)
|
|
|
-{
|
|
|
- migration_block_active = active;
|
|
|
-}
|
|
|
-
|
|
|
bool migration_block_activate(Error **errp)
|
|
|
{
|
|
|
ERRP_GUARD();
|
|
|
|
|
|
assert(bql_locked());
|
|
|
|
|
|
- if (migration_block_active) {
|
|
|
- trace_migration_block_activation("active-skipped");
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
trace_migration_block_activation("active");
|
|
|
|
|
|
bdrv_activate_all(errp);
|
|
@@ -65,7 +26,6 @@ bool migration_block_activate(Error **errp)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- migration_block_active = true;
|
|
|
return true;
|
|
|
}
|
|
|
|
|
@@ -75,11 +35,6 @@ bool migration_block_inactivate(void)
|
|
|
|
|
|
assert(bql_locked());
|
|
|
|
|
|
- if (!migration_block_active) {
|
|
|
- trace_migration_block_activation("inactive-skipped");
|
|
|
- return true;
|
|
|
- }
|
|
|
-
|
|
|
trace_migration_block_activation("inactive");
|
|
|
|
|
|
ret = bdrv_inactivate_all();
|
|
@@ -89,6 +44,5 @@ bool migration_block_inactivate(void)
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- migration_block_active = false;
|
|
|
return true;
|
|
|
}
|