summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Krempa <pkrempa@redhat.com>2023-04-19 15:44:28 +0200
committerPeter Krempa <pkrempa@redhat.com>2023-04-24 12:57:56 +0200
commitc8e7ed7f7bdae18a2405ab871c763df5ce583023 (patch)
tree2293e006b6f5ea529465d499809a25f46e0ca748
parent476cc5f48b34d710cf36482cdc66bd7c66b5cdb8 (diff)
downloadlibvirt-c8e7ed7f7bdae18a2405ab871c763df5ce583023.tar.gz
qemuProcessRefreshDisks: Properly compare tray status
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>
-rw-r--r--src/qemu/qemu_process.c28
1 files changed, 15 insertions, 13 deletions
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 8baa882875..d8d755af50 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;