[libvirt] [PATCH] qemu: Set domain def as updated and transient if changes

Osier Yang jyang at redhat.com
Mon Dec 6 12:35:20 UTC 2010


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 (qemudDomainSetVcpusFlags,
qemudDomainAttachDevice, qemuDomainUpdateDeviceFlags,
qemudDomainDetachDevice)
---
 src/qemu/qemu_driver.c |   45 +++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 45 insertions(+), 0 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 1b86b5e..7825e2b 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -4369,11 +4369,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) {
@@ -6353,6 +6360,17 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
     if (flags & VIR_DOMAIN_VCPU_CONFIG)
         ret = virDomainSaveConfig(driver->configDir, persistentDef);

+    if (flags & VIR_DOMAIN_VCPU_LIVE) {
+        /* Set running domain def as updated */
+        if (ret == 0) {
+            vm->updated = 1;
+
+            if (virDomainObjSetDefTransient(driver->caps, vm) < 0)
+                VIR_ERROR("Unable to set domain %s's running config as transient",
+                          vm->def->name);
+        }
+    }
+
 endjob:
     if (qemuDomainObjEndJob(vm) == 0)
         vm = NULL;
@@ -8781,6 +8799,15 @@ static int qemudDomainAttachDevice(virDomainPtr dom,
         goto endjob;
     }

+    /* Set running domain def as updated */
+    if (ret == 0) {
+        vm->updated = 1;
+
+        if (virDomainObjSetDefTransient(driver->caps, vm) < 0)
+            VIR_ERROR("Unable to set domain %s's running config as transient",
+                      vm->def->name);
+    }
+
     if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
         ret = -1;

@@ -8991,6 +9018,15 @@ static int qemuDomainUpdateDeviceFlags(virDomainPtr dom,
         break;
     }

+    /* Set running domain def as updated */
+    if (ret == 0) {
+        vm->updated = 1;
+
+        if (virDomainObjSetDefTransient(driver->caps, vm) < 0)
+            VIR_ERROR("Unable to set domain %s's running config as transient",
+                      vm->def->name);
+    }
+
     if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
         ret = -1;

@@ -9665,6 +9701,15 @@ static int qemudDomainDetachDevice(virDomainPtr dom,
                         "%s", _("This type of device cannot be hot unplugged"));
     }

+    /* Set running domain def as updated */
+    if (ret == 0) {
+        vm->updated = 1;
+
+        if (virDomainObjSetDefTransient(driver->caps, vm) < 0)
+            VIR_ERROR("Unable to set domain %s's running config as transient",
+                      vm->def->name);
+    }
+
     if (!ret && virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
         ret = -1;

--
1.7.3.2




More information about the libvir-list mailing list