From 82d499c6c0903c29a3dc473b547eb75630e76a23 Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 4 Oct 2021 14:53:33 +0200 Subject: [PATCH] qemuBuildHostdevSCSICommandLine: Generate via JSON MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since 'qemuBuildDeviceAddressProps' now also builds 'drive' addresses the generator is way simpler and doesn't use any special fields. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/qemu/qemu_command.c | 56 ++++++++++++++++------------------------- src/qemu/qemu_command.h | 7 +++--- src/qemu/qemu_hotplug.c | 6 ++--- 3 files changed, 28 insertions(+), 41 deletions(-) diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 22d9844945..9e40a6b70a 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -5079,44 +5079,29 @@ qemuBuildSCSIHostdevDrvStr(virDomainHostdevDef *dev) return virBufferContentAndReset(&buf); } -char * -qemuBuildSCSIHostdevDevStr(const virDomainDef *def, - virDomainHostdevDef *dev, - const char *backendAlias) +virJSONValue * +qemuBuildSCSIHostdevDevProps(const virDomainDef *def, + virDomainHostdevDef *dev, + const char *backendAlias) { - g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; - int model = -1; - const char *contAlias; + g_autoptr(virJSONValue) props = NULL; - model = qemuDomainFindSCSIControllerModel(def, dev->info); - if (model < 0) + if (virJSONValueObjectCreate(&props, + "s:driver", "scsi-generic", + NULL) < 0) return NULL; - virBufferAddLit(&buf, "scsi-generic"); - - if (!(contAlias = virDomainControllerAliasFind(def, VIR_DOMAIN_CONTROLLER_TYPE_SCSI, - dev->info->addr.drive.controller))) + if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0) return NULL; - if (model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) { - virBufferAsprintf(&buf, ",bus=%s.%d,scsi-id=%d", - contAlias, - dev->info->addr.drive.bus, - dev->info->addr.drive.unit); - } else { - virBufferAsprintf(&buf, ",bus=%s.0,channel=%d,scsi-id=%d,lun=%d", - contAlias, - dev->info->addr.drive.bus, - dev->info->addr.drive.target, - dev->info->addr.drive.unit); - } + if (virJSONValueObjectAdd(props, + "s:drive", backendAlias, + "s:id", dev->info->alias, + "p:bootindex", dev->info->bootIndex, + NULL) < 0) + return NULL; - virBufferAsprintf(&buf, ",drive=%s,id=%s", backendAlias, dev->info->alias); - - if (dev->info->bootIndex) - virBufferAsprintf(&buf, ",bootindex=%u", dev->info->bootIndex); - - return virBufferContentAndReset(&buf); + return g_steal_pointer(&props); } static int @@ -5604,7 +5589,7 @@ qemuBuildHostdevSCSICommandLine(virCommand *cmd, virQEMUCaps *qemuCaps) { g_autoptr(qemuBlockStorageSourceAttachData) data = NULL; - g_autofree char *devstr = NULL; + g_autoptr(virJSONValue) devprops = NULL; const char *backendAlias = NULL; if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendAlias, qemuCaps))) @@ -5613,10 +5598,11 @@ qemuBuildHostdevSCSICommandLine(virCommand *cmd, if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data, qemuCaps) < 0) return -1; - virCommandAddArg(cmd, "-device"); - if (!(devstr = qemuBuildSCSIHostdevDevStr(def, hostdev, backendAlias))) + if (!(devprops = qemuBuildSCSIHostdevDevProps(def, hostdev, backendAlias))) + return -1; + + if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0) return -1; - virCommandAddArg(cmd, devstr); return 0; } diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h index 8ad87f4277..5b1b727b84 100644 --- a/src/qemu/qemu_command.h +++ b/src/qemu/qemu_command.h @@ -182,9 +182,10 @@ qemuBuildUSBHostdevDevProps(const virDomainDef *def, virDomainHostdevDef *dev, virQEMUCaps *qemuCaps); -char *qemuBuildSCSIHostdevDevStr(const virDomainDef *def, - virDomainHostdevDef *dev, - const char *backendAlias); +virJSONValue * +qemuBuildSCSIHostdevDevProps(const virDomainDef *def, + virDomainHostdevDef *dev, + const char *backendAlias); qemuBlockStorageSourceAttachData * qemuBuildHostdevSCSIAttachPrepare(virDomainHostdevDef *hostdev, diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index 67aed2c128..28cafd11d2 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -2639,7 +2639,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriver *driver, virErrorPtr orig_err; g_autoptr(qemuBlockStorageSourceAttachData) data = NULL; const char *backendalias = NULL; - g_autofree char *devstr = NULL; + g_autoptr(virJSONValue) devprops = NULL; bool teardowncgroup = false; bool teardownlabel = false; bool teardowndevice = false; @@ -2683,7 +2683,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriver *driver, priv->qemuCaps))) goto cleanup; - if (!(devstr = qemuBuildSCSIHostdevDevStr(vm->def, hostdev, backendalias))) + if (!(devprops = qemuBuildSCSIHostdevDevProps(vm->def, hostdev, backendalias))) goto cleanup; VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1); @@ -2693,7 +2693,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriver *driver, if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0) goto exit_monitor; - if (qemuMonitorAddDevice(priv->mon, devstr) < 0) + if (qemuMonitorAddDeviceProps(priv->mon, &devprops) < 0) goto exit_monitor; if (qemuDomainObjExitMonitor(driver, vm) < 0)