g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
size_t i;
- /* disk secrets are prepared when preparing disks */
-
- for (i = 0; i < vm->def->nhostdevs; i++) {
- if (qemuDomainSecretHostdevPrepare(priv,
- vm->def->hostdevs[i]) < 0)
- return -1;
- }
+ /* disk and hostdev secrets are prepared when preparing internal data */
for (i = 0; i < vm->def->nserials; i++) {
if (qemuDomainSecretChardevPrepare(cfg, priv,
}
+int
+qemuDomainPrepareHostdev(virDomainHostdevDefPtr hostdev,
+ qemuDomainObjPrivatePtr priv)
+{
+ if (virHostdevIsSCSIDevice(hostdev)) {
+ virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
+ virStorageSourcePtr src = NULL;
+
+ switch ((virDomainHostdevSCSIProtocolType) scsisrc->protocol) {
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_NONE:
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI:
+ src = scsisrc->u.iscsi.src;
+ break;
+
+ case VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_LAST:
+ default:
+ virReportEnumRangeError(virDomainHostdevSCSIProtocolType, scsisrc->protocol);
+ return -1;
+ }
+
+ if (src) {
+ if (src->auth) {
+ bool iscsiHasPS = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_ISCSI_PASSWORD_SECRET);
+ virSecretUsageType usageType = VIR_SECRET_USAGE_TYPE_ISCSI;
+ qemuDomainStorageSourcePrivatePtr srcPriv = qemuDomainStorageSourcePrivateFetch(src);
+
+ if (!qemuDomainSupportsEncryptedSecret(priv) || !iscsiHasPS) {
+ srcPriv->secinfo = qemuDomainSecretInfoNewPlain(usageType,
+ src->auth->username,
+ &src->auth->seclookupdef);
+ } else {
+ srcPriv->secinfo = qemuDomainSecretAESSetupFromSecret(priv,
+ hostdev->info->alias,
+ NULL,
+ usageType,
+ src->auth->username,
+ &src->auth->seclookupdef);
+ }
+
+ if (!srcPriv->secinfo)
+ return -1;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
/**
* qemuDomainDiskCachemodeFlags:
*
if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
goto cleanup;
- if (qemuDomainSecretHostdevPrepare(priv, hostdev) < 0)
+ if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
goto cleanup;
if (!(data = qemuBuildHostdevSCSIAttachPrepare(hostdev, &backendalias,
}
+static int
+qemuProcessPrepareDomainHostdevs(virDomainObjPtr vm,
+ qemuDomainObjPrivatePtr priv)
+{
+ size_t i;
+
+ for (i = 0; i < vm->def->nhostdevs; i++) {
+ virDomainHostdevDefPtr hostdev = vm->def->hostdevs[i];
+
+ if (qemuDomainPrepareHostdev(hostdev, priv) < 0)
+ return -1;
+ }
+
+ return 0;
+}
+
+
static void
qemuProcessPrepareAllowReboot(virDomainObjPtr vm)
{
if (qemuProcessPrepareDomainStorage(driver, vm, priv, cfg, flags) < 0)
return -1;
+ VIR_DEBUG("Setting up host devices");
+ if (qemuProcessPrepareDomainHostdevs(vm, priv) < 0)
+ return -1;
+
VIR_DEBUG("Prepare chardev source backends for TLS");
qemuDomainPrepareChardevSource(vm->def, cfg);