return true;
}
+
+
+static int
+virDomainCheckTPMChanges(virDomainDefPtr def,
+ virDomainDefPtr newDef)
+{
+ bool oldEnc, newEnc;
+
+ if (!def->tpm)
+ return 0;
+
+ switch (def->tpm->type) {
+ case VIR_DOMAIN_TPM_TYPE_EMULATOR:
+ if (virFileExists(def->tpm->data.emulator.storagepath)) {
+ /* VM has been started */
+ /* Once a VM was started with an encrypted state we allow
+ * less configuration changes.
+ */
+ oldEnc = def->tpm->data.emulator.hassecretuuid;
+ if (oldEnc && def->tpm->type != newDef->tpm->type) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Changing the type of TPM is not allowed"));
+ return -1;
+ }
+ if (oldEnc && !newDef->tpm) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Removing an encrypted TPM is not allowed"));
+ return -1;
+ }
+ newEnc = newDef->tpm->data.emulator.hassecretuuid;
+ if (oldEnc != newEnc) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("TPM state encryption cannot be changed "
+ "once VM was started"));
+ return -1;
+ }
+ }
+ break;
+ case VIR_DOMAIN_TPM_TYPE_PASSTHROUGH:
+ case VIR_DOMAIN_TPM_TYPE_LAST:
+ break;
+ }
+
+ return 0;
+}
+
+
+int
+virDomainCheckDeviceChanges(virDomainDefPtr def,
+ virDomainDefPtr newDef)
+{
+ if (!def || !newDef)
+ return 0;
+
+ return virDomainCheckTPMChanges(def, newDef);
+}
bool
virDomainGraphicsNeedsAutoRenderNode(const virDomainGraphicsDef *graphics);
+
+int
+virDomainCheckDeviceChanges(virDomainDefPtr def, virDomainDefPtr newDef)
+ ATTRIBUTE_NONNULL(2);
virDomainBootTypeToString;
virDomainCapabilitiesPolicyTypeToString;
virDomainCapsFeatureTypeToString;
+virDomainCheckDeviceChanges;
virDomainChrConsoleTargetTypeFromString;
virDomainChrConsoleTargetTypeToString;
virDomainChrDefForeach;
#include "qemu_migration_params.h"
#include "qemu_blockjob.h"
#include "qemu_security.h"
+#include "qemu_extdevice.h"
#include "virerror.h"
#include "virlog.h"
return qemuDomainCreateWithFlags(dom, 0);
}
+static int
+qemuDomainCheckDeviceChanges(virQEMUDriverPtr driver,
+ virDomainDefPtr def)
+{
+ virDomainObjPtr vm;
+ int ret;
+
+ vm = virDomainObjListFindByUUID(driver->domains, def->uuid);
+ if (!vm)
+ return 0;
+
+ if (qemuExtDevicesInitPaths(driver, vm->def) < 0) {
+ ret = -1;
+ goto cleanup;
+ }
+
+ ret = virDomainCheckDeviceChanges(vm->def, def);
+
+ cleanup:
+ virDomainObjEndAPI(&vm);
+
+ return ret;
+}
+
static virDomainPtr
qemuDomainDefineXMLFlags(virConnectPtr conn,
const char *xml,
if (virDomainDefineXMLFlagsEnsureACL(conn, def) < 0)
goto cleanup;
+ if (qemuDomainCheckDeviceChanges(driver, def) < 0)
+ goto cleanup;
+
if (!(vm = virDomainObjListAdd(driver->domains, def,
driver->xmlopt,
0, &oldDef)))
* stored and we can remove directories and files in case of domain XML
* changes.
*/
-static int
+int
qemuExtDevicesInitPaths(virQEMUDriverPtr driver,
virDomainDefPtr def)
{
int qemuExtDevicesSetupCgroup(virQEMUDriverPtr driver,
virDomainDefPtr def,
virCgroupPtr cgroup);
+
+int qemuExtDevicesInitPaths(virQEMUDriverPtr driver,
+ virDomainDefPtr def);