]> xenbits.xensource.com Git - libvirt.git/commitdiff
qemu: alias: Fix calculation of RNG device aliases
authorPeter Krempa <pkrempa@redhat.com>
Wed, 6 Apr 2016 15:32:12 +0000 (17:32 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 7 Apr 2016 07:51:29 +0000 (09:51 +0200)
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

src/qemu/qemu_alias.c
src/qemu/qemu_alias.h
src/qemu/qemu_hotplug.c

index 6afd77758b269347559836c0efac3317d9c1dce8..330a391de4151bd2d8a8e738fc3421d4a25e3c8f 100644 (file)
@@ -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) {
index 0861acd2d337fde810b8715b71110420cd625841..f09466d77ebf891d1f09925261b2488522c1df40 100644 (file)
@@ -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);
 
index 9fdf66a84019434c003cc75526b81bbcca3282f9..b9a8b51594633f0b29a2df55e06dd410774d7198 100644 (file)
@@ -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 */