From: Peter Krempa Date: Tue, 3 Feb 2026 14:14:14 +0000 (+0100) Subject: conf: domain: Add VIR_DOMAIN_DISK_TRAY_NONE state for devices without tray X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=8ae3835079314e24c4ba97bfd1414eb3f0959456;p=thirdparty%2Flibvirt.git conf: domain: Add VIR_DOMAIN_DISK_TRAY_NONE state for devices without tray Currently the default state was VIR_DOMAIN_DISK_TRAY_CLOSED. Not all disks have a tray so add another state as the default and adjust code which was based on the assumption that the tray is always present. This change also removes the need for the 'tray' field in the disk private data which was used inconsistently. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 93b1175d21..ffdd455a0d 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -1286,6 +1286,7 @@ VIR_ENUM_IMPL(virDomainCpuPlacementMode, VIR_ENUM_IMPL(virDomainDiskTray, VIR_DOMAIN_DISK_TRAY_LAST, + "", "closed", "open", ); @@ -8651,7 +8652,7 @@ virDomainDiskDefParseXML(virDomainXMLOption *xmlopt, return NULL; if (virXMLPropEnum(targetNode, "tray", virDomainDiskTrayTypeFromString, - VIR_XML_PROP_NONE, &def->tray_status) < 0) + VIR_XML_PROP_NONZERO, &def->tray_status) < 0) return NULL; if (virXMLPropTristateSwitch(targetNode, "removable", VIR_XML_PROP_NONE, @@ -24378,11 +24379,19 @@ virDomainDiskDefFormat(virBuffer *buf, virBufferAsprintf(&childBuf, "dst, bus); - if ((def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || - def->device == VIR_DOMAIN_DISK_DEVICE_CDROM) && - def->tray_status != VIR_DOMAIN_DISK_TRAY_CLOSED) + + switch (def->tray_status) { + case VIR_DOMAIN_DISK_TRAY_NONE: + case VIR_DOMAIN_DISK_TRAY_CLOSED: + case VIR_DOMAIN_DISK_TRAY_LAST: + break; + + case VIR_DOMAIN_DISK_TRAY_OPEN: virBufferAsprintf(&childBuf, " tray='%s'", virDomainDiskTrayTypeToString(def->tray_status)); + break; + } + if (def->bus == VIR_DOMAIN_DISK_BUS_USB && def->removable != VIR_TRISTATE_SWITCH_ABSENT) { virBufferAsprintf(&childBuf, " removable='%s'", diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index a146f075e4..165a61181d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -422,7 +422,8 @@ typedef enum { typedef enum { - VIR_DOMAIN_DISK_TRAY_CLOSED = 0, + VIR_DOMAIN_DISK_TRAY_NONE = 0, + VIR_DOMAIN_DISK_TRAY_CLOSED, VIR_DOMAIN_DISK_TRAY_OPEN, VIR_DOMAIN_DISK_TRAY_LAST diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index f786248e70..0d5da456c5 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -539,7 +539,7 @@ qemuDomainChangeMediaBlockdev(virDomainObj *vm, return -1; } - if (diskPriv->tray && disk->tray_status != VIR_DOMAIN_DISK_TRAY_OPEN) { + if (disk->tray_status == VIR_DOMAIN_DISK_TRAY_CLOSED) { qemuDomainObjEnterMonitor(vm); rc = qemuMonitorBlockdevTrayOpen(priv->mon, diskPriv->qomName, force); qemuDomainObjExitMonitor(vm); @@ -575,7 +575,9 @@ qemuDomainChangeMediaBlockdev(virDomainObj *vm, &disk->blkdeviotune); } - if (rc == 0) + /* Close any device with a tray since we've opened it before (regardless + * of the current state if it e.g. wasn't updated) */ + if (rc == 0 && disk->tray_status != VIR_DOMAIN_DISK_TRAY_NONE) rc = qemuMonitorBlockdevTrayClose(priv->mon, diskPriv->qomName); if (rc < 0 && newbackend) diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c index d6ff9c96fc..e627d2121e 100644 --- a/src/qemu/qemu_process.c +++ b/src/qemu/qemu_process.c @@ -8671,7 +8671,8 @@ qemuProcessRefreshDisks(virDomainObj *vm, qemuProcessRefreshDiskProps(disk, info); - if (diskpriv->tray && + if (old_tray_status != VIR_DOMAIN_DISK_TRAY_NONE && + disk->tray_status != VIR_DOMAIN_DISK_TRAY_NONE && old_tray_status != disk->tray_status) { virDomainEventTrayChangeReason reason = VIR_DOMAIN_EVENT_TRAY_CHANGE_OPEN; virObjectEvent *event;