[Pkg-libvirt-commits] [SCM] Libvirt Debian packaging branch, master, updated. debian/0.6.5-3

Guido Günther agx at sigxcpu.org
Wed Jul 29 10:56:20 UTC 2009


The following commit has been merged in the master branch:
commit b2a1c47d7afde59d9a94ab8824e3e964bf41c7b1
Author: Guido Günther <agx at sigxcpu.org>
Date:   Wed Jul 29 12:16:22 2009 +0200

    New patch 0001-Fix-PCI-device-hotplug-unplug-with-newer-QEMU.patch
    
    pulled from upstream 326ecb7. Fixes PCI hotplug with newer kvm.

diff --git a/debian/patches/0005-Fix-PCI-device-hotplug-unplug-with-newer-QEMU.patch b/debian/patches/0005-Fix-PCI-device-hotplug-unplug-with-newer-QEMU.patch
new file mode 100644
index 0000000..5ebcddb
--- /dev/null
+++ b/debian/patches/0005-Fix-PCI-device-hotplug-unplug-with-newer-QEMU.patch
@@ -0,0 +1,127 @@
+From: Daniel P. Berrange <berrange at redhat.com>
+Date: Mon, 6 Jul 2009 15:58:55 +0100
+Subject: [PATCH] Fix PCI device hotplug/unplug with newer QEMU
+
+* src/qemu_driver.c: Try new monitor syntax for hotplug first. If
+  that fails fallback to old KVM specific syntax
+---
+ src/qemu_driver.c |   56 +++++++++++++++++++++++++++++++++++++++-------------
+ 1 files changed, 42 insertions(+), 14 deletions(-)
+
+diff --git a/src/qemu_driver.c b/src/qemu_driver.c
+index 95ea882..827f3c6 100644
+--- a/src/qemu_driver.c
++++ b/src/qemu_driver.c
+@@ -3891,6 +3891,7 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
+     char *cmd, *reply, *s;
+     char *safe_path;
+     const char* type = virDomainDiskBusTypeToString(dev->data.disk->bus);
++    int tryOldSyntax = 0;
+ 
+     for (i = 0 ; i < vm->def->ndisks ; i++) {
+         if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) {
+@@ -3905,14 +3906,15 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
+         return -1;
+     }
+ 
++try_command:
+     safe_path = qemudEscapeMonitorArg(dev->data.disk->src);
+     if (!safe_path) {
+         virReportOOMError(conn);
+         return -1;
+     }
+ 
+-    ret = virAsprintf(&cmd, "pci_add 0 storage file=%s,if=%s",
+-                      safe_path, type);
++    ret = virAsprintf(&cmd, "pci_add %s storage file=%s,if=%s",
++                      (tryOldSyntax ? "0": "pci_addr=auto"), safe_path, type);
+     VIR_FREE(safe_path);
+     if (ret == -1) {
+         virReportOOMError(conn);
+@@ -3928,17 +3930,27 @@ static int qemudDomainAttachPciDiskDevice(virConnectPtr conn,
+ 
+     DEBUG ("%s: pci_add reply: %s", vm->def->name, reply);
+     /* If the command succeeds qemu prints:
+-     * OK bus 0... */
+-#define PCI_ATTACH_OK_MSG "OK bus 0, slot "
+-    if ((s=strstr(reply, PCI_ATTACH_OK_MSG))) {
+-        char* dummy = s;
+-        s += strlen(PCI_ATTACH_OK_MSG);
++     * OK bus 0, slot XXX...
++     * or
++     * OK domain 0, bus 0, slot XXX
++     */
++    if ((s = strstr(reply, "OK ")) &&
++        (s = strstr(s, "slot "))) {
++        char *dummy = s;
++        s += strlen("slot ");
+ 
+         if (virStrToLong_i ((const char*)s, &dummy, 10, &dev->data.disk->slotnum) == -1)
+             VIR_WARN("%s", _("Unable to parse slot number\n"));
++        /* XXX not neccessarily always going to end up in domain 0 / bus 0 :-( */
++        /* XXX this slotnum is not persistant across restarts :-( */
++    } else if (!tryOldSyntax && strstr(reply, "invalid char in expression")) {
++        VIR_FREE(reply);
++        VIR_FREE(cmd);
++        tryOldSyntax = 1;
++        goto try_command;
+     } else {
+         qemudReportError (conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
+-                          _("adding %s disk failed"), type);
++                          _("adding %s disk failed: %s"), type, reply);
+         VIR_FREE(reply);
+         VIR_FREE(cmd);
+         return -1;
+@@ -4155,6 +4167,7 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
+     char *cmd = NULL;
+     char *reply = NULL;
+     virDomainDiskDefPtr detach = NULL;
++    int tryOldSyntax = 0;
+ 
+     for (i = 0 ; i < vm->def->ndisks ; i++) {
+         if (STREQ(vm->def->disks[i]->dst, dev->data.disk->dst)) {
+@@ -4176,9 +4189,17 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
+         goto cleanup;
+     }
+ 
+-    if (virAsprintf(&cmd, "pci_del 0 %d", detach->slotnum) < 0) {
+-        virReportOOMError(conn);
+-        goto cleanup;
++try_command:
++    if (tryOldSyntax) {
++        if (virAsprintf(&cmd, "pci_del 0 %d", detach->slotnum) < 0) {
++            virReportOOMError(conn);
++            goto cleanup;
++        }
++    } else {
++        if (virAsprintf(&cmd, "pci_del pci_addr=0:0:%d", detach->slotnum) < 0) {
++            virReportOOMError(conn);
++            goto cleanup;
++        }
+     }
+ 
+     if (qemudMonitorCommand(vm, cmd, &reply) < 0) {
+@@ -4188,12 +4209,19 @@ static int qemudDomainDetachPciDiskDevice(virConnectPtr conn,
+     }
+ 
+     DEBUG ("%s: pci_del reply: %s",vm->def->name,  reply);
++
++    if (!tryOldSyntax &&
++        strstr(reply, "extraneous characters")) {
++        tryOldSyntax = 1;
++        goto try_command;
++    }
+     /* If the command fails due to a wrong slot qemu prints: invalid slot,
+      * nothing is printed on success */
+-    if (strstr(reply, "invalid slot")) {
++    if (strstr(reply, "invalid slot") ||
++        strstr(reply, "Invalid pci address")) {
+         qemudReportError (conn, NULL, NULL, VIR_ERR_OPERATION_FAILED,
+-                          _("failed to detach disk %s: invalid slot %d"),
+-                          detach->dst, detach->slotnum);
++                          _("failed to detach disk %s: invalid slot %d: %s"),
++                          detach->dst, detach->slotnum, reply);
+         goto cleanup;
+     }
+ 
+-- 
diff --git a/debian/patches/series b/debian/patches/series
index a8c0f9e..3539ac0 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -2,3 +2,4 @@
 0002-qemu-disable-network.diff.patch
 0003-allow-libvirt-group-to-access-the-socket.patch
 0004-fix-Debian-specific-path-to-hvm-loader.patch
+0005-Fix-PCI-device-hotplug-unplug-with-newer-QEMU.patch

-- 
Libvirt Debian packaging



More information about the Pkg-libvirt-commits mailing list