[PATCH 13/20] conf: domain: Add VIR_DOMAIN_DISK_TRAY_NONE state for devices without tray

Peter Krempa via Devel posted 20 patches 3 days, 14 hours ago
[PATCH 13/20] conf: domain: Add VIR_DOMAIN_DISK_TRAY_NONE state for devices without tray
Posted by Peter Krempa via Devel 3 days, 14 hours ago
From: Peter Krempa <pkrempa@redhat.com>

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>
---
 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