MIGRATION_CAPABILITY_VALIDATE_UUID,
MIGRATION_CAPABILITY_ZERO_COPY_SEND);
+/* Snapshot compatibility check list */
+static const
+INITIALIZE_MIGRATE_CAPS_SET(check_caps_savevm,
+ MIGRATION_CAPABILITY_MULTIFD,
+ MIGRATION_CAPABILITY_MAPPED_RAM,
+);
+
static bool migrate_incoming_started(void)
{
return !!migration_incoming_get_current()->transport_data;
}
+bool migrate_can_snapshot(Error **errp)
+{
+ MigrationState *s = migrate_get_current();
+ int i;
+
+ for (i = 0; i < check_caps_savevm.size; i++) {
+ int incomp_cap = check_caps_savevm.caps[i];
+
+ if (s->capabilities[incomp_cap]) {
+ error_setg(errp,
+ "Snapshots are not compatible with %s",
+ MigrationCapability_str(incomp_cap));
+ return false;
+ }
+ }
+
+ return true;
+}
+
+
bool migrate_rdma_caps_check(bool *caps, Error **errp)
{
if (caps[MIGRATION_CAPABILITY_XBZRLE]) {
bool migrate_rdma_caps_check(bool *caps, Error **errp);
bool migrate_caps_check(bool *old_caps, bool *new_caps, Error **errp);
+bool migrate_can_snapshot(Error **errp);
/* parameters */
GLOBAL_STATE_CODE();
+ if (!migrate_can_snapshot(errp)) {
+ return false;
+ }
+
if (migration_is_blocked(errp)) {
return false;
}
int ret;
MigrationIncomingState *mis = migration_incoming_get_current();
+ if (!migrate_can_snapshot(errp)) {
+ return false;
+ }
+
if (!bdrv_all_can_snapshot(has_devices, devices, errp)) {
return false;
}