diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 0b84a503bb3571bd56b14f7e97b2c0146ac65abb..4f290b5648ce65f3f1722e36d51c6707ea34f3fb 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3598,16 +3598,19 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, goto cleanup; } - /* info: if newdev->info is empty, fill it in from olddev, - * otherwise verify that it matches - nothing is allowed to - * change. (There is no helper function to do this, so - * individually check the few feidls of virDomainDeviceInfo that - * are relevant in this case). + /* info: Nothing is allowed to change. First fill the missing newdev->info + * from olddev and then check for changes. */ - if (!virDomainDeviceAddressIsValid(&newdev->info, - VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) && - virDomainDeviceInfoCopy(&newdev->info, &olddev->info) < 0) { - goto cleanup; + /* if pci addr is missing or is invalid we overwrite it from olddev */ + if (newdev->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE || + !virDomainDeviceAddressIsValid(&newdev->info, + newdev->info.type)) { + newdev->info.type = olddev->info.type; + newdev->info.addr = olddev->info.addr; + } + if (olddev->info.type != newdev->info.type) { + virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", + _("cannot modify network device address type")); } if (!virPCIDeviceAddressEqual(&olddev->info.addr.pci, &newdev->info.addr.pci)) { @@ -3622,21 +3625,33 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, /* device alias is checked already in virDomainDefCompatibleDevice */ + if (newdev->info.rombar == VIR_TRISTATE_BOOL_ABSENT) + newdev->info.rombar = olddev->info.rombar; if (olddev->info.rombar != newdev->info.rombar) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("cannot modify network device rom bar setting")); goto cleanup; } + + if (!newdev->info.romfile && + VIR_STRDUP(newdev->info.romfile, olddev->info.romfile) < 0) + goto cleanup; if (STRNEQ_NULLABLE(olddev->info.romfile, newdev->info.romfile)) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("cannot modify network rom file")); goto cleanup; } + + if (newdev->info.bootIndex == 0) + newdev->info.bootIndex = olddev->info.bootIndex; if (olddev->info.bootIndex != newdev->info.bootIndex) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("cannot modify network device boot index setting")); goto cleanup; } + + if (newdev->info.romenabled == VIR_TRISTATE_BOOL_ABSENT) + newdev->info.romenabled = olddev->info.romenabled; if (olddev->info.romenabled != newdev->info.romenabled) { virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s", _("cannot modify network device rom enabled setting"));