mirror of
https://github.com/libvirt/libvirt.git
synced 2025-02-25 18:55:26 -06:00
hostdev: Save netdev configuration of actual device
We would be just fine looking up the information in pcidevs most of the time; however, some corner cases would not be handled properly, so look up the actual device instead.
This commit is contained in:
parent
811286090f
commit
c3e2f6e37d
@ -689,7 +689,7 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr mgr,
|
||||
|
||||
/* Step 7: Now set the original states for hostdev def */
|
||||
for (i = 0; i < nhostdevs; i++) {
|
||||
virPCIDevicePtr pci;
|
||||
virPCIDevicePtr actual;
|
||||
virDomainHostdevDefPtr hostdev = hostdevs[i];
|
||||
virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci;
|
||||
|
||||
@ -698,24 +698,27 @@ virHostdevPreparePCIDevices(virHostdevManagerPtr mgr,
|
||||
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||
continue;
|
||||
|
||||
pci = virPCIDeviceListFindByIDs(pcidevs,
|
||||
pcisrc->addr.domain,
|
||||
pcisrc->addr.bus,
|
||||
pcisrc->addr.slot,
|
||||
pcisrc->addr.function);
|
||||
/* We need to look up the actual device because it's the one
|
||||
* that contains the information we care about (unbind_from_stub,
|
||||
* remove_slot, reprobe) */
|
||||
actual = virPCIDeviceListFindByIDs(mgr->activePCIHostdevs,
|
||||
pcisrc->addr.domain,
|
||||
pcisrc->addr.bus,
|
||||
pcisrc->addr.slot,
|
||||
pcisrc->addr.function);
|
||||
|
||||
/* Appropriate values for the unbind_from_stub, remove_slot
|
||||
* and reprobe properties of the device were set earlier
|
||||
* by virPCIDeviceDetach() */
|
||||
if (pci) {
|
||||
if (actual) {
|
||||
VIR_DEBUG("Saving network configuration of PCI device %s",
|
||||
virPCIDeviceGetName(pci));
|
||||
virPCIDeviceGetName(actual));
|
||||
hostdev->origstates.states.pci.unbind_from_stub =
|
||||
virPCIDeviceGetUnbindFromStub(pci);
|
||||
virPCIDeviceGetUnbindFromStub(actual);
|
||||
hostdev->origstates.states.pci.remove_slot =
|
||||
virPCIDeviceGetRemoveSlot(pci);
|
||||
virPCIDeviceGetRemoveSlot(actual);
|
||||
hostdev->origstates.states.pci.reprobe =
|
||||
virPCIDeviceGetReprobe(pci);
|
||||
virPCIDeviceGetReprobe(actual);
|
||||
}
|
||||
}
|
||||
|
||||
@ -898,17 +901,17 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr mgr,
|
||||
|
||||
if (virHostdevIsPCINetDevice(hostdev)) {
|
||||
virDomainHostdevSubsysPCIPtr pcisrc = &hostdev->source.subsys.u.pci;
|
||||
virPCIDevicePtr pci;
|
||||
virPCIDevicePtr actual;
|
||||
|
||||
pci = virPCIDeviceListFindByIDs(pcidevs,
|
||||
pcisrc->addr.domain,
|
||||
pcisrc->addr.bus,
|
||||
pcisrc->addr.slot,
|
||||
pcisrc->addr.function);
|
||||
actual = virPCIDeviceListFindByIDs(mgr->inactivePCIHostdevs,
|
||||
pcisrc->addr.domain,
|
||||
pcisrc->addr.bus,
|
||||
pcisrc->addr.slot,
|
||||
pcisrc->addr.function);
|
||||
|
||||
if (pci) {
|
||||
if (actual) {
|
||||
VIR_DEBUG("Restoring network configuration of PCI device %s",
|
||||
virPCIDeviceGetName(pci));
|
||||
virPCIDeviceGetName(actual));
|
||||
virHostdevNetConfigRestore(hostdev, mgr->stateDir,
|
||||
oldStateDir);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user