Similarly to command line creation, use the blockdev helpers when
hotplugging an (i)SCSI hostdev.
Signed-off-by: Peter Krempa
---
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