[PATCH 08/10] qemu: agent: exit early if error is already set

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

 



If we catch io error in previous loop invocation we
don't need to report 'unexpected fd' error only to drop it later.
Let's also call error callback only once.
---
 src/qemu/qemu_agent.c | 28 +++++++++++++---------------
 1 file changed, 13 insertions(+), 15 deletions(-)

diff --git a/src/qemu/qemu_agent.c b/src/qemu/qemu_agent.c
index 43d78c9..5dc39b6 100644
--- a/src/qemu/qemu_agent.c
+++ b/src/qemu/qemu_agent.c
@@ -597,6 +597,7 @@ qemuAgentIO(int watch, int fd, int events, void *opaque)
     qemuAgentPtr mon = opaque;
     void (*errorNotify)(qemuAgentPtr, virDomainObjPtr);
     virDomainObjPtr vm;
+    virErrorPtr err;
 
     virObjectRef(mon);
     /* lock access to the monitor and protect fd */
@@ -605,6 +606,13 @@ qemuAgentIO(int watch, int fd, int events, void *opaque)
     VIR_DEBUG("Agent %p I/O on watch %d fd %d events %d", mon, watch, fd, events);
 #endif
 
+    /* this is not interesting at all */
+    if (mon->lastError.code != VIR_ERR_OK) {
+        virObjectUnlock(mon);
+        virObjectUnref(mon);
+        return;
+    }
+
     if (mon->fd != fd || mon->watch != watch) {
         virReportError(VIR_ERR_INTERNAL_ERROR,
                        _("event from unexpected fd %d!=%d / watch %d!=%d"),
@@ -612,9 +620,6 @@ qemuAgentIO(int watch, int fd, int events, void *opaque)
         goto error;
     }
 
-    if (mon->lastError.code != VIR_ERR_OK)
-        goto error;
-
     if (events & VIR_EVENT_HANDLE_WRITABLE) {
         if (mon->connectPending) {
             if (qemuAgentIOConnect(mon) < 0)
@@ -665,19 +670,12 @@ qemuAgentIO(int watch, int fd, int events, void *opaque)
     return;
 
  error:
-    if (mon->lastError.code != VIR_ERR_OK) {
-        /* Already have an error, so clear any new error */
-        virResetLastError();
-    } else {
-        virErrorPtr err = virGetLastError();
-        if (!err)
-            virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                           _("Error while processing monitor IO"));
-        virCopyLastError(&mon->lastError);
-        virResetLastError();
-    }
+    if (!(err = virGetLastError()))
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Error while processing monitor IO"));
+    virCopyLastError(&mon->lastError);
+    virResetLastError();
 
-    VIR_DEBUG("Error on monitor %s", NULLSTR(mon->lastError.message));
     /* If IO process resulted in an error & we have a message,
      * then wakeup that waiter */
     if (mon->msg && !mon->msg->finished) {
-- 
1.8.3.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]