job->dumpCompleted = false;
VIR_FREE(job->error);
VIR_FREE(job->current);
+ qemuMigrationParamsFree(job->migParams);
+ job->migParams = NULL;
}
void
job->asyncJob = priv->job.asyncJob;
job->asyncOwner = priv->job.asyncOwner;
job->phase = priv->job.phase;
+ VIR_STEAL_PTR(job->migParams, priv->job.migParams);
qemuDomainObjResetJob(priv);
qemuDomainObjResetAsyncJob(priv);
# include "qemu_agent.h"
# include "qemu_conf.h"
# include "qemu_capabilities.h"
+# include "qemu_migration_params.h"
# include "virmdev.h"
# include "virchrdev.h"
# include "virobject.h"
bool postcopyEnabled; /* post-copy migration was enabled */
char *error; /* job event completion error */
bool dumpCompleted; /* dump completed */
+
+ qemuMigrationParamsPtr migParams;
};
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
dataFD[1] = -1; /* 'st' owns the FD now & will close it */
}
+ if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
+ goto stopjob;
+
if (qemuMigrationParamsSetCompression(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
compression, migParams) < 0)
goto stopjob;
qemuMigrationSrcStoreDomainState(vm);
+ if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ goto endjob;
+
if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
ret = qemuMigrationSrcPerformPeer2Peer(driver, conn, vm, xmlin, persist_xml,
dconnuri, uri, graphicsuri, listenAddress,
virCloseCallbacksUnset(driver->closeCallbacks, vm,
qemuMigrationSrcCleanup);
+ if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
+ goto endjob;
+
ret = qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen,
cookieout, cookieoutlen,
flags, resource, NULL, graphicsuri,
}
+/**
+ * qemuMigrationParamsCheck:
+ *
+ * Check supported migration parameters and keep their original values in
+ * qemuDomainJobObj so that we can properly reset them at the end of migration.
+ */
+int
+qemuMigrationParamsCheck(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ int asyncJob)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ qemuMigrationParamsPtr origParams = NULL;
+ int ret = -1;
+
+ if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
+ return -1;
+
+ if (!(origParams = qemuMigrationParamsNew()))
+ goto cleanup;
+
+ if (qemuMonitorGetMigrationParams(priv->mon, &origParams->params) < 0)
+ goto cleanup;
+
+ ret = 0;
+
+ cleanup:
+ if (qemuDomainObjExitMonitor(driver, vm) < 0)
+ ret = -1;
+
+ if (ret == 0)
+ VIR_STEAL_PTR(priv->job.migParams, origParams);
+ qemuMigrationParamsFree(origParams);
+
+ return ret;
+}
+
+
/*
* qemuMigrationParamsReset:
*
qemuMigrationCompressionPtr compression,
qemuMigrationParamsPtr migParams);
+int
+qemuMigrationParamsCheck(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ int asyncJob);
+
void
qemuMigrationParamsReset(virQEMUDriverPtr driver,
virDomainObjPtr vm,