Cole Robinson f4bfe6
From 3a441522017aa9c1b8b54d2ce4569d0f0d96fa72 Mon Sep 17 00:00:00 2001
Cole Robinson f4bfe6
From: Cole Robinson <crobinso@redhat.com>
Cole Robinson f4bfe6
Date: Fri, 12 Mar 2010 12:36:56 -0500
Cole Robinson f4bfe6
Subject: [PATCH] qemu: Add some debugging at domain startup
Cole Robinson f4bfe6
Cole Robinson f4bfe6
---
Cole Robinson f4bfe6
 src/qemu/qemu_driver.c |   24 +++++++++++++++++++++++-
Cole Robinson f4bfe6
 1 files changed, 23 insertions(+), 1 deletions(-)
Cole Robinson f4bfe6
Cole Robinson f4bfe6
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
Cole Robinson f4bfe6
index f8ab545..040d645 100644
Cole Robinson f4bfe6
--- a/src/qemu/qemu_driver.c
Cole Robinson f4bfe6
+++ b/src/qemu/qemu_driver.c
Cole Robinson f4bfe6
@@ -2695,6 +2695,8 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
     FD_ZERO(&keepfd);
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Beginning VM startup process");
Cole Robinson f4bfe6
+
Cole Robinson f4bfe6
     if (virDomainObjIsActive(vm)) {
Cole Robinson f4bfe6
         qemuReportError(VIR_ERR_OPERATION_INVALID,
Cole Robinson f4bfe6
                         "%s", _("VM is already active"));
Cole Robinson f4bfe6
@@ -2703,22 +2705,27 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
     /* If you are using a SecurityDriver with dynamic labelling,
Cole Robinson f4bfe6
        then generate a security label for isolation */
Cole Robinson f4bfe6
+    DEBUG0("Generating domain security label (if required)");
Cole Robinson f4bfe6
     if (driver->securityDriver &&
Cole Robinson f4bfe6
         driver->securityDriver->domainGenSecurityLabel &&
Cole Robinson f4bfe6
         driver->securityDriver->domainGenSecurityLabel(vm) < 0)
Cole Robinson f4bfe6
         return -1;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Generating setting domain security labels (if required)");
Cole Robinson f4bfe6
     if (driver->securityDriver &&
Cole Robinson f4bfe6
         driver->securityDriver->domainSetSecurityAllLabel &&
Cole Robinson f4bfe6
         driver->securityDriver->domainSetSecurityAllLabel(vm) < 0)
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
-    /* Ensure no historical cgroup for this VM is lieing around bogus settings */
Cole Robinson f4bfe6
+    /* Ensure no historical cgroup for this VM is lying around bogus
Cole Robinson f4bfe6
+     * settings */
Cole Robinson f4bfe6
+    DEBUG0("Ensuring no historical cgroup is lying around");
Cole Robinson f4bfe6
     qemuRemoveCgroup(driver, vm, 1);
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
     if ((vm->def->ngraphics == 1) &&
Cole Robinson f4bfe6
         vm->def->graphics[0]->type == VIR_DOMAIN_GRAPHICS_TYPE_VNC &&
Cole Robinson f4bfe6
         vm->def->graphics[0]->data.vnc.autoport) {
Cole Robinson f4bfe6
+        DEBUG0("Determining VNC port");
Cole Robinson f4bfe6
         int port = qemudNextFreeVNCPort(driver);
Cole Robinson f4bfe6
         if (port < 0) {
Cole Robinson f4bfe6
             qemuReportError(VIR_ERR_INTERNAL_ERROR,
Cole Robinson f4bfe6
@@ -2735,6 +2742,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
     }
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Creating domain log file");
Cole Robinson f4bfe6
     if ((logfile = qemudLogFD(driver, vm->def->name)) < 0)
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
@@ -2751,14 +2759,17 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
     }
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Determing emulator version");
Cole Robinson f4bfe6
     if (qemudExtractVersionInfo(emulator,
Cole Robinson f4bfe6
                                 NULL,
Cole Robinson f4bfe6
                                 &qemuCmdFlags) < 0)
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Setting up domain cgroup (if required)");
Cole Robinson f4bfe6
     if (qemuSetupCgroup(driver, vm) < 0)
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Preparing host devices");
Cole Robinson f4bfe6
     if (qemuPrepareHostDevices(driver, vm->def) < 0)
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
@@ -2767,6 +2778,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
     }
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Preparing monitor state");
Cole Robinson f4bfe6
     if (qemuPrepareMonitorChr(driver, priv->monConfig, vm->def->name) < 0)
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
@@ -2798,6 +2810,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
      * use in hotplug
Cole Robinson f4bfe6
      */
Cole Robinson f4bfe6
     if (qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE) {
Cole Robinson f4bfe6
+        DEBUG0("Assigning domain PCI addresses");
Cole Robinson f4bfe6
         /* Populate cache with current addresses */
Cole Robinson f4bfe6
         if (priv->pciaddrs) {
Cole Robinson f4bfe6
             qemuDomainPCIAddressSetFree(priv->pciaddrs);
Cole Robinson f4bfe6
@@ -2816,6 +2829,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
         priv->persistentAddrs = 0;
Cole Robinson f4bfe6
     }
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Building emulator command line");
Cole Robinson f4bfe6
     vm->def->id = driver->nextvmid++;
Cole Robinson f4bfe6
     if (qemudBuildCommandLine(conn, driver, vm->def, priv->monConfig,
Cole Robinson f4bfe6
                               priv->monJSON, qemuCmdFlags, &argv, &progenv,
Cole Robinson f4bfe6
@@ -2899,25 +2913,31 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
     if (ret == -1) /* The VM failed to start */
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Waiting for monitor to show up");
Cole Robinson f4bfe6
     if (qemudWaitForMonitor(driver, vm, pos) < 0)
Cole Robinson f4bfe6
         goto abort;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Detecting VCPU PIDs");
Cole Robinson f4bfe6
     if (qemuDetectVcpuPIDs(driver, vm) < 0)
Cole Robinson f4bfe6
         goto abort;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Setting CPU affinity");
Cole Robinson f4bfe6
     if (qemudInitCpuAffinity(vm) < 0)
Cole Robinson f4bfe6
         goto abort;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Setting any required VM passwords");
Cole Robinson f4bfe6
     if (qemuInitPasswords(conn, driver, vm, qemuCmdFlags) < 0)
Cole Robinson f4bfe6
         goto abort;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
     /* If we have -device, then addresses are assigned explicitly.
Cole Robinson f4bfe6
      * If not, then we have to detect dynamic ones here */
Cole Robinson f4bfe6
     if (!(qemuCmdFlags & QEMUD_CMD_FLAG_DEVICE)) {
Cole Robinson f4bfe6
+        DEBUG0("Determining domain device PCI addresses");
Cole Robinson f4bfe6
         if (qemuInitPCIAddresses(driver, vm) < 0)
Cole Robinson f4bfe6
             goto abort;
Cole Robinson f4bfe6
     }
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Setting initial memory amount");
Cole Robinson f4bfe6
     qemuDomainObjEnterMonitorWithDriver(driver, vm);
Cole Robinson f4bfe6
     if (qemuMonitorSetBalloon(priv->mon, vm->def->memory) < 0) {
Cole Robinson f4bfe6
         qemuDomainObjExitMonitorWithDriver(driver, vm);
Cole Robinson f4bfe6
@@ -2925,6 +2945,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
     }
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
     if (migrateFrom == NULL) {
Cole Robinson f4bfe6
+        DEBUG0("Starting domain CPUs");
Cole Robinson f4bfe6
         /* Allow the CPUS to start executing */
Cole Robinson f4bfe6
         if (qemuMonitorStartCPUs(priv->mon, conn) < 0) {
Cole Robinson f4bfe6
             if (virGetLastError() == NULL)
Cole Robinson f4bfe6
@@ -2937,6 +2958,7 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
     qemuDomainObjExitMonitorWithDriver(driver, vm);
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    DEBUG0("Writing domain status to disk");
Cole Robinson f4bfe6
     if (virDomainSaveStatus(driver->caps, driver->stateDir, vm) < 0)
Cole Robinson f4bfe6
         goto abort;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
-- 
Cole Robinson f4bfe6
1.6.6.1
Cole Robinson f4bfe6
Cole Robinson f4bfe6
From 6d5c8a8f51db8ce97ab35ab6022dd5c94ab016b4 Mon Sep 17 00:00:00 2001
Cole Robinson f4bfe6
From: Cole Robinson <crobinso@redhat.com>
Cole Robinson f4bfe6
Date: Fri, 12 Mar 2010 12:37:52 -0500
Cole Robinson f4bfe6
Subject: [PATCH] qemu: Fix USB by product with security enabled
Cole Robinson f4bfe6
Cole Robinson f4bfe6
We need to call PrepareHostdevs to determine the USB device path before
Cole Robinson f4bfe6
any security calls. PrepareHostUSBDevices was also incorrectly skipping
Cole Robinson f4bfe6
all USB devices.
Cole Robinson f4bfe6
---
Cole Robinson f4bfe6
 src/qemu/qemu_driver.c |   11 ++++++-----
Cole Robinson f4bfe6
 1 files changed, 6 insertions(+), 5 deletions(-)
Cole Robinson f4bfe6
Cole Robinson f4bfe6
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
Cole Robinson f4bfe6
index 040d645..b17d26d 100644
Cole Robinson f4bfe6
--- a/src/qemu/qemu_driver.c
Cole Robinson f4bfe6
+++ b/src/qemu/qemu_driver.c
Cole Robinson f4bfe6
@@ -2360,7 +2360,7 @@ qemuPrepareHostUSBDevices(struct qemud_driver *driver ATTRIBUTE_UNUSED,
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
         if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
Cole Robinson f4bfe6
             continue;
Cole Robinson f4bfe6
-        if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
Cole Robinson f4bfe6
+        if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
Cole Robinson f4bfe6
             continue;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
         /* Resolve a vendor/product to bus/device */
Cole Robinson f4bfe6
@@ -2703,6 +2703,11 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
         return -1;
Cole Robinson f4bfe6
     }
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
+    /* Must be run before security labelling */
Cole Robinson f4bfe6
+    DEBUG0("Preparing host devices");
Cole Robinson f4bfe6
+    if (qemuPrepareHostDevices(driver, vm->def) < 0)
Cole Robinson f4bfe6
+        goto cleanup;
Cole Robinson f4bfe6
+
Cole Robinson f4bfe6
     /* If you are using a SecurityDriver with dynamic labelling,
Cole Robinson f4bfe6
        then generate a security label for isolation */
Cole Robinson f4bfe6
     DEBUG0("Generating domain security label (if required)");
Cole Robinson f4bfe6
@@ -2769,10 +2774,6 @@ static int qemudStartVMDaemon(virConnectPtr conn,
Cole Robinson f4bfe6
     if (qemuSetupCgroup(driver, vm) < 0)
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
-    DEBUG0("Preparing host devices");
Cole Robinson f4bfe6
-    if (qemuPrepareHostDevices(driver, vm->def) < 0)
Cole Robinson f4bfe6
-        goto cleanup;
Cole Robinson f4bfe6
-
Cole Robinson f4bfe6
     if (VIR_ALLOC(priv->monConfig) < 0) {
Cole Robinson f4bfe6
         virReportOOMError();
Cole Robinson f4bfe6
         goto cleanup;
Cole Robinson f4bfe6
-- 
Cole Robinson f4bfe6
1.6.6.1
Cole Robinson f4bfe6
Cole Robinson f4bfe6
From 65e97240e6e4606820dd1c42ac172319e0af4d8d Mon Sep 17 00:00:00 2001
Cole Robinson f4bfe6
From: Cole Robinson <crobinso@redhat.com>
Cole Robinson f4bfe6
Date: Mon, 22 Mar 2010 10:45:36 -0400
Cole Robinson f4bfe6
Subject: [PATCH] security: selinux: Fix crash when releasing non-existent label
Cole Robinson f4bfe6
Cole Robinson f4bfe6
This can be triggered by the qemuStartVMDaemon cleanup path if a
Cole Robinson f4bfe6
VM references a non-existent USB device (by product) in the XML.
Cole Robinson f4bfe6
Cole Robinson f4bfe6
Signed-off-by: Cole Robinson <crobinso@redhat.com>
Cole Robinson f4bfe6
---
Cole Robinson f4bfe6
 src/security/security_selinux.c |    3 ++-
Cole Robinson f4bfe6
 1 files changed, 2 insertions(+), 1 deletions(-)
Cole Robinson f4bfe6
Cole Robinson f4bfe6
diff --git a/src/security/security_selinux.c b/src/security/security_selinux.c
Cole Robinson f4bfe6
index 975b315..6680e2d 100644
Cole Robinson f4bfe6
--- a/src/security/security_selinux.c
Cole Robinson f4bfe6
+++ b/src/security/security_selinux.c
Cole Robinson f4bfe6
@@ -632,7 +632,8 @@ SELinuxReleaseSecurityLabel(virDomainObjPtr vm)
Cole Robinson f4bfe6
 {
Cole Robinson f4bfe6
     const virSecurityLabelDefPtr secdef = &vm->def->seclabel;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
-    if (secdef->type == VIR_DOMAIN_SECLABEL_STATIC)
Cole Robinson f4bfe6
+    if (secdef->type == VIR_DOMAIN_SECLABEL_STATIC ||
Cole Robinson f4bfe6
+        secdef->label == NULL)
Cole Robinson f4bfe6
         return 0;
Cole Robinson f4bfe6
 
Cole Robinson f4bfe6
     context_t con = context_new(secdef->label);
Cole Robinson f4bfe6
-- 
Cole Robinson f4bfe6
1.6.6.1
Cole Robinson f4bfe6