]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: domain: Add VIR_DOMAIN_DISK_TRAY_NONE state for devices without tray
authorPeter Krempa <pkrempa@redhat.com>
Tue, 3 Feb 2026 14:14:14 +0000 (15:14 +0100)
committerPeter Krempa <pkrempa@redhat.com>
Thu, 12 Feb 2026 15:45:34 +0000 (16:45 +0100)
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 <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
src/conf/domain_conf.c
src/conf/domain_conf.h
src/qemu/qemu_hotplug.c
src/qemu/qemu_process.c

index 93b1175d21e4950b614ad07b3aaf79a38d489ce2..ffdd455a0d7dd488ad47b71c6853ae01d57cde6b 100644 (file)
@@ -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, "<target dev='%s' bus='%s'",
                       def->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'",
index a146f075e4363f49ed7c1b85eaad7ef59c6d5886..165a61181d14e6ff571fe7b6498e1119a6139d4d 100644 (file)
@@ -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
index f786248e70d077437bdab0e98893e2f4203d7d44..0d5da456c59e4ac2bb6a4accd4422e5c66a2a26e 100644 (file)
@@ -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)
index d6ff9c96fcb0b9819a3bd3ac124fad4d15b9812c..e627d2121ee642c4cd853d2325487c1b1f8520ff 100644 (file)
@@ -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;