mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-10-22 22:13:18 +00:00
move virHostdevUpdate* functions to virhostdev.c
This commit is contained in:
parent
d44a20470e
commit
00729f4559
@ -1301,6 +1301,9 @@ virHookPresent;
|
|||||||
virHostdevManagerGetDefault;
|
virHostdevManagerGetDefault;
|
||||||
virHostdevPreparePCIDevices;
|
virHostdevPreparePCIDevices;
|
||||||
virHostdevReAttachPCIDevices;
|
virHostdevReAttachPCIDevices;
|
||||||
|
virHostdevUpdateActivePciHostdevs;
|
||||||
|
virHostdevUpdateActiveScsiHostdevs;
|
||||||
|
virHostdevUpdateActiveUsbHostdevs;
|
||||||
|
|
||||||
# util/viridentity.h
|
# util/viridentity.h
|
||||||
virIdentityGetAttr;
|
virIdentityGetAttr;
|
||||||
|
@ -41,65 +41,6 @@
|
|||||||
|
|
||||||
#define VIR_FROM_THIS VIR_FROM_QEMU
|
#define VIR_FROM_THIS VIR_FROM_QEMU
|
||||||
|
|
||||||
static int
|
|
||||||
virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr,
|
|
||||||
const char *drv_name,
|
|
||||||
virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
virDomainHostdevDefPtr hostdev = NULL;
|
|
||||||
virPCIDevicePtr dev = NULL;
|
|
||||||
size_t i;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
virObjectLock(mgr->activePciHostdevs);
|
|
||||||
virObjectLock(mgr->inactivePciHostdevs);
|
|
||||||
|
|
||||||
for (i = 0; i < def->nhostdevs; i++) {
|
|
||||||
hostdev = def->hostdevs[i];
|
|
||||||
|
|
||||||
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
|
||||||
continue;
|
|
||||||
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.addr.domain,
|
|
||||||
hostdev->source.subsys.u.pci.addr.bus,
|
|
||||||
hostdev->source.subsys.u.pci.addr.slot,
|
|
||||||
hostdev->source.subsys.u.pci.addr.function);
|
|
||||||
|
|
||||||
if (!dev)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
virPCIDeviceSetManaged(dev, hostdev->managed);
|
|
||||||
if (hostdev->source.subsys.u.pci.backend
|
|
||||||
== VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
|
|
||||||
if (virPCIDeviceSetStubDriver(dev, "vfio-pci") < 0)
|
|
||||||
goto cleanup;
|
|
||||||
} else {
|
|
||||||
if (virPCIDeviceSetStubDriver(dev, "pci-stub") < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
}
|
|
||||||
virPCIDeviceSetUsedBy(dev, drv_name, def->name);
|
|
||||||
|
|
||||||
/* Setup the original states for the PCI device */
|
|
||||||
virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub);
|
|
||||||
virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot);
|
|
||||||
virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe);
|
|
||||||
|
|
||||||
if (virPCIDeviceListAdd(mgr->activePciHostdevs, dev) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
dev = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = 0;
|
|
||||||
cleanup:
|
|
||||||
virPCIDeviceFree(dev);
|
|
||||||
virObjectUnlock(mgr->activePciHostdevs);
|
|
||||||
virObjectUnlock(mgr->inactivePciHostdevs);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver,
|
qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver,
|
||||||
virDomainDefPtr def)
|
virDomainDefPtr def)
|
||||||
@ -112,49 +53,6 @@ qemuUpdateActivePciHostdevs(virQEMUDriverPtr driver,
|
|||||||
return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def);
|
return virHostdevUpdateActivePciHostdevs(mgr, QEMU_DRIVER_NAME, def);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr,
|
|
||||||
const char *drv_name,
|
|
||||||
virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
virDomainHostdevDefPtr hostdev = NULL;
|
|
||||||
size_t i;
|
|
||||||
int ret = -1;
|
|
||||||
|
|
||||||
virObjectLock(mgr->activeUsbHostdevs);
|
|
||||||
for (i = 0; i < def->nhostdevs; i++) {
|
|
||||||
virUSBDevicePtr usb = NULL;
|
|
||||||
hostdev = def->hostdevs[i];
|
|
||||||
|
|
||||||
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
|
||||||
continue;
|
|
||||||
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus,
|
|
||||||
hostdev->source.subsys.u.usb.device,
|
|
||||||
NULL);
|
|
||||||
if (!usb) {
|
|
||||||
VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s",
|
|
||||||
hostdev->source.subsys.u.usb.bus,
|
|
||||||
hostdev->source.subsys.u.usb.device,
|
|
||||||
def->name);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
virUSBDeviceSetUsedBy(usb, drv_name, def->name);
|
|
||||||
|
|
||||||
if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) {
|
|
||||||
virUSBDeviceFree(usb);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
cleanup:
|
|
||||||
virObjectUnlock(mgr->activeUsbHostdevs);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,
|
qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,
|
||||||
virDomainDefPtr def)
|
virDomainDefPtr def)
|
||||||
@ -167,55 +65,6 @@ qemuUpdateActiveUsbHostdevs(virQEMUDriverPtr driver,
|
|||||||
return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def);
|
return virHostdevUpdateActiveUsbHostdevs(mgr, QEMU_DRIVER_NAME, def);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr,
|
|
||||||
const char *drv_name,
|
|
||||||
virDomainDefPtr def)
|
|
||||||
{
|
|
||||||
virDomainHostdevDefPtr hostdev = NULL;
|
|
||||||
size_t i;
|
|
||||||
int ret = -1;
|
|
||||||
virSCSIDevicePtr scsi = NULL;
|
|
||||||
virSCSIDevicePtr tmp = NULL;
|
|
||||||
|
|
||||||
virObjectLock(mgr->activeScsiHostdevs);
|
|
||||||
for (i = 0; i < def->nhostdevs; i++) {
|
|
||||||
hostdev = def->hostdevs[i];
|
|
||||||
|
|
||||||
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
|
|
||||||
hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (!(scsi = virSCSIDeviceNew(NULL,
|
|
||||||
hostdev->source.subsys.u.scsi.adapter,
|
|
||||||
hostdev->source.subsys.u.scsi.bus,
|
|
||||||
hostdev->source.subsys.u.scsi.target,
|
|
||||||
hostdev->source.subsys.u.scsi.unit,
|
|
||||||
hostdev->readonly,
|
|
||||||
hostdev->shareable)))
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if ((tmp = virSCSIDeviceListFind(mgr->activeScsiHostdevs, scsi))) {
|
|
||||||
if (virSCSIDeviceSetUsedBy(tmp, drv_name, def->name) < 0) {
|
|
||||||
virSCSIDeviceFree(scsi);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
virSCSIDeviceFree(scsi);
|
|
||||||
} else {
|
|
||||||
if (virSCSIDeviceSetUsedBy(scsi, drv_name, def->name) < 0 ||
|
|
||||||
virSCSIDeviceListAdd(mgr->activeScsiHostdevs, scsi) < 0) {
|
|
||||||
virSCSIDeviceFree(scsi);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret = 0;
|
|
||||||
|
|
||||||
cleanup:
|
|
||||||
virObjectUnlock(mgr->activeScsiHostdevs);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int
|
int
|
||||||
qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver,
|
qemuUpdateActiveScsiHostdevs(virQEMUDriverPtr driver,
|
||||||
virDomainDefPtr def)
|
virDomainDefPtr def)
|
||||||
|
@ -773,3 +773,154 @@ cleanup:
|
|||||||
virObjectUnlock(hostdev_mgr->activePciHostdevs);
|
virObjectUnlock(hostdev_mgr->activePciHostdevs);
|
||||||
virObjectUnlock(hostdev_mgr->inactivePciHostdevs);
|
virObjectUnlock(hostdev_mgr->inactivePciHostdevs);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr,
|
||||||
|
const char *drv_name,
|
||||||
|
virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
virDomainHostdevDefPtr hostdev = NULL;
|
||||||
|
virPCIDevicePtr dev = NULL;
|
||||||
|
size_t i;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
virObjectLock(mgr->activePciHostdevs);
|
||||||
|
virObjectLock(mgr->inactivePciHostdevs);
|
||||||
|
|
||||||
|
for (i = 0; i < def->nhostdevs; i++) {
|
||||||
|
hostdev = def->hostdevs[i];
|
||||||
|
|
||||||
|
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||||
|
continue;
|
||||||
|
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_PCI)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
dev = virPCIDeviceNew(hostdev->source.subsys.u.pci.addr.domain,
|
||||||
|
hostdev->source.subsys.u.pci.addr.bus,
|
||||||
|
hostdev->source.subsys.u.pci.addr.slot,
|
||||||
|
hostdev->source.subsys.u.pci.addr.function);
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
virPCIDeviceSetManaged(dev, hostdev->managed);
|
||||||
|
if (hostdev->source.subsys.u.pci.backend
|
||||||
|
== VIR_DOMAIN_HOSTDEV_PCI_BACKEND_VFIO) {
|
||||||
|
if (virPCIDeviceSetStubDriver(dev, "vfio-pci") < 0)
|
||||||
|
goto cleanup;
|
||||||
|
} else {
|
||||||
|
if (virPCIDeviceSetStubDriver(dev, "pci-stub") < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
}
|
||||||
|
virPCIDeviceSetUsedBy(dev, drv_name, def->name);
|
||||||
|
|
||||||
|
/* Setup the original states for the PCI device */
|
||||||
|
virPCIDeviceSetUnbindFromStub(dev, hostdev->origstates.states.pci.unbind_from_stub);
|
||||||
|
virPCIDeviceSetRemoveSlot(dev, hostdev->origstates.states.pci.remove_slot);
|
||||||
|
virPCIDeviceSetReprobe(dev, hostdev->origstates.states.pci.reprobe);
|
||||||
|
|
||||||
|
if (virPCIDeviceListAdd(mgr->activePciHostdevs, dev) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
dev = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
virPCIDeviceFree(dev);
|
||||||
|
virObjectUnlock(mgr->activePciHostdevs);
|
||||||
|
virObjectUnlock(mgr->inactivePciHostdevs);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr,
|
||||||
|
const char *drv_name,
|
||||||
|
virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
virDomainHostdevDefPtr hostdev = NULL;
|
||||||
|
size_t i;
|
||||||
|
int ret = -1;
|
||||||
|
|
||||||
|
virObjectLock(mgr->activeUsbHostdevs);
|
||||||
|
for (i = 0; i < def->nhostdevs; i++) {
|
||||||
|
virUSBDevicePtr usb = NULL;
|
||||||
|
hostdev = def->hostdevs[i];
|
||||||
|
|
||||||
|
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS)
|
||||||
|
continue;
|
||||||
|
if (hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_USB)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
usb = virUSBDeviceNew(hostdev->source.subsys.u.usb.bus,
|
||||||
|
hostdev->source.subsys.u.usb.device,
|
||||||
|
NULL);
|
||||||
|
if (!usb) {
|
||||||
|
VIR_WARN("Unable to reattach USB device %03d.%03d on domain %s",
|
||||||
|
hostdev->source.subsys.u.usb.bus,
|
||||||
|
hostdev->source.subsys.u.usb.device,
|
||||||
|
def->name);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
virUSBDeviceSetUsedBy(usb, drv_name, def->name);
|
||||||
|
|
||||||
|
if (virUSBDeviceListAdd(mgr->activeUsbHostdevs, usb) < 0) {
|
||||||
|
virUSBDeviceFree(usb);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
cleanup:
|
||||||
|
virObjectUnlock(mgr->activeUsbHostdevs);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr,
|
||||||
|
const char *drv_name,
|
||||||
|
virDomainDefPtr def)
|
||||||
|
{
|
||||||
|
virDomainHostdevDefPtr hostdev = NULL;
|
||||||
|
size_t i;
|
||||||
|
int ret = -1;
|
||||||
|
virSCSIDevicePtr scsi = NULL;
|
||||||
|
virSCSIDevicePtr tmp = NULL;
|
||||||
|
|
||||||
|
virObjectLock(mgr->activeScsiHostdevs);
|
||||||
|
for (i = 0; i < def->nhostdevs; i++) {
|
||||||
|
hostdev = def->hostdevs[i];
|
||||||
|
|
||||||
|
if (hostdev->mode != VIR_DOMAIN_HOSTDEV_MODE_SUBSYS ||
|
||||||
|
hostdev->source.subsys.type != VIR_DOMAIN_HOSTDEV_SUBSYS_TYPE_SCSI)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (!(scsi = virSCSIDeviceNew(NULL,
|
||||||
|
hostdev->source.subsys.u.scsi.adapter,
|
||||||
|
hostdev->source.subsys.u.scsi.bus,
|
||||||
|
hostdev->source.subsys.u.scsi.target,
|
||||||
|
hostdev->source.subsys.u.scsi.unit,
|
||||||
|
hostdev->readonly,
|
||||||
|
hostdev->shareable)))
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
|
if ((tmp = virSCSIDeviceListFind(mgr->activeScsiHostdevs, scsi))) {
|
||||||
|
if (virSCSIDeviceSetUsedBy(tmp, drv_name, def->name) < 0) {
|
||||||
|
virSCSIDeviceFree(scsi);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
virSCSIDeviceFree(scsi);
|
||||||
|
} else {
|
||||||
|
if (virSCSIDeviceSetUsedBy(scsi, drv_name, def->name) < 0 ||
|
||||||
|
virSCSIDeviceListAdd(mgr->activeScsiHostdevs, scsi) < 0) {
|
||||||
|
virSCSIDeviceFree(scsi);
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = 0;
|
||||||
|
|
||||||
|
cleanup:
|
||||||
|
virObjectUnlock(mgr->activeScsiHostdevs);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
@ -65,5 +65,17 @@ virHostdevReAttachPCIDevices(virHostdevManagerPtr hostdev_mgr,
|
|||||||
virDomainHostdevDefPtr *hostdevs,
|
virDomainHostdevDefPtr *hostdevs,
|
||||||
int nhostdevs,
|
int nhostdevs,
|
||||||
char *oldStateDir);
|
char *oldStateDir);
|
||||||
|
int
|
||||||
|
virHostdevUpdateActivePciHostdevs(virHostdevManagerPtr mgr,
|
||||||
|
const char *drv_name,
|
||||||
|
virDomainDefPtr def);
|
||||||
|
int
|
||||||
|
virHostdevUpdateActiveUsbHostdevs(virHostdevManagerPtr mgr,
|
||||||
|
const char *drv_name,
|
||||||
|
virDomainDefPtr def);
|
||||||
|
int
|
||||||
|
virHostdevUpdateActiveScsiHostdevs(virHostdevManagerPtr mgr,
|
||||||
|
const char *drv_name,
|
||||||
|
virDomainDefPtr def);
|
||||||
|
|
||||||
#endif /* __VIR_HOSTDEV_H__ */
|
#endif /* __VIR_HOSTDEV_H__ */
|
||||||
|
Loading…
Reference in New Issue
Block a user