File fix-pci-attach-xen-driver.patch of Package libvirt

Fix PCI device attach in xend driver

When attaching PCI device using the xend driver, the 'device_create'
RPC is called, which is not sufficient to fully prepare/configure
the device for attachment to a domain.  In the xen tools, xm pci-attach
uses the 'device_configure' RPC.

This patch changes the xend driver to always call 'device_configure' for
PCI devices to be consistent with the usage in the xen tools.

Index: libvirt-1.2.9/src/xen/xend_internal.c
===================================================================
--- libvirt-1.2.9.orig/src/xen/xend_internal.c
+++ libvirt-1.2.9/src/xen/xend_internal.c
@@ -2221,6 +2221,7 @@ xenDaemonAttachDeviceFlags(virConnectPtr
     virBuffer buf = VIR_BUFFER_INITIALIZER;
     char class[8], ref[80];
     char *target = NULL;
+    int new_dev;
 
     virCheckFlags(VIR_DOMAIN_AFFECT_LIVE | VIR_DOMAIN_AFFECT_CONFIG, -1);
 
@@ -2319,8 +2320,18 @@ xenDaemonAttachDeviceFlags(virConnectPtr
     }
 
     sexpr = virBufferContentAndReset(&buf);
+    new_dev = virDomainXMLDevID(conn, minidef, dev, class, ref, sizeof(ref));
 
-    if (virDomainXMLDevID(conn, minidef, dev, class, ref, sizeof(ref))) {
+    /* always call 'device_configure' for pci device */
+    if (dev->type == VIR_DOMAIN_DEVICE_HOSTDEV &&
+        dev->data.hostdev->mode == VIR_DOMAIN_HOSTDEV_MODE_SUBSYS &&
+        dev->data.hostdev->source.subsys.type == VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI) {
+        ret = xend_op(conn, def->name, "op", "device_configure",
+                      "config", sexpr, "dev", ref, NULL);
+        goto cleanup;
+    }
+
+    if (new_dev) {
         /* device doesn't exist, define it */
         ret = xend_op(conn, def->name, "op", "device_create",
                       "config", sexpr, NULL);
openSUSE Build Service is sponsored by