diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 5d95c5bdb0..b85d3f5a6e 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -16612,6 +16612,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 354b7adfa5..f251f390b7 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3184,6 +3184,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 10c6aeadcd..3246cfbba1 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -386,6 +386,7 @@ virDomainHubTypeFromString; virDomainHubTypeToString; virDomainHypervTypeFromString; virDomainHypervTypeToString; +virDomainInputDefFind; virDomainInputDefFree; virDomainIOMMUModelTypeFromString; virDomainIOMMUModelTypeToString; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 1d1f4af49a..a9724f0098 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: