Since we know we have a modern qemu at hand which can interpret the
dotted syntax, we can format the -drive needed for SD cards via the
common infrastructure we have for all blockdev stuff.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 121 +++++++---------------------------------
1 file changed, 20 insertions(+), 101 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index aec9e7415f..9fc3d91a42 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -1789,44 +1789,6 @@ qemuDiskBusIsSD(int bus)
}
-/**
- * qemuDiskSourceNeedsProps:
- * @src: disk source
- *
- * Returns true, if the disk source needs to be generated from the JSON
- * representation. Otherwise, the disk source should be represented using
- * the legacy representation.
- */
-static bool
-qemuDiskSourceNeedsProps(virStorageSource *src)
-{
- virStorageType actualType = virStorageSourceGetActualType(src);
-
- if (actualType == VIR_STORAGE_TYPE_NETWORK &&
- src->protocol == VIR_STORAGE_NET_PROTOCOL_GLUSTER &&
- src->nhosts > 1)
- return true;
-
- if (actualType == VIR_STORAGE_TYPE_NETWORK &&
- src->protocol == VIR_STORAGE_NET_PROTOCOL_VXHS)
- return true;
-
- if (actualType == VIR_STORAGE_TYPE_NETWORK &&
- src->protocol == VIR_STORAGE_NET_PROTOCOL_ISCSI)
- return true;
-
- if (actualType == VIR_STORAGE_TYPE_NETWORK &&
- src->protocol == VIR_STORAGE_NET_PROTOCOL_NBD &&
- src->haveTLS == VIR_TRISTATE_BOOL_YES)
- return true;
-
- if (actualType == VIR_STORAGE_TYPE_NVME)
- return true;
-
- return false;
-}
-
-
/**
* qemuDiskSourceGetProps:
* @src: disk source struct
@@ -1851,73 +1813,24 @@ qemuDiskSourceGetProps(virStorageSource *src)
}
-static int
-qemuBuildDriveSourcePR(virBuffer *buf,
- virDomainDiskDef *disk)
-{
- g_autofree char *alias = NULL;
- const char *defaultAlias = NULL;
-
- if (!disk->src->pr)
- return 0;
-
- if (virStoragePRDefIsManaged(disk->src->pr))
- defaultAlias = qemuDomainGetManagedPRAlias();
- else if (!(alias = qemuDomainGetUnmanagedPRAlias(disk->info.alias)))
- return -1;
-
-
- virBufferAsprintf(buf, ",file.pr-manager=%s", alias ? alias :
defaultAlias);
- return 0;
-}
-
-
static int
qemuBuildDriveSourceStr(virDomainDiskDef *disk,
virBuffer *buf)
{
virStorageType actualType = virStorageSourceGetActualType(disk->src);
qemuDomainStorageSourcePrivate *srcpriv =
QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(disk->src);
- qemuDomainSecretInfo *secinfo = NULL;
qemuDomainSecretInfo *encinfo = NULL;
g_autoptr(virJSONValue) srcprops = NULL;
- g_autofree char *source = NULL;
bool rawluks = false;
- if (srcpriv) {
- secinfo = srcpriv->secinfo;
+ if (srcpriv)
encinfo = srcpriv->encinfo;
- }
-
- if (qemuDiskSourceNeedsProps(disk->src) &&
- !(srcprops = qemuDiskSourceGetProps(disk->src)))
- return -1;
-
- if (!srcprops &&
- qemuGetDriveSourceString(disk->src, secinfo, &source) < 0)
- return -1;
-
- /* nothing to format if the drive is empty */
- if (!(source || srcprops) ||
- ((disk->device == VIR_DOMAIN_DISK_DEVICE_FLOPPY ||
- disk->device == VIR_DOMAIN_DISK_DEVICE_CDROM) &&
- disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN)) {
- return 0;
- }
- if (actualType == VIR_STORAGE_TYPE_BLOCK &&
- disk->tray_status == VIR_DOMAIN_DISK_TRAY_OPEN) {
- virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- disk->src->type == VIR_STORAGE_TYPE_VOLUME ?
- _("tray status 'open' is invalid for block type
volume") :
- _("tray status 'open' is invalid for block type
disk"));
- return -1;
- }
-
- if (source) {
+ switch (actualType) {
+ case VIR_STORAGE_TYPE_BLOCK:
+ case VIR_STORAGE_TYPE_FILE:
+ case VIR_STORAGE_TYPE_DIR:
virBufferAddLit(buf, "file=");
-
- /* for now the DIR based storage is handled by the magic FAT format */
if (actualType == VIR_STORAGE_TYPE_DIR) {
virBufferAddLit(buf, "fat:");
@@ -1925,21 +1838,27 @@ qemuBuildDriveSourceStr(virDomainDiskDef *disk,
virBufferAddLit(buf, "floppy:");
}
- virQEMUBuildBufferEscapeComma(buf, source);
-
- if (secinfo)
- virBufferAsprintf(buf, ",file.password-secret=%s",
secinfo->alias);
-
- if (disk->src->debug)
- virBufferAsprintf(buf, ",file.debug=%d",
disk->src->debugLevel);
+ virQEMUBuildBufferEscapeComma(buf, disk->src->path);
+ break;
- if (qemuBuildDriveSourcePR(buf, disk) < 0)
+ case VIR_STORAGE_TYPE_NETWORK:
+ if (!(srcprops = qemuDiskSourceGetProps(disk->src)))
return -1;
- } else {
+
if (virQEMUBuildCommandLineJSON(srcprops, buf, NULL,
virQEMUBuildCommandLineJSONArrayNumbered) <
0)
return -1;
+ break;
+
+ case VIR_STORAGE_TYPE_VOLUME:
+ case VIR_STORAGE_TYPE_NVME:
+ case VIR_STORAGE_TYPE_VHOST_USER:
+ case VIR_STORAGE_TYPE_NONE:
+ case VIR_STORAGE_TYPE_LAST:
+ break;
}
+
+
virBufferAddLit(buf, ",");
if (encinfo) {
--
2.36.1