[libvirt] [PATCH 2/2] qemu: block: Use correct alias when extracting disk node names

Peter Krempa pkrempa at redhat.com
Mon Sep 25 09:53:07 UTC 2017


For some arcane reason we don't use the alias from disk->info.alias
directly but prepend drive in front of it. This messed up the disk node
name extraction code as qemu reports the full alias. This was broken in
the node name detector refactoring done in commit 0175dc6ea024d

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1494327
---
 src/qemu/qemu_block.c | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/qemu/qemu_block.c b/src/qemu/qemu_block.c
index a3da80f88..6faecb0ae 100644
--- a/src/qemu/qemu_block.c
+++ b/src/qemu/qemu_block.c
@@ -20,6 +20,7 @@

 #include "qemu_block.h"
 #include "qemu_domain.h"
+#include "qemu_alias.h"

 #include "viralloc.h"
 #include "virstring.h"
@@ -271,36 +272,46 @@ qemuBlockDiskDetectNodes(virDomainDiskDefPtr disk,
 {
     qemuBlockNodeNameBackingChainDataPtr entry = NULL;
     virStorageSourcePtr src = disk->src;
+    char *alias = NULL;
+    int ret = -1;

     /* don't attempt the detection if the top level already has node names */
     if (src->nodeformat || src->nodestorage)
         return 0;

-    if (!(entry = virHashLookup(disktable, disk->info.alias)))
-        return 0;
+    if (!(alias = qemuAliasFromDisk(disk)))
+        goto cleanup;
+
+    if (!(entry = virHashLookup(disktable, alias))) {
+        ret = 0;
+        goto cleanup;
+    }

     while (src && entry) {
         if (src->nodeformat || src->nodestorage) {
             if (STRNEQ_NULLABLE(src->nodeformat, entry->nodeformat) ||
                 STRNEQ_NULLABLE(src->nodestorage, entry->nodestorage))
-                goto error;
+                goto cleanup;

             break;
         } else {
             if (VIR_STRDUP(src->nodeformat, entry->nodeformat) < 0 ||
                 VIR_STRDUP(src->nodestorage, entry->nodestorage) < 0)
-                goto error;
+                goto cleanup;
         }

         entry = entry->backing;
         src = src->backingStore;
     }

-    return 0;
+    ret = 0;

- error:
-    qemuBlockDiskClearDetectedNodes(disk);
-    return -1;
+ cleanup:
+    VIR_FREE(alias);
+    if (ret < 0)
+        qemuBlockDiskClearDetectedNodes(disk);
+
+    return ret;
 }


-- 
2.14.1




More information about the libvir-list mailing list