Similarly to command line creation, use the blockdev helpers when
hotplugging an (i)SCSI hostdev.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_hotplug.c | 45 +++++++----------------------------------
1 file changed, 7 insertions(+), 38 deletions(-)
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index fbbd6a533c..06b3b94ff2 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -2566,17 +2566,12 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver,
int ret = -1;
qemuDomainObjPrivatePtr priv = vm->privateData;
virErrorPtr orig_err;
+ g_autoptr(qemuBlockStorageSourceAttachData) data = NULL;
+ const char *backendalias = NULL;
g_autofree char *devstr = NULL;
- g_autofree char *drvstr = NULL;
- g_autofree char *drivealias = NULL;
- g_autofree char *secobjAlias = NULL;
bool teardowncgroup = false;
bool teardownlabel = false;
bool teardowndevice = false;
- bool driveAdded = false;
- virJSONValuePtr secobjProps = NULL;
- virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
- qemuDomainSecretInfoPtr secinfo = NULL;
/* Let's make sure the disk has a controller defined and loaded before
* trying to add it. The controller used by the disk must exist before a
@@ -2611,25 +2606,11 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver,
if (qemuDomainSecretHostdevPrepare(priv, hostdev) < 0)
goto cleanup;
- if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
- qemuDomainStorageSourcePrivatePtr srcPriv =
- QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(scsisrc->u.iscsi.src);
- if (srcPriv)
- secinfo = srcPriv->secinfo;
- }
-
- if (secinfo && secinfo->type == VIR_DOMAIN_SECRET_INFO_TYPE_AES) {
- if (qemuBuildSecretInfoProps(secinfo, &secobjProps) < 0)
- goto cleanup;
- }
-
- if (!(drvstr = qemuBuildSCSIHostdevDrvStr(hostdev, priv->qemuCaps)))
- goto cleanup;
-
- if (!(drivealias = qemuAliasFromHostdev(hostdev)))
+ if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendalias,
+ priv->qemuCaps)))
goto cleanup;
- if (!(devstr = qemuBuildSCSIHostdevDevStr(vm->def, hostdev, drivealias)))
+ if (!(devstr = qemuBuildSCSIHostdevDevStr(vm->def, hostdev, backendalias)))
goto cleanup;
if (VIR_REALLOC_N(vm->def->hostdevs, vm->def->nhostdevs + 1) < 0)
@@ -2637,14 +2618,9 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver,
qemuDomainObjEnterMonitor(driver, vm);
- if (secobjProps &&
- qemuMonitorAddObject(priv->mon, &secobjProps, &secobjAlias) < 0)
+ if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0)
goto exit_monitor;
- if (qemuMonitorAddDrive(priv->mon, drvstr) < 0)
- goto exit_monitor;
- driveAdded = true;
-
if (qemuMonitorAddDevice(priv->mon, devstr) < 0)
goto exit_monitor;
@@ -2670,18 +2646,11 @@ qemuDomainAttachHostSCSIDevice(virQEMUDriverPtr driver,
VIR_WARN("Unable to remove host device from /dev");
}
qemuDomainSecretHostdevDestroy(hostdev);
- virJSONValueFree(secobjProps);
return ret;
exit_monitor:
virErrorPreserveLast(&orig_err);
- if (driveAdded && qemuMonitorDriveDel(priv->mon, drivealias) < 0) {
- VIR_WARN("Unable to remove drive %s (%s) after failed "
- "qemuMonitorAddDevice",
- drvstr, devstr);
- }
- if (secobjAlias)
- ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias, false));
+ qemuBlockStorageSourceAttachRollback(priv->mon, data);
ignore_value(qemuDomainObjExitMonitor(driver, vm));
virErrorRestore(&orig_err);
--
2.26.2