return ret;
}
-int
-qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
- virDomainDefPtr def,
- unsigned int flags,
- virBuffer *buf)
+
+static int
+qemuDomainDefFormatBufInternal(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ virCPUDefPtr origCPU,
+ unsigned int flags,
+ virBuffer *buf)
{
int ret = -1;
virDomainDefPtr copy = NULL;
if (qemuDomainChrDefDropDefaultPath(def->channels[i], driver) < 0)
goto cleanup;
}
+
+ /* Replace the CPU definition updated according to QEMU with the one
+ * used for starting the domain. The updated def will be sent
+ * separately for backward compatibility.
+ */
+ if (origCPU) {
+ virCPUDefFree(def->cpu);
+ if (!(def->cpu = virCPUDefCopy(origCPU)))
+ goto cleanup;
+ }
}
format:
return ret;
}
-char *qemuDomainDefFormatXML(virQEMUDriverPtr driver,
- virDomainDefPtr def,
- unsigned int flags)
+
+int
+qemuDomainDefFormatBuf(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ unsigned int flags,
+ virBufferPtr buf)
+{
+ return qemuDomainDefFormatBufInternal(driver, def, NULL, flags, buf);
+}
+
+
+static char *
+qemuDomainDefFormatXMLInternal(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ virCPUDefPtr origCPU,
+ unsigned int flags)
{
virBuffer buf = VIR_BUFFER_INITIALIZER;
- if (qemuDomainDefFormatBuf(driver, def, flags, &buf) < 0) {
+ if (qemuDomainDefFormatBufInternal(driver, def, origCPU, flags, &buf) < 0) {
virBufferFreeAndReset(&buf);
return NULL;
}
return virBufferContentAndReset(&buf);
}
+
+char *
+qemuDomainDefFormatXML(virQEMUDriverPtr driver,
+ virDomainDefPtr def,
+ unsigned int flags)
+{
+ return qemuDomainDefFormatXMLInternal(driver, def, NULL, flags);
+}
+
+
char *qemuDomainFormatXML(virQEMUDriverPtr driver,
virDomainObjPtr vm,
unsigned int flags)
{
virDomainDefPtr def;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ virCPUDefPtr origCPU = NULL;
if ((flags & VIR_DOMAIN_XML_INACTIVE) && vm->newDef) {
def = vm->newDef;
} else {
def = vm->def;
+ origCPU = priv->origCPU;
if (virDomainObjIsActive(vm))
flags &= ~VIR_DOMAIN_XML_UPDATE_CPU;
}
- return qemuDomainDefFormatXML(driver, def, flags);
+ return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags);
}
char *
qemuDomainDefFormatLive(virQEMUDriverPtr driver,
virDomainDefPtr def,
+ virCPUDefPtr origCPU,
bool inactive,
bool compatible)
{
if (compatible)
flags |= VIR_DOMAIN_XML_MIGRATABLE;
- return qemuDomainDefFormatXML(driver, def, flags);
+ return qemuDomainDefFormatXMLInternal(driver, def, origCPU, flags);
}
char *qemuDomainDefFormatLive(virQEMUDriverPtr driver,
virDomainDefPtr def,
+ virCPUDefPtr origCPU,
bool inactive,
bool compatible);
virDomainDefFree(def);
goto endjob;
}
- xml = qemuDomainDefFormatLive(driver, def, true, true);
+ xml = qemuDomainDefFormatLive(driver, def, NULL, true, true);
} else {
- xml = qemuDomainDefFormatLive(driver, vm->def, true, true);
+ xml = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU, true, true);
}
if (!xml) {
virReportError(VIR_ERR_OPERATION_FAILED,
"snapshot", false)) < 0)
goto cleanup;
- if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)) ||
+ if (!(xml = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU,
+ true, true)) ||
!(snap->def->cookie = (virObjectPtr) qemuDomainSaveCookieNew(vm)))
goto cleanup;
bool align_match = true;
virQEMUDriverConfigPtr cfg = NULL;
virCapsPtr caps = NULL;
+ qemuDomainObjPrivatePtr priv;
virCheckFlags(VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE |
VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT |
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
+ priv = vm->privateData;
+
if (redefine) {
if (virDomainSnapshotRedefinePrep(domain, vm, &def, &snap,
driver->xmlopt,
} else {
/* Easiest way to clone inactive portion of vm->def is via
* conversion in and back out of xml. */
- if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)) ||
+ if (!(xml = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU,
+ true, true)) ||
!(def->dom = virDomainDefParseString(xml, caps, driver->xmlopt, NULL,
VIR_DOMAIN_DEF_PARSE_INACTIVE |
VIR_DOMAIN_DEF_PARSE_SKIP_VALIDATE)))
if (!qemuDomainDefCheckABIStability(driver, vm->def, def))
goto cleanup;
- rv = qemuDomainDefFormatLive(driver, def, false, true);
+ rv = qemuDomainDefFormatLive(driver, def, NULL, false, true);
} else {
- rv = qemuDomainDefFormatLive(driver, vm->def, false, true);
+ rv = qemuDomainDefFormatLive(driver, vm->def, priv->origCPU,
+ false, true);
}
cleanup: