As qemu driver doesn't allow to make changes on persistent domain configuration via "attach/detach/update device", and all the changes made on the running domain configuration should not be persistent across next boot (without the need of restarting libvirtd), so: 1) Set the running domain def as transient, and restore the domain configuration to original configuration when shutdown. 2) Set the running domain def as updated, and reset it as not updated when shutdown. Also for "live VCPU set", it doesn't change the persistent domain configuration, so, we also set the running domain def as updated and transient, and restore the original def when shutdown. * src/qemu/qemu_driver.c --- src/qemu/qemu_driver.c | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 47 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 19ce9a6..a3d87eb 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -4429,11 +4429,18 @@ retry: VIR_FREE(priv->vcpupids); priv->nvcpupids = 0; + /* Restore original domain def, so that changes on running domain def + * will not be persistent across next boot. + */ if (vm->newDef) { virDomainDefFree(vm->def); vm->def = vm->newDef; vm->def->id = -1; vm->newDef = NULL; + + /* Now set domain def as not updated */ + if (vm->updated) + vm->updated = 0; } if (orig_err) { @@ -6473,7 +6480,17 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus, break; case VIR_DOMAIN_VCPU_LIVE: + if (virDomainObjSetDefTransient(driver->caps, vm) < 0) { + VIR_ERROR("Unable to set domain %s's running config as transient", + vm->def->name); + + goto endjob; + } + ret = qemudDomainHotplugVcpus(vm, nvcpus); + + if (ret == 0) + vm->updated = 1; break; case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG: @@ -8819,6 +8836,13 @@ static int qemudDomainAttachDevice(virDomainPtr dom, goto endjob; } + if (virDomainObjSetDefTransient(driver->caps, vm) < 0) { + VIR_ERROR("Unable to set domain %s's running config as transient", + vm->def->name); + + goto endjob; + } + dev = virDomainDeviceDefParse(driver->caps, vm->def, xml, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) @@ -8916,6 +8940,9 @@ static int qemudDomainAttachDevice(virDomainPtr dom, goto endjob; } + if (ret == 0) + vm->updated = 1; + if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) ret = -1; @@ -9066,6 +9093,13 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom, goto endjob; } + if (virDomainObjSetDefTransient(driver->caps, vm) < 0) { + VIR_ERROR("Unable to set domain %s's running config as transient", + vm->def->name); + + goto endjob; + } + dev = virDomainDeviceDefParse(driver->caps, vm->def, xml, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) @@ -9126,6 +9160,9 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom, break; } + if (ret == 0) + vm->updated = 1; + if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) ret = -1; @@ -9786,6 +9823,13 @@ static int qemudDomainDetachDevice(virDomainPtr dom, goto endjob; } + if (virDomainObjSetDefTransient(driver->caps, vm) < 0) { + VIR_ERROR("Unable to set domain %s's running config as transient", + vm->def->name); + + goto endjob; + } + dev = virDomainDeviceDefParse(driver->caps, vm->def, xml, VIR_DOMAIN_XML_INACTIVE); if (dev == NULL) @@ -9828,6 +9872,9 @@ static int qemudDomainDetachDevice(virDomainPtr dom, "%s", _("This type of device cannot be hot unplugged")); } + if (ret == 0) + vm->updated = 1; + if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0) ret = -1; -- 1.7.3.2 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list