mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
remove devices from driver->activePciHostdevs when qemuPrepareHostdevPCIDevices() failed
We should not mark pci devices as active when qemuPrepareHostdevPCIDevices() failed.
This commit is contained in:
parent
d5981f1caf
commit
115498597a
@ -112,7 +112,7 @@ int qemuPrepareHostdevPCIDevices(struct qemud_driver *driver,
|
|||||||
if (!(pcidevs = qemuGetPciHostDeviceList(hostdevs, nhostdevs)))
|
if (!(pcidevs = qemuGetPciHostDeviceList(hostdevs, nhostdevs)))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
/* We have to use 3 loops here. *All* devices must
|
/* We have to use 4 loops here. *All* devices must
|
||||||
* be detached before we reset any of them, because
|
* be detached before we reset any of them, because
|
||||||
* in some cases you have to reset the whole PCI,
|
* in some cases you have to reset the whole PCI,
|
||||||
* which impacts all devices on it. Also, all devices
|
* which impacts all devices on it. Also, all devices
|
||||||
@ -145,14 +145,29 @@ int qemuPrepareHostdevPCIDevices(struct qemud_driver *driver,
|
|||||||
/* Now mark all the devices as active */
|
/* Now mark all the devices as active */
|
||||||
for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
|
for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
|
||||||
pciDevice *dev = pciDeviceListGet(pcidevs, i);
|
pciDevice *dev = pciDeviceListGet(pcidevs, i);
|
||||||
pciDeviceListSteal(pcidevs, dev);
|
|
||||||
if (pciDeviceListAdd(driver->activePciHostdevs, dev) < 0) {
|
if (pciDeviceListAdd(driver->activePciHostdevs, dev) < 0) {
|
||||||
pciFreeDevice(dev);
|
pciFreeDevice(dev);
|
||||||
goto cleanup;
|
goto inactivedevs;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Now steal all the devices from pcidevs */
|
||||||
|
for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
|
||||||
|
pciDevice *dev = pciDeviceListGet(pcidevs, i);
|
||||||
|
pciDeviceListSteal(pcidevs, dev);
|
||||||
|
}
|
||||||
|
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
inactivedevs:
|
||||||
|
/* Only steal all the devices from driver->activePciHostdevs. We will
|
||||||
|
* free them in pciDeviceListFree().
|
||||||
|
*/
|
||||||
|
for (i = 0; i < pciDeviceListCount(pcidevs); i++) {
|
||||||
|
pciDevice *dev = pciDeviceListGet(pcidevs, i);
|
||||||
|
pciDeviceListSteal(driver->activePciHostdevs, dev);
|
||||||
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
pciDeviceListFree(pcidevs);
|
pciDeviceListFree(pcidevs);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user