qemuBuildHostdevSCSICommandLine: Generate via JSON

Since 'qemuBuildDeviceAddressProps' now also builds 'drive' addresses
the generator is way simpler and doesn't use any special fields.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2021-10-04 14:53:33 +02:00
parent 03ed14d2d4
commit 82d499c6c0
3 changed files with 28 additions and 41 deletions

View File

@ -5079,44 +5079,29 @@ qemuBuildSCSIHostdevDrvStr(virDomainHostdevDef *dev)
return virBufferContentAndReset(&buf); return virBufferContentAndReset(&buf);
} }
char * virJSONValue *
qemuBuildSCSIHostdevDevStr(const virDomainDef *def, qemuBuildSCSIHostdevDevProps(const virDomainDef *def,
virDomainHostdevDef *dev, virDomainHostdevDef *dev,
const char *backendAlias) const char *backendAlias)
{ {
g_auto(virBuffer) buf = VIR_BUFFER_INITIALIZER; g_autoptr(virJSONValue) props = NULL;
int model = -1;
const char *contAlias;
model = qemuDomainFindSCSIControllerModel(def, dev->info); if (virJSONValueObjectCreate(&props,
if (model < 0) "s:driver", "scsi-generic",
NULL) < 0)
return NULL; return NULL;
virBufferAddLit(&buf, "scsi-generic"); if (qemuBuildDeviceAddressProps(props, def, dev->info) < 0)
if (!(contAlias = virDomainControllerAliasFind(def, VIR_DOMAIN_CONTROLLER_TYPE_SCSI,
dev->info->addr.drive.controller)))
return NULL; return NULL;
if (model == VIR_DOMAIN_CONTROLLER_MODEL_SCSI_LSILOGIC) { if (virJSONValueObjectAdd(props,
virBufferAsprintf(&buf, ",bus=%s.%d,scsi-id=%d", "s:drive", backendAlias,
contAlias, "s:id", dev->info->alias,
dev->info->addr.drive.bus, "p:bootindex", dev->info->bootIndex,
dev->info->addr.drive.unit); NULL) < 0)
} else { return NULL;
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);
}
virBufferAsprintf(&buf, ",drive=%s,id=%s", backendAlias, dev->info->alias); return g_steal_pointer(&props);
if (dev->info->bootIndex)
virBufferAsprintf(&buf, ",bootindex=%u", dev->info->bootIndex);
return virBufferContentAndReset(&buf);
} }
static int static int
@ -5604,7 +5589,7 @@ qemuBuildHostdevSCSICommandLine(virCommand *cmd,
virQEMUCaps *qemuCaps) virQEMUCaps *qemuCaps)
{ {
g_autoptr(qemuBlockStorageSourceAttachData) data = NULL; g_autoptr(qemuBlockStorageSourceAttachData) data = NULL;
g_autofree char *devstr = NULL; g_autoptr(virJSONValue) devprops = NULL;
const char *backendAlias = NULL; const char *backendAlias = NULL;
if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendAlias, qemuCaps))) if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendAlias, qemuCaps)))
@ -5613,10 +5598,11 @@ qemuBuildHostdevSCSICommandLine(virCommand *cmd,
if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data, qemuCaps) < 0) if (qemuBuildBlockStorageSourceAttachDataCommandline(cmd, data, qemuCaps) < 0)
return -1; return -1;
virCommandAddArg(cmd, "-device"); if (!(devprops = qemuBuildSCSIHostdevDevProps(def, hostdev, backendAlias)))
if (!(devstr = qemuBuildSCSIHostdevDevStr(def, hostdev, backendAlias))) return -1;
if (qemuBuildDeviceCommandlineFromJSON(cmd, devprops, qemuCaps) < 0)
return -1; return -1;
virCommandAddArg(cmd, devstr);
return 0; return 0;
} }

View File

@ -182,9 +182,10 @@ qemuBuildUSBHostdevDevProps(const virDomainDef *def,
virDomainHostdevDef *dev, virDomainHostdevDef *dev,
virQEMUCaps *qemuCaps); virQEMUCaps *qemuCaps);
char *qemuBuildSCSIHostdevDevStr(const virDomainDef *def, virJSONValue *
virDomainHostdevDef *dev, qemuBuildSCSIHostdevDevProps(const virDomainDef *def,
const char *backendAlias); virDomainHostdevDef *dev,
const char *backendAlias);
qemuBlockStorageSourceAttachData * qemuBlockStorageSourceAttachData *
qemuBuildHostdevSCSIAttachPrepare(virDomainHostdevDef *hostdev, qemuBuildHostdevSCSIAttachPrepare(virDomainHostdevDef *hostdev,

View File

@ -2639,7 +2639,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriver *driver,
virErrorPtr orig_err; virErrorPtr orig_err;
g_autoptr(qemuBlockStorageSourceAttachData) data = NULL; g_autoptr(qemuBlockStorageSourceAttachData) data = NULL;
const char *backendalias = NULL; const char *backendalias = NULL;
g_autofree char *devstr = NULL; g_autoptr(virJSONValue) devprops = NULL;
bool teardowncgroup = false; bool teardowncgroup = false;
bool teardownlabel = false; bool teardownlabel = false;
bool teardowndevice = false; bool teardowndevice = false;
@ -2683,7 +2683,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriver *driver,
priv->qemuCaps))) priv->qemuCaps)))
goto cleanup; goto cleanup;
if (!(devstr = qemuBuildSCSIHostdevDevStr(vm->def, hostdev, backendalias))) if (!(devprops = qemuBuildSCSIHostdevDevProps(vm->def, hostdev, backendalias)))
goto cleanup; goto cleanup;
VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1); VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1);
@ -2693,7 +2693,7 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriver *driver,
if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0) if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0)
goto exit_monitor; goto exit_monitor;
if (qemuMonitorAddDevice(priv->mon, devstr) < 0) if (qemuMonitorAddDeviceProps(priv->mon, &devprops) < 0)
goto exit_monitor; goto exit_monitor;
if (qemuDomainObjExitMonitor(driver, vm) < 0) if (qemuDomainObjExitMonitor(driver, vm) < 0)