[libvirt] [PATCH] qemu_driver: Fix another domain startup error reporting race.

Cole Robinson crobinso at redhat.com
Thu May 28 17:16:23 UTC 2009


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).

Signed-off-by: Cole Robinson <crobinso at redhat.com>
---
 src/qemu_driver.c |   13 ++++++++-----
 1 files changed, 8 insertions(+), 5 deletions(-)

diff --git a/src/qemu_driver.c b/src/qemu_driver.c
index 9bd7d03..f62a46b 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -746,17 +746,21 @@ qemudReadLogOutput(virConnectPtr conn,
                    const char *what,
                    int timeout)
 {
-    int retries = timeout*10;
+    int retries = (timeout*10)+1;
     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--;
-- 
1.6.0.6




More information about the libvir-list mailing list