virDomainDefCompatibleDevice(virDomainDefPtr def,
virDomainDeviceDefPtr dev,
virDomainDeviceDefPtr oldDev,
- virDomainDeviceAction action ATTRIBUTE_UNUSED)
+ virDomainDeviceAction action,
+ bool live)
{
virDomainCompatibleDeviceData data = {
.newInfo = virDomainDeviceGetInfo(dev),
if (oldDev)
data.oldInfo = virDomainDeviceGetInfo(oldDev);
+ if (action == VIR_DOMAIN_DEVICE_ACTION_UPDATE &&
+ live &&
+ ((!!data.newInfo != !!data.oldInfo) ||
+ (data.newInfo && data.oldInfo &&
+ STRNEQ_NULLABLE(data.newInfo->alias, data.oldInfo->alias)))) {
+ virReportError(VIR_ERR_OPERATION_DENIED, "%s",
+ _("changing device alias is not allowed"));
+ return -1;
+ }
+
if (!virDomainDefHasUSB(def) &&
def->os.type != VIR_DOMAIN_OSTYPE_EXE &&
virDomainDeviceIsUSB(dev)) {
int virDomainDefCompatibleDevice(virDomainDefPtr def,
virDomainDeviceDefPtr dev,
virDomainDeviceDefPtr oldDev,
- virDomainDeviceAction action);
+ virDomainDeviceAction action,
+ bool live);
void virDomainRNGDefFree(virDomainRNGDefPtr def);
oldDev.data.net = vmdef->nets[idx];
if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev,
- VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ false) < 0)
return -1;
virDomainNetDefFree(vmdef->nets[idx]);
goto endjob;
if (virDomainDefCompatibleDevice(vmdef, dev, NULL,
- VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH,
+ false) < 0)
goto endjob;
if ((ret = lxcDomainAttachDeviceConfig(vmdef, dev)) < 0)
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
if (virDomainDefCompatibleDevice(vm->def, dev_copy, NULL,
- VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH,
+ true) < 0)
goto endjob;
if ((ret = lxcDomainAttachDeviceLive(dom->conn, driver, vm, dev_copy)) < 0)
return false;
}
- if (disk->info.alias &&
- STRNEQ_NULLABLE(disk->info.alias, orig_disk->info.alias)) {
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED,
- _("cannot modify field '%s' of the disk"),
- "alias");
- return false;
- }
+ /* device alias is checked already in virDomainDefCompatibleDevice */
CHECK_EQ(info.bootIndex, "boot order", true);
CHECK_EQ(rawio, "rawio", true);
oldDev.data.disk = orig_disk;
if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev,
- VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ true) < 0)
goto cleanup;
if (!qemuDomainDiskChangeSupported(disk, orig_disk))
if ((idx = qemuDomainFindGraphicsIndex(vm->def, dev->data.graphics)) >= 0) {
oldDev.data.graphics = vm->def->graphics[idx];
if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev,
- VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ true) < 0)
return -1;
}
if ((idx = virDomainNetFindIdx(vm->def, dev->data.net)) >= 0) {
oldDev.data.net = vm->def->nets[idx];
if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev,
- VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ true) < 0)
return -1;
}
oldDev.data.disk = vmdef->disks[pos];
if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev,
- VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ false) < 0)
return -1;
virDomainDiskDefFree(vmdef->disks[pos]);
oldDev.data.graphics = vmdef->graphics[pos];
if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev,
- VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ false) < 0)
return -1;
virDomainGraphicsDefFree(vmdef->graphics[pos]);
oldDev.data.net = vmdef->nets[pos];
if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev,
- VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+ false) < 0)
return -1;
virDomainNetDefFree(vmdef->nets[pos]);
goto cleanup;
if (virDomainDefCompatibleDevice(vmdef, dev, NULL,
- VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH,
+ false) < 0)
goto cleanup;
if ((ret = qemuDomainAttachDeviceConfig(vmdef, dev, caps,
parse_flags,
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
if (virDomainDefCompatibleDevice(vm->def, dev_copy, NULL,
- VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH,
+ true) < 0)
goto cleanup;
if ((ret = qemuDomainAttachDeviceLive(vm, dev_copy, driver)) < 0)
if (!newdev->info.alias &&
VIR_STRDUP(newdev->info.alias, olddev->info.alias) < 0)
goto cleanup;
- if (STRNEQ_NULLABLE(olddev->info.alias, newdev->info.alias)) {
- virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
- _("cannot modify network device alias"));
- goto cleanup;
- }
+
+ /* device alias is checked already in virDomainDefCompatibleDevice */
+
if (olddev->info.rombar != newdev->info.rombar) {
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
_("cannot modify network device rom bar setting"));