File a0aec362-pcidev5.patch of Package libvirt.openSUSE_12.1_Update
commit a0aec362e858e30da5cd423d9375d4a27abf4ec7
Author: Osier Yang <jyang@redhat.com>
Date: Tue Nov 29 18:09:24 2011 +0800
qemu: Honor the original properties of PCI device when detaching
This patch fixes two problems:
1) The device will be reattached to host even if it's not
managed, as there is a "pciDeviceSetManaged".
2) The device won't be reattached to host with original
driver properly. As it doesn't honor the device original
properties which are maintained by driver->activePciHostdevs.
Index: libvirt-0.9.6/src/qemu/qemu_hotplug.c
===================================================================
--- libvirt-0.9.6.orig/src/qemu/qemu_hotplug.c
+++ libvirt-0.9.6/src/qemu/qemu_hotplug.c
@@ -1922,6 +1922,7 @@ int qemuDomainDetachHostPciDevice(struct
qemuDomainObjPrivatePtr priv = vm->privateData;
int i, ret;
pciDevice *pci;
+ pciDevice *activePci;
for (i = 0 ; i < vm->def->nhostdevs ; i++) {
if (vm->def->hostdevs[i]->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
@@ -1981,16 +1982,16 @@ int qemuDomainDetachHostPciDevice(struct
detach->source.subsys.u.pci.bus,
detach->source.subsys.u.pci.slot,
detach->source.subsys.u.pci.function);
- if (!pci)
- ret = -1;
- else {
- pciDeviceSetManaged(pci, detach->managed);
- pciDeviceListDel(driver->activePciHostdevs, pci);
- if (pciResetDevice(pci, driver->activePciHostdevs, NULL) < 0)
+ if (pci) {
+ activePci = pciDeviceListSteal(driver->activePciHostdevs, pci);
+ if (pciResetDevice(activePci, driver->activePciHostdevs, NULL))
+ qemuReattachPciDevice(activePci, driver);
+ else
ret = -1;
- pciDeviceReAttachInit(pci);
- qemuReattachPciDevice(pci, driver);
pciFreeDevice(pci);
+ pciFreeDevice(activePci);
+ } else {
+ ret = -1;
}
if (qemuCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&