[Libvir] [PATCH] Catch qemu VM-start errors

Richard W.M. Jones rjones at redhat.com
Tue Apr 8 11:50:39 UTC 2008


Patch to fix the aforementioned problem when qemu subprocess fails to
start.

Rich.

-- 
Richard Jones, Emerging Technologies, Red Hat  http://et.redhat.com/~rjones
virt-top is 'top' for virtual machines.  Tiny program with many
powerful monitoring features, net stats, disk stats, logging, etc.
http://et.redhat.com/~rjones/virt-top
-------------- next part --------------
Index: src/qemu_driver.c
===================================================================
RCS file: /data/cvs/libvirt/src/qemu_driver.c,v
retrieving revision 1.64
diff -u -r1.64 qemu_driver.c
--- src/qemu_driver.c	28 Mar 2008 20:38:21 -0000	1.64
+++ src/qemu_driver.c	8 Apr 2008 11:51:29 -0000
@@ -603,7 +603,7 @@
                               struct qemud_driver *driver,
                               struct qemud_vm *vm) {
     char **argv = NULL, **tmp;
-    int i;
+    int i, ret;
     char logfile[PATH_MAX];
 
     if (qemudIsActiveVM(vm)) {
@@ -681,8 +681,9 @@
         qemudLog(QEMUD_WARN, _("Unable to write argv to logfile %d: %s"),
                  errno, strerror(errno));
 
-    if (virExecNonBlock(conn, argv, &vm->pid,
-                        vm->stdin, &vm->stdout, &vm->stderr) == 0) {
+    ret = virExecNonBlock(conn, argv, &vm->pid,
+                          vm->stdin, &vm->stdout, &vm->stderr);
+    if (ret == 0) {
         vm->id = driver->nextvmid++;
         vm->state = vm->migrateFrom[0] ? VIR_DOMAIN_PAUSED : VIR_DOMAIN_RUNNING;
 
@@ -704,28 +705,30 @@
         vm->ntapfds = 0;
     }
 
-    if (virEventAddHandle(vm->stdout,
-                          POLLIN | POLLERR | POLLHUP,
-                          qemudDispatchVMEvent,
-                          driver) < 0) {
-        qemudShutdownVMDaemon(conn, driver, vm);
-        return -1;
-    }
+    if (ret == 0) {
+        if (virEventAddHandle(vm->stdout,
+                              POLLIN | POLLERR | POLLHUP,
+                              qemudDispatchVMEvent,
+                              driver) < 0) {
+            qemudShutdownVMDaemon(conn, driver, vm);
+            return -1;
+        }
 
-    if (virEventAddHandle(vm->stderr,
-                          POLLIN | POLLERR | POLLHUP,
-                          qemudDispatchVMEvent,
-                          driver) < 0) {
-        qemudShutdownVMDaemon(conn, driver, vm);
-        return -1;
-    }
+        if (virEventAddHandle(vm->stderr,
+                              POLLIN | POLLERR | POLLHUP,
+                              qemudDispatchVMEvent,
+                              driver) < 0) {
+            qemudShutdownVMDaemon(conn, driver, vm);
+            return -1;
+        }
 
-    if (qemudWaitForMonitor(conn, driver, vm) < 0) {
-        qemudShutdownVMDaemon(conn, driver, vm);
-        return -1;
+        if (qemudWaitForMonitor(conn, driver, vm) < 0) {
+            qemudShutdownVMDaemon(conn, driver, vm);
+            return -1;
+        }
     }
 
-    return 0;
+    return ret;
 }
 
 static int qemudVMData(struct qemud_driver *driver ATTRIBUTE_UNUSED,


More information about the libvir-list mailing list