return ret;
}
+static int
+qemuDomainAttachChrDeviceAssignAddr(qemuDomainObjPrivatePtr priv,
+ virDomainChrDefPtr chr)
+{
+ if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
+ chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO) {
+ if (virDomainVirtioSerialAddrAutoAssign(NULL, priv->vioserialaddrs,
+ &chr->info, true) < 0)
+ return -1;
+ return 1;
+
+ } else if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
+ chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI) {
+ if (virDomainPCIAddressEnsureAddr(priv->pciaddrs, &chr->info) < 0)
+ return -1;
+ return 1;
+
+ } else if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CHANNEL &&
+ chr->targetType == VIR_DOMAIN_CHR_CHANNEL_TARGET_TYPE_VIRTIO) {
+ if (virDomainVirtioSerialAddrAutoAssign(NULL, priv->vioserialaddrs,
+ &chr->info, false) < 0)
+ return -1;
+ return 1;
+ }
+
+ if (chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_SERIAL ||
+ chr->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("Unsupported address type for character device"));
+ return -1;
+ }
+
+ return 0;
+}
+
int qemuDomainAttachChrDevice(virQEMUDriverPtr driver,
virDomainObjPtr vm,
virDomainChrDefPtr chr)
{
- int ret = -1;
+ int ret = -1, rc;
qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainDefPtr vmdef = vm->def;
char *devstr = NULL;
char *charAlias = NULL;
bool need_release = false;
- bool allowZero = false;
if (!virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE)) {
virReportError(VIR_ERR_OPERATION_INVALID, "%s",
if (qemuAssignDeviceChrAlias(vmdef, chr, -1) < 0)
goto cleanup;
- if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_CONSOLE &&
- chr->targetType == VIR_DOMAIN_CHR_CONSOLE_TARGET_TYPE_VIRTIO)
- allowZero = true;
-
- if (chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI) {
- if (virDomainPCIAddressEnsureAddr(priv->pciaddrs, &chr->info) < 0)
- goto cleanup;
- } else if (chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB) {
- /* XXX */
- } else {
- if (virDomainVirtioSerialAddrAutoAssign(NULL,
- priv->vioserialaddrs,
- &chr->info,
- allowZero) < 0)
- goto cleanup;
- }
- need_release = true;
+ if ((rc = qemuDomainAttachChrDeviceAssignAddr(priv, chr) < 0))
+ goto cleanup;
+ if (rc == 1)
+ need_release = true;
if (qemuBuildChrDeviceStr(&devstr, vm->def, chr, priv->qemuCaps) < 0)
goto cleanup;
cleanup:
if (ret < 0 && virDomainObjIsActive(vm))
qemuDomainChrInsertPreAllocCleanup(vm->def, chr);
- if (ret < 0 && need_release) {
- if (chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI) {
- qemuDomainReleaseDeviceAddress(vm, &chr->info, NULL);
- } else if (chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_USB) {
- /* XXX */
- } else {
- virDomainVirtioSerialAddrRelease(priv->vioserialaddrs, &chr->info);
- }
- }
+ if (ret < 0 && need_release)
+ qemuDomainReleaseDeviceAddress(vm, &chr->info, NULL);
VIR_FREE(charAlias);
VIR_FREE(devstr);
return ret;