https://bugzilla.redhat.com/show_bug.cgi?id=1379603
---
src/conf/domain_conf.c | 37 +++++++++++++++++++++++++++++++++++++
src/conf/domain_conf.h | 3 +++
src/libvirt_private.syms | 1 +
src/qemu/qemu_driver.c | 8 ++++++++
4 files changed, 49 insertions(+)
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 516f9fa06..495d85f90 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -16556,6 +16556,43 @@ virDomainShmemDefRemove(virDomainDefPtr def,
}
+static bool
+virDomainInputDefEquals(const virDomainInputDef *a,
+ const virDomainInputDef *b)
+{
+ if (a->type != b->type)
+ return false;
+
+ if (a->bus != b->bus)
+ return false;
+
+ if (a->type == VIR_DOMAIN_INPUT_TYPE_PASSTHROUGH &&
+ STRNEQ_NULLABLE(a->source.evdev, b->source.evdev))
+ return false;
+
+ if (a->info.type != VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE &&
+ !virDomainDeviceInfoAddressIsEqual(&a->info, &b->info))
+ return false;
+
+ return true;
+}
+
+
+ssize_t
+virDomainInputDefFind(const virDomainDef *def,
+ const virDomainInputDef *input)
+{
+ size_t i;
+
+ for (i = 0; i < def->ninputs; i++) {
+ if (virDomainInputDefEquals(input, def->inputs[i]))
+ return i;
+ }
+
+ return -1;
+}
+
+
char *
virDomainDefGetDefaultEmulator(virDomainDefPtr def,
virCapsPtr caps)
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index a42efcfa6..c210bd418 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3204,6 +3204,9 @@ ssize_t virDomainShmemDefFind(virDomainDefPtr def,
virDomainShmemDefPtr shmem)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
virDomainShmemDefPtr virDomainShmemDefRemove(virDomainDefPtr def, size_t idx)
ATTRIBUTE_NONNULL(1);
+ssize_t virDomainInputDefFind(const virDomainDef *def,
+ const virDomainInputDef *input)
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) ATTRIBUTE_RETURN_CHECK;
VIR_ENUM_DECL(virDomainTaint)
VIR_ENUM_DECL(virDomainVirt)
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index 7bd21ae23..7713ecc01 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -385,6 +385,7 @@ virDomainHubTypeFromString;
virDomainHubTypeToString;
virDomainHypervTypeFromString;
virDomainHypervTypeToString;
+virDomainInputDefFind;
virDomainInputDefFree;
virDomainIOMMUModelTypeFromString;
virDomainIOMMUModelTypeToString;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 050a41524..092df673c 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -8239,6 +8239,14 @@ qemuDomainDetachDeviceConfig(virDomainDefPtr vmdef,
break;
case VIR_DOMAIN_DEVICE_INPUT:
+ if ((idx = virDomainInputDefFind(vmdef, dev->data.input)) < 0) {
+ virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+ _("matching input device not found"));
+ return -1;
+ }
+ VIR_DELETE_ELEMENT(vmdef->inputs, idx, vmdef->ninputs);
+ break;
+
case VIR_DOMAIN_DEVICE_SOUND:
case VIR_DOMAIN_DEVICE_VIDEO:
case VIR_DOMAIN_DEVICE_GRAPHICS:
--
2.13.0