[libvirt] [PATCH 4/7] qemu: process: Fix and improve disk data extraction

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


Extract information for all disks and update tray state and source only
for removable drives. Additionally store whether a drive is removable
and whether it has a tray.
---
 src/qemu/qemu_domain.h  |  4 ++++
 src/qemu/qemu_monitor.c | 18 ------------------
 src/qemu/qemu_monitor.h |  3 ---
 src/qemu/qemu_process.c | 28 +++++++++++++++-------------
 4 files changed, 19 insertions(+), 34 deletions(-)

diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index 825036c..9ac0209 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -299,6 +299,10 @@ struct _qemuDomainDiskPrivate {
     /* for storage devices using auth/secret
      * NB: *not* to be written to qemu domain object XML */
     qemuDomainSecretInfoPtr secinfo;
+
+    /* information about the device */
+    bool tray; /* device has tray */
+    bool removable; /* device media can be removed/changed */
 };

 # define QEMU_DOMAIN_HOSTDEV_PRIVATE(hostdev)	\
diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
index 7d1ca91..a0060cc 100644
--- a/src/qemu/qemu_monitor.c
+++ b/src/qemu/qemu_monitor.c
@@ -1826,24 +1826,6 @@ qemuMonitorGetBlockInfo(qemuMonitorPtr mon)
 }


-struct qemuDomainDiskInfo *
-qemuMonitorBlockInfoLookup(virHashTablePtr blockInfo,
-                           const char *dev)
-{
-    struct qemuDomainDiskInfo *info;
-
-    VIR_DEBUG("blockInfo=%p dev=%s", blockInfo, NULLSTR(dev));
-
-    if (!(info = virHashLookup(blockInfo, dev))) {
-        virReportError(VIR_ERR_INTERNAL_ERROR,
-                       _("cannot find info for device '%s'"),
-                       NULLSTR(dev));
-    }
-
-    return info;
-}
-
-
 /**
  * qemuMonitorGetAllBlockStatsInfo:
  * @mon: monitor object
diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h
index 6359314..a1cbc94 100644
--- a/src/qemu/qemu_monitor.h
+++ b/src/qemu/qemu_monitor.h
@@ -404,9 +404,6 @@ int qemuMonitorSetMemoryStatsPeriod(qemuMonitorPtr mon,

 int qemuMonitorBlockIOStatusToError(const char *status);
 virHashTablePtr qemuMonitorGetBlockInfo(qemuMonitorPtr mon);
-struct qemuDomainDiskInfo *
-qemuMonitorBlockInfoLookup(virHashTablePtr blockInfo,
-                           const char *dev_name);

 typedef struct _qemuBlockStats qemuBlockStats;
 typedef qemuBlockStats *qemuBlockStatsPtr;
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index f2e284f..106ffcd 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6254,25 +6254,27 @@ qemuProcessRefreshDisks(virQEMUDriverPtr driver,

     for (i = 0; i < vm->def->ndisks; i++) {
         virDomainDiskDefPtr disk = vm->def->disks[i];
+        qemuDomainDiskPrivatePtr diskpriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
         struct qemuDomainDiskInfo *info;

-        if (disk->device == VIR_DOMAIN_DISK_DEVICE_DISK ||
-            disk->device == VIR_DOMAIN_DISK_DEVICE_LUN) {
-                 continue;
-        }
-
-        info = qemuMonitorBlockInfoLookup(table, disk->info.alias);
-        if (!info)
-            goto cleanup;
+        if (!(info = virHashLookup(table, disk->info.alias)))
+            continue;

-        if (info->tray_open) {
-            if (virDomainDiskGetSource(disk))
+        if (info->removable) {
+            if (info->empty)
                 ignore_value(virDomainDiskSetSource(disk, NULL));

-            disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN;
-        } else {
-            disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED;
+            if (info->tray) {
+                if (info->tray_open)
+                    disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN;
+                else
+                    disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED;
+            }
         }
+
+        /* fill in additional data */
+        diskpriv->removable = info->removable;
+        diskpriv->tray = info->tray;
     }

     ret = 0;
-- 
2.8.2




More information about the libvir-list mailing list