diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index d5def1c816711f113d5032921527d11dba5f369e..d6fe4ca70d00f83d1e89c2c44f9e8b4e3372e127 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -630,6 +630,10 @@ VIR_ENUM_IMPL(virDomainCpuPlacementMode, VIR_DOMAIN_CPU_PLACEMENT_MODE_LAST, "static", "auto"); +VIR_ENUM_IMPL(virDomainDiskTray, VIR_DOMAIN_DISK_TRAY_LAST, + "closed", + "open"); + #define virDomainReportError(code, ...) \ virReportErrorHelper(VIR_FROM_DOMAIN, code, __FILE__, \ __FUNCTION__, __LINE__, __VA_ARGS__) @@ -3313,6 +3317,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, char *authUsage = NULL; char *authUUID = NULL; char *usageType = NULL; + char *tray = NULL; if (VIR_ALLOC(def) < 0) { virReportOOMError(); @@ -3421,6 +3426,7 @@ virDomainDiskDefParseXML(virCapsPtr caps, (xmlStrEqual(cur->name, BAD_CAST "target"))) { target = virXMLPropString(cur, "dev"); bus = virXMLPropString(cur, "bus"); + tray = virXMLPropString(cur, "tray"); /* HACK: Work around for compat with Xen * driver in previous libvirt releases */ @@ -3690,6 +3696,25 @@ virDomainDiskDefParseXML(virCapsPtr caps, } } + if (tray) { + if ((def->tray_status = virDomainDiskTrayTypeFromString(tray)) < 0) { + virDomainReportError(VIR_ERR_XML_ERROR, + _("unknown disk tray status '%s'"), tray); + goto error; + } + + if (def->device != VIR_DOMAIN_DISK_DEVICE_FLOPPY && + def->device != VIR_DOMAIN_DISK_DEVICE_CDROM) { + virDomainReportError(VIR_ERR_XML_ERROR, "%s", + _("tray is only valid for cdrom and floppy")); + goto error; + } + } else { + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY || + def->device == VIR_DOMAIN_DISK_DEVICE_CDROM) + def->tray_status = VIR_DOMAIN_DISK_TRAY_CLOSED; + } + if (def->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY && def->bus != VIR_DOMAIN_DISK_BUS_FDC) { virDomainReportError(VIR_ERR_INTERNAL_ERROR, @@ -10721,8 +10746,15 @@ virDomainDiskDefFormat(virBufferPtr buf, } } - virBufferAsprintf(buf, " \n", + virBufferAsprintf(buf, " 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)) + virBufferAsprintf(buf, " tray='%s'/>\n", + virDomainDiskTrayTypeToString(def->tray_status)); + else + virBufferAddLit(buf, "/>\n"); /*disk I/O throttling*/ if (def->blkdeviotune.total_bytes_sec || diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index f471e355db596eea7c921fbe7b0c101bb06bd6ac..10030a494e0460665700ef0b60b1046186899c2d 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -451,6 +451,13 @@ enum virDomainDiskProtocol { VIR_DOMAIN_DISK_PROTOCOL_LAST }; +enum virDomainDiskTray { + VIR_DOMAIN_DISK_TRAY_CLOSED, + VIR_DOMAIN_DISK_TRAY_OPEN, + + VIR_DOMAIN_DISK_TRAY_LAST +}; + typedef struct _virDomainDiskHostDef virDomainDiskHostDef; typedef virDomainDiskHostDef *virDomainDiskHostDefPtr; struct _virDomainDiskHostDef { @@ -541,6 +548,7 @@ struct _virDomainDiskDef { char *src; virSecurityDeviceLabelDefPtr seclabel; char *dst; + int tray_status; int protocol; int nhosts; virDomainDiskHostDefPtr hosts; @@ -2103,6 +2111,7 @@ VIR_ENUM_DECL(virDomainDiskProtocol) VIR_ENUM_DECL(virDomainDiskIo) VIR_ENUM_DECL(virDomainDiskSecretType) VIR_ENUM_DECL(virDomainDiskSnapshot) +VIR_ENUM_DECL(virDomainDiskTray) VIR_ENUM_DECL(virDomainIoEventFd) VIR_ENUM_DECL(virDomainVirtioEventIdx) VIR_ENUM_DECL(virDomainDiskCopyOnRead)