VIR_ENUM_IMPL(virDomainDiskTray,
VIR_DOMAIN_DISK_TRAY_LAST,
+ "",
"closed",
"open",
);
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,
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'",
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
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);
&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)
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;