qemu: command: Create qemuBlockStorageSourceAttachData for (i)SCSI hostdevs

Add convertor for creating qemuBlockStorageSourceAttachData which will
allow reusing the infrastructure which we have for attaching disks also
for hostdevs.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2020-06-19 16:53:56 +02:00
parent bab9257a64
commit 245ed36e97
2 changed files with 91 additions and 0 deletions

View File

@ -5062,6 +5062,89 @@ qemuBuildHostdevMediatedDevStr(const virDomainDef *def,
}
qemuBlockStorageSourceAttachData *
qemuBuildHostdevSCSIDetachPrepare(virDomainHostdevDefPtr hostdev,
virQEMUCapsPtr qemuCaps)
{
virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
g_autoptr(qemuBlockStorageSourceAttachData) ret = g_new0(qemuBlockStorageSourceAttachData, 1);
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI)) {
if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
qemuDomainStorageSourcePrivatePtr srcpriv = QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(iscsisrc->src);
ret->storageNodeName = iscsisrc->src->nodestorage;
if (srcpriv && srcpriv->secinfo &&
srcpriv->secinfo->type == VIR_DOMAIN_SECRET_INFO_TYPE_AES)
ret->authsecretAlias = g_strdup(srcpriv->secinfo->s.aes.alias);
} else {
ret->storageNodeNameCopy = g_strdup_printf("libvirt-%s-backend", hostdev->info->alias);
ret->storageNodeName = ret->storageNodeNameCopy;
}
ret->storageAttached = true;
} else {
ret->driveAlias = qemuAliasFromHostdev(hostdev);
ret->driveAdded = true;
}
return g_steal_pointer(&ret);
}
qemuBlockStorageSourceAttachData *
qemuBuildHostdevSCSIAttachPrepare(virDomainHostdevDefPtr hostdev,
const char **backendAlias,
virQEMUCapsPtr qemuCaps)
{
virDomainHostdevSubsysSCSIPtr scsisrc = &hostdev->source.subsys.u.scsi;
virDomainHostdevSubsysSCSIiSCSIPtr iscsisrc = &scsisrc->u.iscsi;
virStorageSourcePtr src;
g_autoptr(virStorageSource) localsrc = NULL;
g_autoptr(qemuBlockStorageSourceAttachData) ret = g_new0(qemuBlockStorageSourceAttachData, 1);
if (virQEMUCapsGet(qemuCaps, QEMU_CAPS_BLOCKDEV_HOSTDEV_SCSI)) {
if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI) {
src = iscsisrc->src;
} else {
g_autofree char *devstr = qemuBuildSCSIHostHostdevDrvStr(hostdev);
if (!devstr)
return NULL;
if (!(src = localsrc = virStorageSourceNew()))
return NULL;
src->type = VIR_STORAGE_TYPE_BLOCK;
src->readonly = hostdev->readonly;
src->path = g_strdup_printf("/dev/%s", devstr);
}
src->nodestorage = g_strdup_printf("libvirt-%s-backend", hostdev->info->alias);
ret->storageNodeNameCopy = g_strdup(src->nodestorage);
ret->storageNodeName = ret->storageNodeNameCopy;
*backendAlias = ret->storageNodeNameCopy;
if (!(ret->storageProps = qemuBlockStorageSourceGetBackendProps(src,
QEMU_BLOCK_STORAGE_SOURCE_BACKEND_PROPS_SKIP_UNMAP)))
return NULL;
} else {
ret->driveCmd = qemuBuildSCSIHostdevDrvStr(hostdev, qemuCaps);
ret->driveAlias = qemuAliasFromHostdev(hostdev);
*backendAlias = ret->driveAlias;
}
if (scsisrc->protocol == VIR_DOMAIN_HOSTDEV_SCSI_PROTOCOL_TYPE_ISCSI &&
qemuBuildStorageSourceAttachPrepareCommon(iscsisrc->src, ret, qemuCaps) < 0)
return NULL;
return g_steal_pointer(&ret);
}
static int
qemuBuildHostdevSCSICommandLine(virCommandPtr cmd,
const virDomainDef *def,

View File

@ -182,6 +182,14 @@ char *qemuBuildSCSIHostdevDevStr(const virDomainDef *def,
virDomainHostdevDefPtr dev,
const char *backendAlias);
qemuBlockStorageSourceAttachData *
qemuBuildHostdevSCSIAttachPrepare(virDomainHostdevDefPtr hostdev,
const char **backendAlias,
virQEMUCapsPtr qemuCaps);
qemuBlockStorageSourceAttachData *
qemuBuildHostdevSCSIDetachPrepare(virDomainHostdevDefPtr hostdev,
virQEMUCapsPtr qemuCaps);
char *
qemuBuildSCSIVHostHostdevDevStr(const virDomainDef *def,
virDomainHostdevDefPtr dev,