]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: setvcpus: Simplify altering the persistent config
authorCole Robinson <crobinso@redhat.com>
Fri, 19 Nov 2010 19:51:46 +0000 (14:51 -0500)
committerCole Robinson <crobinso@redhat.com>
Tue, 23 Nov 2010 13:42:46 +0000 (08:42 -0500)
Do this by adding a helper function to get the persistent domain config. This
should be useful for other functions that may eventually want to alter
the persistent domain config (attach/detach device). Also make similar changes
to the test drivers setvcpus command.

A caveat is that the function will return the running config for a transient
domain, rather than error. This simplifies callers, as long as they use
other methods to ensure the guest is persistent.

src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_driver.c
src/test/test_driver.c

index e8d030dbe0cac090507614d241a90f5697603310..3f14ceef483e648be64accaeafc0bf557104a4fe 100644 (file)
@@ -1007,6 +1007,27 @@ out:
     return ret;
 }
 
+/*
+ * Return the persistent domain configuration. If domain is transient,
+ * return the running config.
+ *
+ * @param caps pointer to capabilities info
+ * @param domain domain object pointer
+ * @return NULL on error, virDOmainDefPtr on success
+ */
+virDomainDefPtr
+virDomainObjGetPersistentDef(virCapsPtr caps,
+                             virDomainObjPtr domain)
+{
+    if (virDomainObjSetDefTransient(caps, domain) < 0)
+        return NULL;
+
+    if (domain->newDef)
+        return domain->newDef;
+    else
+        return domain->def;
+}
+
 /*
  * The caller must hold a lock  on the driver owning 'doms',
  * and must also have locked 'dom', to ensure no one else
index 392e0520082ce94830adbb0691e9ed5771307703..10cbded60e90d4ccc16dab5b1ca265d997ca1a71 100644 (file)
@@ -1094,6 +1094,9 @@ void virDomainObjAssignDef(virDomainObjPtr domain,
                            bool live);
 int virDomainObjSetDefTransient(virCapsPtr caps,
                                 virDomainObjPtr domain);
+virDomainDefPtr
+virDomainObjGetPersistentDef(virCapsPtr caps,
+                             virDomainObjPtr domain);
 void virDomainRemoveInactive(virDomainObjListPtr doms,
                              virDomainObjPtr dom);
 
index 41d1a194347a631239b729709c3e7f5a3614c90d..10ae74f4ad1147589a287535a4b3400c0cbc78a8 100644 (file)
@@ -226,6 +226,7 @@ virDomainNetDefFree;
 virDomainNetTypeToString;
 virDomainObjAssignDef;
 virDomainObjSetDefTransient;
+virDomainObjGetPersistentDef;
 virDomainObjIsDuplicate;
 virDomainObjListDeinit;
 virDomainObjListGetActiveIDs;
index 058a8f058d3a699a71655f4231c56224e77068c7..c0335c38324c59c0bf3947540399bc0d70ebe668 100644 (file)
@@ -6264,7 +6264,7 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
 {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm;
-    virDomainDefPtr def;
+    virDomainDefPtr persistentDef;
     const char * type;
     int max;
     int ret = -1;
@@ -6309,6 +6309,12 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
         goto endjob;
     }
 
+    if (!vm->persistent && (flags & VIR_DOMAIN_VCPU_CONFIG)) {
+        qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
+                        _("cannot change persistent config of a transient domain"));
+        goto endjob;
+    }
+
     if (!(type = virDomainVirtTypeToString(vm->def->virtType))) {
         qemuReportError(VIR_ERR_INTERNAL_ERROR,
                         _("unknown virt type in domain definition '%d'"),
@@ -6333,36 +6339,19 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
         goto endjob;
     }
 
+    if (!(persistentDef = virDomainObjGetPersistentDef(driver->caps, vm)))
+        goto endjob;
+
     switch (flags) {
     case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
-        def = vm->def;
-        if (virDomainObjIsActive(vm)) {
-            if (vm->newDef)
-                def = vm->newDef;
-            else{
-                qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
-                                _("no persistent state"));
-                goto endjob;
-            }
-        }
-        def->maxvcpus = nvcpus;
-        if (nvcpus < vm->newDef->vcpus)
-            def->vcpus = nvcpus;
+        persistentDef->maxvcpus = nvcpus;
+        if (nvcpus < persistentDef->vcpus)
+            persistentDef->vcpus = nvcpus;
         ret = 0;
         break;
 
     case VIR_DOMAIN_VCPU_CONFIG:
-        def = vm->def;
-        if (virDomainObjIsActive(vm)) {
-            if (vm->newDef)
-                def = vm->newDef;
-            else {
-                qemuReportError(VIR_ERR_OPERATION_INVALID, "%s",
-                                _("no persistent state"));
-                goto endjob;
-            }
-        }
-        def->vcpus = nvcpus;
+        persistentDef->vcpus = nvcpus;
         ret = 0;
         break;
 
@@ -6372,8 +6361,9 @@ qemudDomainSetVcpusFlags(virDomainPtr dom, unsigned int nvcpus,
 
     case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
         ret = qemudDomainHotplugVcpus(vm, nvcpus);
-        if (ret == 0 && vm->newDef)
-            vm->newDef->vcpus = nvcpus;
+        if (ret == 0) {
+            persistentDef->vcpus = nvcpus;
+        }
         break;
     }
 
index d32568fc171f87f4fa0a49c9a5e47805d25a9279..4f14606491626b87b42e6412e0a60be7695a7566 100644 (file)
@@ -2095,7 +2095,7 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
 {
     testConnPtr privconn = domain->conn->privateData;
     virDomainObjPtr privdom = NULL;
-    virDomainDefPtr def;
+    virDomainDefPtr persistentDef;
     int ret = -1, maxvcpus;
 
     virCheckFlags(VIR_DOMAIN_VCPU_LIVE |
@@ -2145,36 +2145,20 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
         goto cleanup;
     }
 
+    if (!(persistentDef = virDomainObjGetPersistentDef(privconn->caps,
+                                                       privdom)))
+        goto cleanup;
+
     switch (flags) {
     case VIR_DOMAIN_VCPU_MAXIMUM | VIR_DOMAIN_VCPU_CONFIG:
-        def = privdom->def;
-        if (virDomainObjIsActive(privdom)) {
-            if (privdom->newDef)
-                def = privdom->newDef;
-            else {
-                testError(VIR_ERR_OPERATION_INVALID, "%s",
-                          _("no persistent state"));
-                goto cleanup;
-            }
-        }
-        def->maxvcpus = nrCpus;
-        if (nrCpus < def->vcpus)
-            def->vcpus = nrCpus;
+        persistentDef->maxvcpus = nrCpus;
+        if (nrCpus < persistentDef->vcpus)
+            persistentDef->vcpus = nrCpus;
         ret = 0;
         break;
 
     case VIR_DOMAIN_VCPU_CONFIG:
-        def = privdom->def;
-        if (virDomainObjIsActive(privdom)) {
-            if (privdom->newDef)
-                def = privdom->newDef;
-            else {
-                testError(VIR_ERR_OPERATION_INVALID, "%s",
-                          _("no persistent state"));
-                goto cleanup;
-            }
-        }
-        def->vcpus = nrCpus;
+        persistentDef->vcpus = nrCpus;
         ret = 0;
         break;
 
@@ -2184,8 +2168,9 @@ testDomainSetVcpusFlags(virDomainPtr domain, unsigned int nrCpus,
 
     case VIR_DOMAIN_VCPU_LIVE | VIR_DOMAIN_VCPU_CONFIG:
         ret = testDomainUpdateVCPUs(domain->conn, privdom, nrCpus, 0);
-        if (ret == 0 && privdom->newDef)
-            privdom->newDef->vcpus = nrCpus;
+        if (ret == 0) {
+            persistentDef->vcpus = nrCpus;
+        }
         break;
     }