1
0

qemu: hotplug: Extract hotplug of PR into qemuBlockStorageSourceAttachApply

Introduce a new setup function for all the related configuration and
move the setup and attachment of the PR code.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2018-06-01 15:56:47 +02:00
parent ca174424ba
commit 1990a01e6e
5 changed files with 37 additions and 14 deletions

View File

@ -1485,6 +1485,7 @@ qemuBlockStorageSourceAttachDataFree(qemuBlockStorageSourceAttachDataPtr data)
virJSONValueFree(data->storageProps); virJSONValueFree(data->storageProps);
virJSONValueFree(data->formatProps); virJSONValueFree(data->formatProps);
virJSONValueFree(data->prmgrProps);
VIR_FREE(data->driveCmd); VIR_FREE(data->driveCmd);
VIR_FREE(data->driveAlias); VIR_FREE(data->driveAlias);
VIR_FREE(data); VIR_FREE(data);
@ -1548,6 +1549,10 @@ qemuBlockStorageSourceAttachApply(qemuMonitorPtr mon,
{ {
int rv; int rv;
if (data->prmgrProps &&
qemuMonitorAddObject(mon, &data->prmgrProps, &data->prmgrAlias) < 0)
return -1;
if (data->storageProps) { if (data->storageProps) {
rv = qemuMonitorBlockdevAdd(mon, data->storageProps); rv = qemuMonitorBlockdevAdd(mon, data->storageProps);
data->storageProps = NULL; data->storageProps = NULL;
@ -1609,6 +1614,9 @@ qemuBlockStorageSourceAttachRollback(qemuMonitorPtr mon,
if (data->storageAttached) if (data->storageAttached)
ignore_value(qemuMonitorBlockdevDel(mon, data->storageNodeName)); ignore_value(qemuMonitorBlockdevDel(mon, data->storageNodeName));
if (data->prmgrAlias)
ignore_value(qemuMonitorDelObject(mon, data->prmgrAlias));
virErrorRestore(&orig_err); virErrorRestore(&orig_err);
} }

View File

@ -71,6 +71,9 @@ qemuBlockStorageSourceGetBlockdevProps(virStorageSourcePtr src);
typedef struct qemuBlockStorageSourceAttachData qemuBlockStorageSourceAttachData; typedef struct qemuBlockStorageSourceAttachData qemuBlockStorageSourceAttachData;
typedef qemuBlockStorageSourceAttachData *qemuBlockStorageSourceAttachDataPtr; typedef qemuBlockStorageSourceAttachData *qemuBlockStorageSourceAttachDataPtr;
struct qemuBlockStorageSourceAttachData { struct qemuBlockStorageSourceAttachData {
virJSONValuePtr prmgrProps;
char *prmgrAlias;
virJSONValuePtr storageProps; virJSONValuePtr storageProps;
const char *storageNodeName; const char *storageNodeName;
bool storageAttached; bool storageAttached;

View File

@ -10485,3 +10485,24 @@ qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
return data; return data;
} }
/**
* qemuBuildStorageSourceAttachPrepareCommon:
* @src: storage source
* @data: already initialized data for disk source addition
*
* Prepare data for configuration associated with the disk source such as
* secrets/TLS/pr objects etc ...
*/
int
qemuBuildStorageSourceAttachPrepareCommon(virStorageSourcePtr src,
qemuBlockStorageSourceAttachDataPtr data)
{
if (src->pr &&
!virStoragePRDefIsManaged(src->pr) &&
!(data->prmgrProps = qemuBuildPRManagerInfoProps(src)))
return -1;
return 0;
}

View File

@ -106,6 +106,9 @@ char *qemuDeviceDriveHostAlias(virDomainDiskDefPtr disk);
qemuBlockStorageSourceAttachDataPtr qemuBlockStorageSourceAttachDataPtr
qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk, qemuBuildStorageSourceAttachPrepareDrive(virDomainDiskDefPtr disk,
virQEMUCapsPtr qemuCaps); virQEMUCapsPtr qemuCaps);
int
qemuBuildStorageSourceAttachPrepareCommon(virStorageSourcePtr src,
qemuBlockStorageSourceAttachDataPtr data);
/* Current, best practice */ /* Current, best practice */
char *qemuBuildDriveDevStr(const virDomainDef *def, char *qemuBuildDriveDevStr(const virDomainDef *def,

View File

@ -394,14 +394,12 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
qemuBlockStorageSourceAttachDataPtr data = NULL; qemuBlockStorageSourceAttachDataPtr data = NULL;
virErrorPtr orig_err; virErrorPtr orig_err;
char *devstr = NULL; char *devstr = NULL;
char *unmanagedPrmgrAlias = NULL;
char *managedPrmgrAlias = NULL; char *managedPrmgrAlias = NULL;
char *encobjAlias = NULL; char *encobjAlias = NULL;
char *secobjAlias = NULL; char *secobjAlias = NULL;
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver); virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
virJSONValuePtr secobjProps = NULL; virJSONValuePtr secobjProps = NULL;
virJSONValuePtr encobjProps = NULL; virJSONValuePtr encobjProps = NULL;
virJSONValuePtr unmanagedPrmgrProps = NULL;
virJSONValuePtr managedPrmgrProps = NULL; virJSONValuePtr managedPrmgrProps = NULL;
qemuDomainStorageSourcePrivatePtr srcPriv; qemuDomainStorageSourcePrivatePtr srcPriv;
qemuDomainSecretInfoPtr secinfo = NULL; qemuDomainSecretInfoPtr secinfo = NULL;
@ -433,12 +431,10 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
if (qemuDomainDiskAttachManagedPR(vm, disk, &managedPrmgrProps) < 0) if (qemuDomainDiskAttachManagedPR(vm, disk, &managedPrmgrProps) < 0)
goto error; goto error;
if (disk->src->pr && if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qemuCaps)))
!virStoragePRDefIsManaged(disk->src->pr) &&
!(unmanagedPrmgrProps = qemuBuildPRManagerInfoProps(disk->src)))
goto error; goto error;
if (!(data = qemuBuildStorageSourceAttachPrepareDrive(disk, priv->qemuCaps))) if (qemuBuildStorageSourceAttachPrepareCommon(disk->src, data) < 0)
goto error; goto error;
if (disk->src->haveTLS == VIR_TRISTATE_BOOL_YES && if (disk->src->haveTLS == VIR_TRISTATE_BOOL_YES &&
@ -465,10 +461,6 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
qemuMonitorAddObject(priv->mon, &managedPrmgrProps, &managedPrmgrAlias) < 0) qemuMonitorAddObject(priv->mon, &managedPrmgrProps, &managedPrmgrAlias) < 0)
goto exit_monitor; goto exit_monitor;
if (unmanagedPrmgrProps &&
qemuMonitorAddObject(priv->mon, &unmanagedPrmgrProps, &unmanagedPrmgrAlias) < 0)
goto exit_monitor;
if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0) if (qemuBlockStorageSourceAttachApply(priv->mon, data) < 0)
goto exit_monitor; goto exit_monitor;
@ -488,12 +480,10 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
cleanup: cleanup:
qemuBlockStorageSourceAttachDataFree(data); qemuBlockStorageSourceAttachDataFree(data);
virJSONValueFree(managedPrmgrProps); virJSONValueFree(managedPrmgrProps);
virJSONValueFree(unmanagedPrmgrProps);
virJSONValueFree(encobjProps); virJSONValueFree(encobjProps);
virJSONValueFree(secobjProps); virJSONValueFree(secobjProps);
qemuDomainSecretDiskDestroy(disk); qemuDomainSecretDiskDestroy(disk);
VIR_FREE(managedPrmgrAlias); VIR_FREE(managedPrmgrAlias);
VIR_FREE(unmanagedPrmgrAlias);
VIR_FREE(secobjAlias); VIR_FREE(secobjAlias);
VIR_FREE(encobjAlias); VIR_FREE(encobjAlias);
VIR_FREE(devstr); VIR_FREE(devstr);
@ -508,8 +498,6 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias)); ignore_value(qemuMonitorDelObject(priv->mon, secobjAlias));
if (encobjAlias) if (encobjAlias)
ignore_value(qemuMonitorDelObject(priv->mon, encobjAlias)); ignore_value(qemuMonitorDelObject(priv->mon, encobjAlias));
if (unmanagedPrmgrAlias)
ignore_value(qemuMonitorDelObject(priv->mon, unmanagedPrmgrAlias));
if (managedPrmgrAlias) if (managedPrmgrAlias)
ignore_value(qemuMonitorDelObject(priv->mon, managedPrmgrAlias)); ignore_value(qemuMonitorDelObject(priv->mon, managedPrmgrAlias));
if (disk->src->tlsAlias) if (disk->src->tlsAlias)