int
virDomainDefCompatibleDevice(virDomainDefPtr def,
- virDomainDeviceDefPtr dev)
+ virDomainDeviceDefPtr dev,
+ virDomainDeviceAction action)
{
+ if (action != VIR_DOMAIN_DEVICE_ACTION_ATTACH)
+ return 0;
+
if (!virDomainDefHasUSB(def) &&
STRNEQ(def->os.type, "exe") &&
virDomainDeviceIsUSB(dev)) {
virDomainNetDefPtr def,
unsigned int flags);
+typedef enum {
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH,
+ VIR_DOMAIN_DEVICE_ACTION_DETACH,
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE,
+} virDomainDeviceAction;
+
int virDomainDefCompatibleDevice(virDomainDefPtr def,
- virDomainDeviceDefPtr dev);
+ virDomainDeviceDefPtr dev,
+ virDomainDeviceAction action);
int virDomainVcpuPinAdd(virDomainVcpuPinDefPtr **vcpupin_list,
size_t *nvcpupin,
if (!vmdef)
goto cleanup;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev,
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
goto cleanup;
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,
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
goto cleanup;
if ((ret = lxcDomainAttachDeviceLive(dom->conn, driver, vm, dev_copy)) < 0)
if (!vmdef)
goto cleanup;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev,
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
goto cleanup;
if ((ret = lxcDomainUpdateDeviceConfig(vmdef, dev)) < 0)
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
+ if (virDomainDefCompatibleDevice(vm->def, dev_copy,
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
goto cleanup;
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
if (!vmdef)
goto cleanup;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev,
+ VIR_DOMAIN_DEVICE_ACTION_DETACH) < 0)
goto cleanup;
if ((ret = lxcDomainDetachDeviceConfig(vmdef, dev)) < 0)
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
+ if (virDomainDefCompatibleDevice(vm->def, dev_copy,
+ VIR_DOMAIN_DEVICE_ACTION_DETACH) < 0)
goto cleanup;
if ((ret = lxcDomainDetachDeviceLive(driver, vm, dev_copy)) < 0)
if (!vmdef)
goto endjob;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev,
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
goto endjob;
if ((ret = qemuDomainAttachDeviceConfig(qemuCaps, vmdef, dev)) < 0)
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
+ if (virDomainDefCompatibleDevice(vm->def, dev_copy,
+ VIR_DOMAIN_DEVICE_ACTION_ATTACH) < 0)
goto endjob;
if ((ret = qemuDomainAttachDeviceLive(vm, dev_copy, dom)) < 0)
if (!vmdef)
goto endjob;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev,
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
goto endjob;
if ((ret = qemuDomainUpdateDeviceConfig(qemuCaps, vmdef, dev)) < 0)
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
+ if (virDomainDefCompatibleDevice(vm->def, dev_copy,
+ VIR_DOMAIN_DEVICE_ACTION_UPDATE) < 0)
goto endjob;
if ((ret = qemuDomainUpdateDeviceLive(dom->conn, vm, dev_copy, dom, force)) < 0)
if (!vmdef)
goto endjob;
- if (virDomainDefCompatibleDevice(vmdef, dev) < 0)
+ if (virDomainDefCompatibleDevice(vmdef, dev,
+ VIR_DOMAIN_DEVICE_ACTION_DETACH) < 0)
goto endjob;
if ((ret = qemuDomainDetachDeviceConfig(vmdef, dev)) < 0)
}
if (flags & VIR_DOMAIN_AFFECT_LIVE) {
- if (virDomainDefCompatibleDevice(vm->def, dev_copy) < 0)
+ if (virDomainDefCompatibleDevice(vm->def, dev_copy,
+ VIR_DOMAIN_DEVICE_ACTION_DETACH) < 0)
goto endjob;
if ((ret = qemuDomainDetachDeviceLive(vm, dev_copy, dom)) < 0)