From: Peter Krempa Date: Wed, 6 Apr 2016 15:32:12 +0000 (+0200) Subject: qemu: alias: Fix calculation of RNG device aliases X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=bd19b4b25beb22335571b80d6a4a32f7012b87e1;p=libvirt.git qemu: alias: Fix calculation of RNG device aliases For device hotplug, the new alias ID needs to be checked in the list rather than using the count of devices. Unplugging a device that is not last in the array will make further hotplug impossible due to alias collision. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1324551 --- diff --git a/src/qemu/qemu_alias.c b/src/qemu/qemu_alias.c index 6afd77758b..330a391de4 100644 --- a/src/qemu/qemu_alias.c +++ b/src/qemu/qemu_alias.c @@ -382,10 +382,19 @@ qemuAssignDeviceRedirdevAlias(virDomainDefPtr def, int -qemuAssignDeviceRNGAlias(virDomainRNGDefPtr rng, - size_t idx) +qemuAssignDeviceRNGAlias(virDomainDefPtr def, + virDomainRNGDefPtr rng) { - if (virAsprintf(&rng->info.alias, "rng%zu", idx) < 0) + size_t i; + int maxidx = 0; + int idx; + + for (i = 0; i < def->nrngs; i++) { + if ((idx = qemuDomainDeviceAliasIndex(&def->rngs[i]->info, "rng")) >= maxidx) + maxidx = idx + 1; + } + + if (virAsprintf(&rng->info.alias, "rng%d", maxidx) < 0) return -1; return 0; @@ -480,7 +489,7 @@ qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps) return -1; } for (i = 0; i < def->nrngs; i++) { - if (qemuAssignDeviceRNGAlias(def->rngs[i], i) < 0) + if (virAsprintf(&def->rngs[i]->info.alias, "rng%zu", i) < 0) return -1; } if (def->tpm) { diff --git a/src/qemu/qemu_alias.h b/src/qemu/qemu_alias.h index 0861acd2d3..f09466d77e 100644 --- a/src/qemu/qemu_alias.h +++ b/src/qemu/qemu_alias.h @@ -54,8 +54,8 @@ int qemuAssignDeviceRedirdevAlias(virDomainDefPtr def, virDomainRedirdevDefPtr redirdev, int idx); -int qemuAssignDeviceRNGAlias(virDomainRNGDefPtr rng, - size_t idx); +int qemuAssignDeviceRNGAlias(virDomainDefPtr def, + virDomainRNGDefPtr rng); int qemuAssignDeviceAliases(virDomainDefPtr def, virQEMUCapsPtr qemuCaps); diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 9fdf66a840..b9a8b51594 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -1625,7 +1625,7 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver, const char *type; int ret = -1; - if (qemuAssignDeviceRNGAlias(rng, vm->def->nrngs) < 0) + if (qemuAssignDeviceRNGAlias(vm->def, rng) < 0) return -1; /* preallocate space for the device definition */