return qemuDomainCCWAddressAssign(info, data, false);
}
-int qemuDomainCCWAddressReleaseAddr(qemuDomainCCWAddressSetPtr addrs,
- virDomainDeviceInfoPtr dev)
+static int
+qemuDomainCCWAddressReleaseAddr(qemuDomainCCWAddressSetPtr addrs,
+ virDomainDeviceInfoPtr dev)
{
char *addr;
int ret;
return 0;
}
-int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs,
- virDevicePCIAddressPtr addr)
+static int
+qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs,
+ virDevicePCIAddressPtr addr)
{
if (!qemuPCIAddressValidate(addrs, addr))
return -1;
}
+void
+qemuDomainReleaseDeviceAddress(virDomainObjPtr vm,
+ virDomainDeviceInfoPtr info,
+ const char *devstr)
+{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+
+ if (!devstr)
+ devstr = info->alias;
+
+ if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
+ STREQLEN(vm->def->os.machine, "s390-ccw", 8) &&
+ virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_CCW) &&
+ qemuDomainCCWAddressReleaseAddr(priv->ccwaddrs, info) < 0)
+ VIR_WARN("Unable to release CCW address on %s",
+ NULLSTR(devstr));
+ else if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
+ virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
+ qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
+ &info->addr.pci) < 0)
+ VIR_WARN("Unable to release PCI address on %s",
+ NULLSTR(devstr));
+}
+
+
#define IS_USB2_CONTROLLER(ctrl) \
(((ctrl)->type == VIR_DOMAIN_CONTROLLER_TYPE_USB) && \
((ctrl)->model == VIR_DOMAIN_CONTROLLER_MODEL_USB_ICH9_EHCI1 || \
int qemuDomainAssignSpaprVIOAddresses(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps);
+void qemuDomainReleaseDeviceAddress(virDomainObjPtr vm,
+ virDomainDeviceInfoPtr info,
+ const char *devstr);
+
int qemuDomainAssignPCIAddresses(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
virDomainObjPtr obj);
virDomainDeviceInfoPtr dev);
int qemuDomainPCIAddressReleaseAddr(qemuDomainPCIAddressSetPtr addrs,
virDevicePCIAddressPtr addr);
-int qemuDomainPCIAddressReleaseSlot(qemuDomainPCIAddressSetPtr addrs,
- virDevicePCIAddressPtr addr);
void qemuDomainPCIAddressSetFree(qemuDomainPCIAddressSetPtr addrs);
int qemuAssignDevicePCISlots(virDomainDefPtr def,
virQEMUCapsPtr qemuCaps,
qemuDomainPCIAddressSetPtr addrs);
-int qemuDomainCCWAddressReleaseAddr(qemuDomainCCWAddressSetPtr addrs,
- virDomainDeviceInfoPtr dev);
int qemuDomainCCWAddressAssign(virDomainDeviceInfoPtr dev, qemuDomainCCWAddressSetPtr addrs,
bool autoassign);
void qemuDomainCCWAddressSetFree(qemuDomainCCWAddressSetPtr addrs);
return ret;
error:
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) && releaseaddr) {
- if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &disk->info.addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on %s", disk->src);
- else if (disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
- qemuDomainCCWAddressReleaseAddr(priv->ccwaddrs,
- &disk->info) < 0)
- VIR_WARN("Unable to release CCW address on %s", disk->src);
- }
+ if (releaseaddr)
+ qemuDomainReleaseDeviceAddress(vm, &disk->info, disk->src);
if (virSecurityManagerRestoreImageLabel(driver->securityManager,
vm->def, disk) < 0)
}
cleanup:
- if ((ret != 0) &&
- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- (controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) &&
- releaseaddr &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &controller->info.addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on controller");
+ if (ret != 0 && releaseaddr)
+ qemuDomainReleaseDeviceAddress(vm, &controller->info, NULL);
VIR_FREE(devstr);
return ret;
if (!ret) {
vm->def->nets[vm->def->nnets++] = net;
} else {
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- net->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
- releaseaddr &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &net->info.addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on NIC");
- else if (STREQLEN(vm->def->os.machine, "s390-ccw", 8) &&
- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_CCW) &&
- net->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
- releaseaddr &&
- qemuDomainCCWAddressReleaseAddr(priv->ccwaddrs,
- &net->info) < 0)
- VIR_WARN("Unable to release CCW address on NIC");
+ if (releaseaddr)
+ qemuDomainReleaseDeviceAddress(vm, &net->info, NULL);
if (iface_connected) {
virDomainConfNWFilterTeardown(net);
return 0;
error:
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- (hostdev->info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) &&
- releaseaddr &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &hostdev->info->addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on host device");
+ if (releaseaddr)
+ qemuDomainReleaseDeviceAddress(vm, hostdev->info, NULL);
qemuDomainReAttachHostdevDevices(driver, vm->def->name, &hostdev, 1);
virDomainAuditDisk(vm, detach->src, NULL, "detach", true);
- if (detach->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_CCW &&
- STREQLEN(vm->def->os.machine, "s390-ccw", 8) &&
- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_CCW) &&
- qemuDomainCCWAddressReleaseAddr(priv->ccwaddrs, &detach->info) < 0) {
- VIR_WARN("Unable to release CCW address on %s", dev->data.disk->src);
- } else if (detach->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI &&
- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &detach->info.addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on %s", dev->data.disk->src);
+ qemuDomainReleaseDeviceAddress(vm, &detach->info, dev->data.disk->src);
virDomainDiskRemove(vm->def, idx);
qemuDomainObjExitMonitor(driver, vm);
virDomainControllerRemove(vm->def, idx);
+ qemuDomainReleaseDeviceAddress(vm, &detach->info, NULL);
virDomainControllerDefFree(detach);
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &detach->info.addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on controller");
-
ret = 0;
cleanup:
virObjectUnlock(driver->activePciHostdevs);
virObjectUnlock(driver->inactivePciHostdevs);
- if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &detach->info->addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on host device");
+ qemuDomainReleaseDeviceAddress(vm, detach->info, NULL);
cleanup:
virObjectUnref(cfg);
virDomainAuditNet(vm, detach, NULL, "detach", true);
- if (STREQLEN(vm->def->os.machine, "s390-ccw", 8) &&
- virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_VIRTIO_CCW)) {
- if (qemuDomainCCWAddressReleaseAddr(priv->ccwaddrs, &detach->info) < 0)
- VIR_WARN("Unable to release CCW address on NIC");
- } else if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE) &&
- qemuDomainPCIAddressReleaseSlot(priv->pciaddrs,
- &detach->info.addr.pci) < 0)
- VIR_WARN("Unable to release PCI address on NIC");
+ qemuDomainReleaseDeviceAddress(vm, &detach->info, NULL);
virDomainConfNWFilterTeardown(detach);