From: Peter Krempa <[email protected]>

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 <[email protected]>
---
 src/conf/domain_conf.c  | 17 +++++++++++++----
 src/conf/domain_conf.h  |  3 ++-
 src/qemu/qemu_hotplug.c |  6 ++++--
 src/qemu/qemu_process.c |  3 ++-
 4 files changed, 21 insertions(+), 8 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 02e23f7866..fe61284789 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",
 );
@@ -8600,7 +8601,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,
@@ -24247,11 +24248,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'",
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 66dc4e3417..9e3735da73 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -421,7 +421,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;
-- 
2.53.0

Reply via email to