[PATCH v4 13/37] qemu_capabilities: Detect caps probe failure by checking monitor ptr

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Failure to connect to QEMU to probe capabilities is not considered a error case
and does not result in a negative return value.

Check for a NULL monitor connection pointer before trying to send capabilities
commands to QEMU rather than depending on a special positive return value.

This simplifies logic and is more consistent with the operation of existing
qemu_process functions.

A macro is introduced to easily obtain the monitor pointer from the
qemuProcess structure.

Signed-off-by: Chris Venteicher <cventeic@xxxxxxxxxx>
---
 src/qemu/qemu_capabilities.c | 28 ++++++++++++++++++----------
 src/qemu/qemu_process.c      |  9 +--------
 src/qemu/qemu_process.h      |  3 +++
 3 files changed, 22 insertions(+), 18 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 9a86838d8a..48b58ca02a 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4275,43 +4275,51 @@ virQEMUCapsInitQMP(virQEMUCapsPtr qemuCaps,
 {
     qemuProcessPtr proc = NULL;
     qemuProcessPtr proc_kvm = NULL;
+    qemuMonitorPtr mon = NULL;
+    qemuMonitorPtr mon_kvm = NULL;
     int ret = -1;
-    int rc;
     bool forceTCG = false;
 
     if (!(proc = qemuProcessNew(qemuCaps->binary, libDir,
                                 runUid, runGid, forceTCG)))
         goto cleanup;
 
-    if ((rc = qemuProcessRun(proc)) != 0) {
-        if (rc == 1)
-            ret = 0;
+
+    if (qemuProcessRun(proc) < 0)
+        goto cleanup;
+
+    if (!(mon = QEMU_PROCESS_MONITOR(proc))) {
+        ret = 0; /* Failure probing QEMU not considered error case */
         goto cleanup;
     }
 
-    if (virQEMUCapsInitQMPMonitor(qemuCaps, proc->mon) < 0)
+    /* Pull capabilities from QEMU */
+    if (virQEMUCapsInitQMPMonitor(qemuCaps, mon) < 0)
         goto cleanup;
 
+    /* Pull capabilities again if KVM supported */
     if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_KVM)) {
         qemuProcessStopQmp(proc);
 
         forceTCG = true;
         proc_kvm = qemuProcessNew(qemuCaps->binary, libDir, runUid, runGid, forceTCG);
 
-        if ((rc = qemuProcessRun(proc_kvm)) != 0) {
-            if (rc == 1)
-                ret = 0;
+        if (qemuProcessRun(proc_kvm) < 0)
+            goto cleanup;
+
+        if (!(mon_kvm = QEMU_PROCESS_MONITOR(proc_kvm))) {
+            ret = 0; /* Failure probing QEMU not considered error case */
             goto cleanup;
         }
 
-        if (virQEMUCapsInitQMPMonitorTCG(qemuCaps, proc_kvm->mon) < 0)
+        if (virQEMUCapsInitQMPMonitorTCG(qemuCaps, mon_kvm) < 0)
             goto cleanup;
     }
 
     ret = 0;
 
  cleanup:
-    if (proc && !proc->mon) {
+    if (!mon) {
         char *err = QEMU_PROCESS_ERROR(proc) ? QEMU_PROCESS_ERROR(proc) : _("unknown error");
 
         virReportError(VIR_ERR_INTERNAL_ERROR,
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 99b720b380..140c657087 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8145,10 +8145,6 @@ qemuProcessNew(const char *binary,
 }
 
 
-/* Returns -1 on fatal error,
- *          0 on success,
- *          1 when probing QEMU failed
- */
 int
 qemuProcessRun(qemuProcessPtr proc){
     virDomainXMLOptionPtr xmlopt = NULL;
@@ -8215,6 +8211,7 @@ qemuProcessRun(qemuProcessPtr proc){
 
     virObjectLock(proc->mon);
 
+ ignore:
     ret = 0;
 
  cleanup:
@@ -8223,10 +8220,6 @@ qemuProcessRun(qemuProcessPtr proc){
     virObjectUnref(xmlopt);
 
     return ret;
-
- ignore:
-    ret = 1;
-    goto cleanup;
 }
 
 
diff --git a/src/qemu/qemu_process.h b/src/qemu/qemu_process.h
index abd80baf5c..37194e2501 100644
--- a/src/qemu/qemu_process.h
+++ b/src/qemu/qemu_process.h
@@ -235,6 +235,9 @@ struct _qemuProcess {
 #define QEMU_PROCESS_ERROR(proc) \
    ((char *) (proc ? proc->qmperr: NULL))
 
+#define QEMU_PROCESS_MONITOR(proc) \
+   ((qemuMonitorPtr) (proc ? proc->mon : NULL))
+
 qemuProcessPtr qemuProcessNew(const char *binary,
                               const char *libDir,
                               uid_t runUid,
-- 
2.17.1

--
libvir-list mailing list
libvir-list@xxxxxxxxxx
https://www.redhat.com/mailman/listinfo/libvir-list



[Index of Archives]     [Virt Tools]     [Libvirt Users]     [Lib OS Info]     [Fedora Users]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [KDE Users]     [Fedora Tools]

  Powered by Linux