{
int ret = -1;
virDomainNetDefPtr net;
+ virDomainDeviceDef oldDev = { .type = dev->type };
int idx;
switch (dev->type) {
if ((idx = virDomainNetFindIdx(vmdef, net)) < 0)
goto cleanup;
- virDomainNetDefFree(vmdef->nets[idx]);
+ oldDev.data.net = vmdef->nets[idx];
+ if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev) < 0)
+ return -1;
+ virDomainNetDefFree(vmdef->nets[idx]);
vmdef->nets[idx] = net;
dev->data.net = NULL;
ret = 0;
if (!vmdef)
goto endjob;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev, NULL) < 0)
goto endjob;
if ((ret = lxcDomainAttachDeviceConfig(vmdef, dev)) < 0)
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
+ if (virDomainDefCompatibleDevice(vm->def, dev_copy, NULL) < 0)
goto endjob;
if ((ret = lxcDomainAttachDeviceLive(dom->conn, driver, vm, dev_copy)) < 0)
if (!vmdef)
goto endjob;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
- goto endjob;
-
+ /* virDomainDefCompatibleDevice call is delayed until we know the
+ * device we're going to update. */
if ((ret = lxcDomainUpdateDeviceConfig(vmdef, dev)) < 0)
goto endjob;
}
{
virDomainDiskDefPtr disk = dev->data.disk;
virDomainDiskDefPtr orig_disk = NULL;
+ virDomainDeviceDef oldDev = { .type = dev->type };
int ret = -1;
if (virDomainDiskTranslateSourcePool(disk) < 0)
goto cleanup;
}
+ oldDev.data.disk = orig_disk;
+ if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev) < 0)
+ goto cleanup;
+
if (!qemuDomainDiskChangeSupported(disk, orig_disk))
goto cleanup;
bool force)
{
virQEMUDriverPtr driver = dom->conn->privateData;
+ virDomainDeviceDef oldDev = { .type = dev->type };
int ret = -1;
+ int idx;
switch ((virDomainDeviceType) dev->type) {
case VIR_DOMAIN_DEVICE_DISK:
qemuDomainObjCheckDiskTaint(driver, vm, dev->data.disk, NULL);
ret = qemuDomainChangeDiskLive(vm, dev, driver, force);
break;
+
case VIR_DOMAIN_DEVICE_GRAPHICS:
+ if ((idx = qemuDomainFindGraphicsIndex(vm->def, dev->data.graphics) >= 0)) {
+ oldDev.data.graphics = vm->def->graphics[idx];
+ if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev) < 0)
+ return -1;
+ }
+
ret = qemuDomainChangeGraphics(driver, vm, dev->data.graphics);
break;
+
case VIR_DOMAIN_DEVICE_NET:
+ if ((idx = virDomainNetFindIdx(vm->def, dev->data.net)) >= 0) {
+ oldDev.data.net = vm->def->nets[idx];
+ if (virDomainDefCompatibleDevice(vm->def, dev, &oldDev) < 0)
+ return -1;
+ }
+
ret = qemuDomainChangeNet(driver, vm, dev);
break;
+
case VIR_DOMAIN_DEVICE_FS:
case VIR_DOMAIN_DEVICE_INPUT:
case VIR_DOMAIN_DEVICE_SOUND:
virDomainDiskDefPtr newDisk;
virDomainGraphicsDefPtr newGraphics;
virDomainNetDefPtr net;
+ virDomainDeviceDef oldDev = { .type = dev->type };
int pos;
switch ((virDomainDeviceType) dev->type) {
return -1;
}
+ oldDev.data.disk = vmdef->disks[pos];
+ if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev) < 0)
+ return -1;
+
virDomainDiskDefFree(vmdef->disks[pos]);
vmdef->disks[pos] = newDisk;
dev->data.disk = NULL;
return -1;
}
- virDomainGraphicsDefFree(vmdef->graphics[pos]);
+ oldDev.data.graphics = vmdef->graphics[pos];
+ if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev) < 0)
+ return -1;
+ virDomainGraphicsDefFree(vmdef->graphics[pos]);
vmdef->graphics[pos] = newGraphics;
dev->data.graphics = NULL;
break;
if ((pos = virDomainNetFindIdx(vmdef, net)) < 0)
return -1;
- virDomainNetDefFree(vmdef->nets[pos]);
+ oldDev.data.net = vmdef->nets[pos];
+ if (virDomainDefCompatibleDevice(vmdef, dev, &oldDev) < 0)
+ return -1;
+ virDomainNetDefFree(vmdef->nets[pos]);
vmdef->nets[pos] = net;
dev->data.net = NULL;
break;
if (!vmdef)
goto cleanup;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev, NULL) < 0)
goto cleanup;
if ((ret = qemuDomainAttachDeviceConfig(vmdef, dev, caps,
parse_flags,
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
+ if (virDomainDefCompatibleDevice(vm->def, dev_copy, NULL) < 0)
goto cleanup;
if ((ret = qemuDomainAttachDeviceLive(vm, dev_copy, driver)) < 0)
if (!vmdef)
goto endjob;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
- goto endjob;
-
+ /* virDomainDefCompatibleDevice call is delayed until we know the
+ * device we're going to update. */
if ((ret = qemuDomainUpdateDeviceConfig(vmdef, dev, caps,
parse_flags,
driver->xmlopt)) < 0)
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
- goto endjob;
-
+ /* virDomainDefCompatibleDevice call is delayed until we know the
+ * device we're going to update. */
if ((ret = qemuDomainUpdateDeviceLive(vm, dev_copy, dom, force)) < 0)
goto endjob;
/*