]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: Refresh caps in virQEMUCapsCacheLookupByArch
authorJiri Denemark <jdenemar@redhat.com>
Wed, 16 Nov 2016 13:17:12 +0000 (14:17 +0100)
committerJiri Denemark <jdenemar@redhat.com>
Fri, 25 Nov 2016 19:34:26 +0000 (20:34 +0100)
The function just returned cached capabilities without checking whether
they are still valid. We should check that and refresh the capabilities
to make sure we don't return stale data. In other words, we should do
what all other lookup functions do.

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_driver.c

index 2f2e88cb438f015b195a21cb994b1444cba910af..71d35b077f5a80fced018653ff249128cf6bb338 100644 (file)
@@ -4631,7 +4631,8 @@ virQEMUCapsCompareArch(const void *payload,
 
 
 virQEMUCapsPtr
-virQEMUCapsCacheLookupByArch(virQEMUCapsCachePtr cache,
+virQEMUCapsCacheLookupByArch(virCapsPtr caps,
+                             virQEMUCapsCachePtr cache,
                              virArch arch)
 {
     virQEMUCapsPtr ret = NULL;
@@ -4649,6 +4650,22 @@ virQEMUCapsCacheLookupByArch(virQEMUCapsCachePtr cache,
             ret = virHashSearch(cache->binaries, virQEMUCapsCompareArch, &data);
         }
     }
+
+    if (ret) {
+        char *binary;
+
+        if (VIR_STRDUP(binary, ret->binary) < 0) {
+            ret = NULL;
+        } else {
+            virQEMUCapsCacheValidate(cache, binary, caps, &ret);
+            VIR_FREE(binary);
+        }
+    } else {
+        virReportError(VIR_ERR_INVALID_ARG,
+                       _("unable to find any emulator to serve '%s' "
+                         "architecture"), virArchToString(arch));
+    }
+
     virObjectRef(ret);
     virMutexUnlock(&cache->lock);
 
index d44cf2c4d70ac0242f6b8fe56db021f1e5551be8..4e33ddaf8753716daacec6e0026a448e1782814f 100644 (file)
@@ -474,7 +474,8 @@ virQEMUCapsPtr virQEMUCapsCacheLookupCopy(virCapsPtr caps,
                                           virQEMUCapsCachePtr cache,
                                           const char *binary,
                                           const char *machineType);
-virQEMUCapsPtr virQEMUCapsCacheLookupByArch(virQEMUCapsCachePtr cache,
+virQEMUCapsPtr virQEMUCapsCacheLookupByArch(virCapsPtr caps,
+                                            virQEMUCapsCachePtr cache,
                                             virArch arch);
 void virQEMUCapsCacheFree(virQEMUCapsCachePtr cache);
 
index 6a26549237236c629586a37e250625542b2b2e07..3517aa2be2dc4608330e22a88ecc6be7a7badff5 100644 (file)
@@ -18773,7 +18773,8 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
             goto cleanup;
         }
     } else {
-        if (!(qemuCaps = virQEMUCapsCacheLookupByArch(driver->qemuCapsCache,
+        if (!(qemuCaps = virQEMUCapsCacheLookupByArch(caps,
+                                                      driver->qemuCapsCache,
                                                       arch))) {
             virReportError(VIR_ERR_INVALID_ARG,
                            _("unable to find any emulator to serve '%s' "