]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu_process: add tray changed event to queue in refresh disks
authorKristina Hanicova <khanicov@redhat.com>
Tue, 13 Dec 2022 12:40:26 +0000 (13:40 +0100)
committerMichal Privoznik <mprivozn@redhat.com>
Tue, 13 Dec 2022 17:01:41 +0000 (18:01 +0100)
There are some cases when the internal state of disks can change
without qemu sending events about it (e.g. a disk can close
during reset). In case this happens, we should emit an event
about the modified disk.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1824722#c20

Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
Signed-off-by: Michal Privoznik <mprivozn@redhat.com>
Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
src/qemu/qemu_process.c

index 5de55435d28767a4b95815b60ef574d5e9b035b4..b6adcf2f2a348cc428187d302c1f0a3f8cf06bd8 100644 (file)
@@ -8673,6 +8673,7 @@ qemuProcessRefreshDisks(virDomainObj *vm,
                         virDomainAsyncJob asyncJob)
 {
     qemuDomainObjPrivate *priv = vm->privateData;
+    virQEMUDriver *driver = priv->driver;
     g_autoptr(GHashTable) table = NULL;
     size_t i;
 
@@ -8697,14 +8698,26 @@ qemuProcessRefreshDisks(virDomainObj *vm,
             continue;
 
         if (info->removable) {
+            virObjectEvent *event = NULL;
+            int reason;
+
             if (info->empty)
                 virDomainDiskEmptySource(disk);
 
             if (info->tray) {
-                if (info->tray_open)
+                if (info->tray_open == disk->tray_status)
+                    continue;
+
+                if (info->tray_open) {
+                    reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN;
                     disk->tray_status = VIR_DOMAIN_DISK_TRAY_OPEN;
-                else
+                } else {
+                    reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_CLOSE;
                     disk->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED;
+                }
+
+                event = virDomainEventTrayChangeNewFromObj(vm, disk->info.alias, reason);
+                virObjectEventStateQueue(driver->domainEventState, event);
             }
         }