[libvirt] [PATCH 2/7] qemu: Extract more information about qemu drives

Peter Krempa pkrempa at redhat.com
Tue May 24 13:17:25 UTC 2016


Extract whether a given drive has a tray and whether there is no image
inserted.

Negative logic for the image insertion is chosen so that the flag is set
only if we are certain of the fact.
---
 src/qemu/qemu_domain.h       |  2 ++
 src/qemu/qemu_monitor_json.c | 12 +++++++-----
 tests/qemumonitorjsontest.c  | 23 +++++++++++++++++++++++
 3 files changed, 32 insertions(+), 5 deletions(-)

diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index e29df07..825036c 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -307,7 +307,9 @@ struct _qemuDomainDiskPrivate {
 struct qemuDomainDiskInfo {
     bool removable;
     bool locked;
+    bool tray;
     bool tray_open;
+    bool empty;
     int io_status;
 };

diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c
index 64a8765..0508fe6 100644
--- a/src/qemu/qemu_monitor_json.c
+++ b/src/qemu/qemu_monitor_json.c
@@ -1832,11 +1832,13 @@ int qemuMonitorJSONGetBlockInfo(qemuMonitorPtr mon,
             goto cleanup;
         }

-        /* Don't check for success here, because 'tray_open' is presented iff
-         * medium is ejected.
-         */
-        ignore_value(virJSONValueObjectGetBoolean(dev, "tray_open",
-                                                  &info->tray_open));
+        /* 'tray_open' is present only if the device has a tray */
+        if (virJSONValueObjectGetBoolean(dev, "tray_open", &info->tray_open) == 0)
+            info->tray = true;
+
+        /* presence of 'inserted' notifies that a medium is in the device */
+        if (!virJSONValueObjectGetObject(dev, "inserted"))
+            info->empty = true;

         /* Missing io-status indicates no error */
         if ((status = virJSONValueObjectGetString(dev, "io-status"))) {
diff --git a/tests/qemumonitorjsontest.c b/tests/qemumonitorjsontest.c
index 229ccac..87b1a8f 100644
--- a/tests/qemumonitorjsontest.c
+++ b/tests/qemumonitorjsontest.c
@@ -114,6 +114,14 @@ const char *queryBlockReply =
 "            },"
 "            \"tray_open\": false,"
 "            \"type\": \"unknown\""
+"        },"
+"        {"
+"            \"io-status\": \"ok\","
+"            \"device\": \"drive-ide0-1-1\","
+"            \"locked\": false,"
+"            \"removable\": true,"
+"            \"tray_open\": false,"
+"            \"type\": \"unknown\""
 "        }"
 "    ],"
 "    \"id\": \"libvirt-10\""
@@ -1404,12 +1412,27 @@ testQemuMonitorJSONqemuMonitorJSONGetBlockInfo(const void *data)

     info->locked = true;
     info->removable = true;
+    info->tray = true;
+
     if (virHashAddEntry(expectedBlockDevices, "ide0-1-0", info) < 0) {
         virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
                        "Unable to create expectedBlockDevices hash table");
         goto cleanup;
     }

+    if (VIR_ALLOC(info) < 0)
+        goto cleanup;
+
+    info->removable = true;
+    info->tray = true;
+    info->empty = true;
+
+    if (virHashAddEntry(expectedBlockDevices, "ide0-1-1", info) < 0) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       "Unable to create expectedBlockDevices hash table");
+        goto cleanup;
+    }
+
     if (qemuMonitorTestAddItem(test, "query-block", queryBlockReply) < 0)
         goto cleanup;

-- 
2.8.2




More information about the libvir-list mailing list