From 134c3ddb436a32ae0b38aed1ad0bc1ee8a0e3780 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Fri, 1 Jun 2018 16:57:44 +0200 Subject: [PATCH] qemu: command: Refactor disk commandline formatting MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Now that we have one place that sets up all disk-related objects to qemuBlockStorageSourceAttachDataPtr we can easily reuse the data in the command-line formatter by implementing a worker which will convert the data. A huge advantage is that it will be way easier to integrate this with -blockdev later on. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_command.c | 94 ++++++++++++++++------------------------- src/qemu/qemu_command.h | 3 +- src/qemu/qemu_hotplug.c | 3 +- 3 files changed, 40 insertions(+), 60 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 945738a1be..2f5cf4e70e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -761,24 +761,6 @@ qemuBuildTLSx509CommandLine(virCommandPtr cmd, } -/* qemuBuildDiskSrcTLSx509CommandLine: - * - * Returns 0 on success, -1 w/ error on some sort of failure. - */ -static int -qemuBuildDiskSrcTLSx509CommandLine(virCommandPtr cmd, - virStorageSourcePtr src, - virQEMUCapsPtr qemuCaps) -{ - if (src->haveTLS != VIR_TRISTATE_BOOL_YES) - return 0; - - return qemuBuildTLSx509CommandLine(cmd, src->tlsCertdir, - false, true, - NULL, src->tlsAlias, qemuCaps); -} - - static char * qemuBuildNetworkDriveURI(virStorageSourcePtr src, qemuDomainSecretInfoPtr secinfo) @@ -2207,31 +2189,40 @@ qemuBulildFloppyCommandLineOptions(virCommandPtr cmd, static int -qemuBuildDiskUnmanagedPRCommandLine(virCommandPtr cmd, - virStorageSourcePtr src) +qemuBuildObjectCommandline(virCommandPtr cmd, + virJSONValuePtr objProps) { virBuffer buf = VIR_BUFFER_INITIALIZER; - virJSONValuePtr props = NULL; - int ret = -1; - if (!src->pr || - virStoragePRDefIsManaged(src->pr)) + if (!objProps) return 0; - if (!(props = qemuBuildPRManagerInfoProps(src))) + if (virQEMUBuildObjectCommandlineFromJSON(&buf, objProps) < 0) { + virBufferFreeAndReset(&buf); return -1; - - if (virQEMUBuildObjectCommandlineFromJSON(&buf, props) < 0) - goto cleanup; + } virCommandAddArg(cmd, "-object"); virCommandAddArgBuffer(cmd, &buf); - ret = 0; - cleanup: - virBufferFreeAndReset(&buf); - virJSONValueFree(props); - return ret; + return 0; +} + + +static int +qemuBuildBlockStorageSourceAttachDataCommandline(virCommandPtr cmd, + qemuBlockStorageSourceAttachDataPtr data) +{ + if (qemuBuildObjectCommandline(cmd, data->prmgrProps) < 0 || + qemuBuildObjectCommandline(cmd, data->authsecretProps) < 0 || + qemuBuildObjectCommandline(cmd, data->encryptsecretProps) < 0 || + qemuBuildObjectCommandline(cmd, data->tlsProps) < 0) + return -1; + + if (data->driveCmd) + virCommandAddArgList(cmd, "-drive", data->driveCmd, NULL); + + return 0; } @@ -2243,35 +2234,20 @@ qemuBuildDiskCommandLine(virCommandPtr cmd, unsigned int bootindex, bool driveBoot) { + qemuBlockStorageSourceAttachDataPtr data = NULL; char *optstr; - qemuDomainStorageSourcePrivatePtr srcPriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(disk->src); - qemuDomainSecretInfoPtr secinfo = NULL; - qemuDomainSecretInfoPtr encinfo = NULL; - - if (srcPriv) { - secinfo = srcPriv->secinfo; - encinfo = srcPriv->encinfo; - } - - if (qemuBuildDiskUnmanagedPRCommandLine(cmd, disk->src) < 0) - return -1; - - if (qemuBuildDiskSecinfoCommandLine(cmd, secinfo) < 0) - return -1; - - if (qemuBuildDiskSecinfoCommandLine(cmd, encinfo) < 0) - return -1; - if (qemuBuildDiskSrcTLSx509CommandLine(cmd, disk->src, qemuCaps) < 0) + if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, qemuCaps, + driveBoot))) return -1; - virCommandAddArg(cmd, "-drive"); - - if (!(optstr = qemuBuildDriveStr(disk, driveBoot, qemuCaps))) + if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, data, qemuCaps) < 0 || + qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data) < 0) { + qemuBlockStorageSourceAttachDataFree(data); return -1; + } - virCommandAddArg(cmd, optstr); - VIR_FREE(optstr); + qemuBlockStorageSourceAttachDataFree(data); if (qemuDiskBusNeedsDeviceArg(disk->bus)) { if (disk->bus == VIR_DOMAIN_DISK_BUS_FDC) { @@ -10482,20 +10458,22 @@ qemuBuildHotpluggableCPUProps(const virDomainVcpuDef *vcpu) * qemuBuildStorageSourceAttachPrepareDrive: * @disk: disk object to prepare * @qemuCaps: qemu capabilities object + * @driveBoot: bootable flag for disks which don't have -device part * * Prepare qemuBlockStorageSourceAttachDataPtr for use with the old approach * using -drive/drive_add. See qemuBlockStorageSourceAttachPrepareBlockdev. */ qemuBlockStorageSourceAttachDataPtr qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk, - virQEMUCapsPtr qemuCaps) + virQEMUCapsPtr qemuCaps, + bool driveBoot) { qemuBlockStorageSourceAttachDataPtr data = NULL; if (VIR_ALLOC(data) < 0) return NULL; - if (!(data->driveCmd = qemuBuildDriveStr(disk, false, qemuCaps)) || + if (!(data->driveCmd = qemuBuildDriveStr(disk, driveBoot, qemuCaps)) || !(data->driveAlias = qemuAliasDiskDriveFromDisk(disk))) { qemuBlockStorageSourceAttachDataFree(data); return NULL; diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 0d7d2bac2a..aeb13ce18a 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -105,7 +105,8 @@ char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk); qemuBlockStorageSourceAttachDataPtr qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk, - virQEMUCapsPtr qemuCaps); + virQEMUCapsPtr qemuCaps, + bool driveBoot); int qemuBuildStorageSourceAttachPrepareCommon(virStorageSourcePtr src, qemuBlockStorageSourceAttachDataPtr data, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index bad60b701c..8abe02adc6 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -381,7 +381,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver, if (qemuDomainDiskAttachManagedPR(vm, disk, &managedPrmgrProps) < 0) goto error; - if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qemuCaps))) + if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qemuCaps, + false))) goto error; if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, data, priv->qemuCaps) < 0) -- GitLab