[PATCH 1/3] qemuProcessRefreshDisks: Properly compare tray status

Peter Krempa posted 3 patches 1 year, 7 months ago
[PATCH 1/3] qemuProcessRefreshDisks: Properly compare tray status
Posted by Peter Krempa 1 year, 7 months ago
The code compares the 'tray_open' boolean from 'struct
qemuDomainDiskInfo' directly against 'disk->tray_status' which is
declared as virDomainDiskTray (enum). Now the logic works correctly
because the _OPEN enum has value '1'.

Separate the event emission code from the update code and remember the
old tray state in a separate variable rather than having the sneaky
logic we have today.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
---
 src/qemu/qemu_process.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index b9e9a7d320..0dc49b87d8 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -8695,6 +8695,7 @@ qemuProcessRefreshDisks(virDomainObj *vm,
         qemuDomainDiskPrivate *diskpriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
         struct qemuDomainDiskInfo *info;
         const char *entryname = disk->info.alias;
+        virDomainDiskTray old_tray_status = disk->tray_status;

         if (diskpriv->qomName)
             entryname = diskpriv->qomName;
@@ -8703,31 +8704,32 @@ qemuProcessRefreshDisks(virDomainObj *vm,
             continue;

         if (info->removable) {
-            bool emitEvent = info->tray_open != disk->tray_status;
-            int reason;
-
             if (info->empty)
                 virDomainDiskEmptySource(disk);

             if (info->tray) {
-                if (info->tray_open) {
-                    reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN;
+                if (info->tray_open)
                     disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN;
-                } else {
-                    reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_CLOSE;
+                else
                     disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED;
-                }
-
-                if (emitEvent) {
-                    virObjectEvent *event = virDomainEventTrayChangeNewFromObj(vm, disk->info.alias, reason);
-                    virObjectEventStateQueue(driver->domainEventState, event);
-                }
             }
         }

         /* fill in additional data */
         diskpriv->removable = info->removable;
         diskpriv->tray = info->tray;
+
+        if (diskpriv->tray &&
+            old_tray_status != disk->tray_status) {
+            virDomainEventTrayChangeReason reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN;
+            virObjectEvent *event;
+
+            if (disk->tray_status == VIR_DOMAIN_DISK_TRAY_CLOSED)
+                reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_CLOSE;
+
+            event = virDomainEventTrayChangeNewFromObj(vm, disk->info.alias, reason);
+            virObjectEventStateQueue(driver->domainEventState, event);
+        }
     }

     return 0;
-- 
2.39.2