]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
Refresh QEMU driver capabilities for each getCapabilities call.
authorCole Robinson <crobinso@redhat.com>
Wed, 6 May 2009 14:20:34 +0000 (14:20 +0000)
committerCole Robinson <crobinso@redhat.com>
Wed, 6 May 2009 14:20:34 +0000 (14:20 +0000)
Also fix up a couple issues where caps are accessed without locking
the driver structure.

ChangeLog
src/qemu_driver.c

index c556ce3fd33569e6d3384c14ef0ed39aae7d3db4..2ab74af998e79ca639cd82804ce9535c4e4bb88f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Wed May  6 10:19:36 EDT 2009 Cole Robinson <crobinso@redhat.com>
+
+       * src/qemu_driver.c : Refresh QEMU driver capabilities for each
+       getCapabilities call.
+
 Wed May  6 15:42:08 CEST 2009 Daniel Veillard <veillard@redhat.com>
 
        * src/vbox/vbox_driver.c src/vbox/vbox_tmpl.c: changes in
index a63a8cb04b1b85d887cb0c209fc3c5fde1ed82b6..589802613cb921c42c8f219652b09bdf8dd75ae3 100644 (file)
@@ -1872,10 +1872,12 @@ static int qemudGetNodeInfo(virConnectPtr conn,
 
 static char *qemudGetCapabilities(virConnectPtr conn) {
     struct qemud_driver *driver = conn->privateData;
-    char *xml;
+    char *xml = NULL;
 
     qemuDriverLock(driver);
-    if ((xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
+    virCapabilitiesFree(qemu_driver->caps);
+    if ((qemu_driver->caps = qemudCapsInit()) == NULL ||
+        (xml = virCapabilitiesFormatXML(driver->caps)) == NULL)
         virReportOOMError(conn);
     qemuDriverUnlock(driver);
 
@@ -3156,20 +3158,26 @@ cleanup:
     return ret;
 }
 
-static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr secmodel)
+static int qemudNodeGetSecurityModel(virConnectPtr conn,
+                                     virSecurityModelPtr secmodel)
 {
     struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
     char *p;
+    int ret = 0;
 
-    if (!driver->securityDriver)
-        return -2;
+    qemuDriverLock(driver);
+    if (!driver->securityDriver) {
+        ret = -2;
+        goto cleanup;
+    }
 
     p = driver->caps->host.secModel.model;
     if (strlen(p) >= VIR_SECURITY_MODEL_BUFLEN-1) {
         qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
                          _("security model string exceeds max %d bytes"),
                          VIR_SECURITY_MODEL_BUFLEN-1);
-        return -1;
+        ret = -1;
+        goto cleanup;
     }
     strcpy(secmodel->model, p);
 
@@ -3178,10 +3186,14 @@ static int qemudNodeGetSecurityModel(virConnectPtr conn, virSecurityModelPtr sec
         qemudReportError(conn, NULL, NULL, VIR_ERR_INTERNAL_ERROR,
                          _("security DOI string exceeds max %d bytes"),
                          VIR_SECURITY_DOI_BUFLEN-1);
-        return -1;
+        ret = -1;
+        goto cleanup;
     }
     strcpy(secmodel->doi, p);
-    return 0;
+
+cleanup:
+    qemuDriverUnlock(driver);
+    return ret;
 }
 
 /* TODO: check seclabel restore */