pciSharesBusWithActive fails to find multiple devices on bus

The first conditional is always true which means the iterator will
never find another device on the same bus.

    if (dev->domain != check->domain ||
        dev->bus != check->bus ||
  ----> (check->slot == check->slot &&
         check->function == check->function)) <-----

The goal of that check is to verify that the device is either:

  in a different pci domain
  on a different bus
  is the same identical device

This means libvirt may issue a secondary bus reset when there are
devices
on that bus that actively in use by the host or another guest.

* src/util/pci.c: fix a bogus test in pciSharesBusWithActive()
This commit is contained in:
Chris Wright 2010-07-23 11:25:24 +02:00 committed by Daniel Veillard
parent 8d4f024221
commit f4828ca353

View File

@ -446,10 +446,11 @@ pciSharesBusWithActive(pciDevice *dev, pciDevice *check, void *data)
{
pciDeviceList *activeDevs = data;
/* Different domain, different bus, or simply identical device */
if (dev->domain != check->domain ||
dev->bus != check->bus ||
(check->slot == check->slot &&
check->function == check->function))
(dev->slot == check->slot &&
dev->function == check->function))
return 0;
if (activeDevs && !pciDeviceListFind(activeDevs, check))