]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemuProcessRefreshDisks: Properly compare tray status
authorPeter Krempa <pkrempa@redhat.com>
Wed, 19 Apr 2023 13:44:28 +0000 (15:44 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 24 Apr 2023 10:57:56 +0000 (12:57 +0200)
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>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/qemu/qemu_process.c

index 8baa8828756760009c0e8792a412c5bc5a57b491..d8d755af506b8245352f6ca5fd3585e64fc9ea27 100644 (file)
@@ -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;