]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_driver: Fix another domain startup error reporting race.
authorCole Robinson <crobinso@redhat.com>
Fri, 29 May 2009 14:12:50 +0000 (14:12 +0000)
committerCole Robinson <crobinso@redhat.com>
Fri, 29 May 2009 14:12:50 +0000 (14:12 +0000)
Parse the command line output a bit earlier so we have a better chance
of reporting the full error output on failure.

I hit this when QEMU would try to boot an invalid kernel (virtinst bug).

ChangeLog
src/qemu_driver.c

index fef723cd8f0d6140f349a5904ec25b1ae046e248..f7d24151a2ad429b2b11ee3aff85f27c97116c93 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+Fri May 29 10:10:00 EDT 2009 Cole Robinson <crobinso@redhat.com>
+
+       * src/qemu_driver.c: qemu_driver: Fix another domain startup error
+       reporting race.
+
 Fri May 29 10:01:19 EDT 2009 Cole Robinson <crobinso@redhat.com>
 
        * src/qemu_driver.c : qemuDomainLookupByUUID: print correct UUID
index 9bd7d03284b2107f0276157a63b91c554f8395b7..5f23bfab8bf63e05e4a16f2a3f749bec0027f4d1 100644 (file)
@@ -746,17 +746,21 @@ qemudReadLogOutput(virConnectPtr conn,
                    const char *what,
                    int timeout)
 {
-    int retries = timeout*10;
+    int retries = (timeout*10);
     int got = 0;
     buf[0] = '\0';
 
     while (retries) {
-        ssize_t ret;
+        ssize_t func_ret, ret;
         int isdead = 0;
 
+        func_ret = func(conn, vm, buf, fd);
+
         if (kill(vm->pid, 0) == -1 && errno == ESRCH)
             isdead = 1;
 
+        /* Any failures should be detected before we read the log, so we
+         * always have something useful to report on failure. */
         ret = saferead(fd, buf+got, buflen-got-1);
         if (ret < 0) {
             virReportSystemError(conn, errno,
@@ -781,9 +785,8 @@ qemudReadLogOutput(virConnectPtr conn,
             return -1;
         }
 
-        ret = func(conn, vm, buf, fd);
-        if (ret <= 0)
-            return ret;
+        if (func_ret <= 0)
+            return func_ret;
 
         usleep(100*1000);
         retries--;