Rather than always re-generating the alias store it in the definition
and in the status XML.
Signed-off-by: Peter Krempa <pkrempa(a)redhat.com>
---
src/qemu/qemu_command.c | 23 +++------------------
src/qemu/qemu_command.h | 3 +--
src/qemu/qemu_domain.c | 16 +++++++++++++--
src/qemu/qemu_hotplug.c | 34 ++++++++++---------------------
src/util/virstoragefile.c | 1 +
src/util/virstoragefile.h | 3 +++
tests/qemustatusxml2xmldata/modern-in.xml | 4 ++++
7 files changed, 37 insertions(+), 47 deletions(-)
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index c38dde5a60..84d7d51c7c 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -9669,7 +9669,6 @@ qemuBuildPanicCommandLine(virCommandPtr cmd,
* qemuBuildPRManagerInfoProps:
* @disk: disk definition
* @propsret: Returns JSON object containing properties of the pr-manager-helper object
- * @aliasret: alias of the pr-manager-helper object
*
* Build the JSON properties for the pr-manager object.
*
@@ -9678,32 +9677,19 @@ qemuBuildPanicCommandLine(virCommandPtr cmd,
*/
int
qemuBuildPRManagerInfoProps(const virDomainDiskDef *disk,
- virJSONValuePtr *propsret,
- char **aliasret)
+ virJSONValuePtr *propsret)
{
- char *alias = NULL;
int ret = -1;
*propsret = NULL;
- *aliasret = NULL;
-
- if (virStoragePRDefIsManaged(disk->src->pr)) {
- if (VIR_STRDUP(alias, qemuDomainGetManagedPRAlias()) < 0)
- goto cleanup;
- } else {
- if (!(alias = qemuDomainGetUnmanagedPRAlias(disk->info.alias)))
- goto cleanup;
- }
if (virJSONValueObjectCreate(propsret,
"s:path", disk->src->pr->path,
NULL) < 0)
goto cleanup;
- VIR_STEAL_PTR(*aliasret, alias);
ret = 0;
cleanup:
- VIR_FREE(alias);
return ret;
}
@@ -9715,7 +9701,6 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd,
size_t i;
bool managedAdded = false;
virJSONValuePtr props = NULL;
- char *alias = NULL;
char *tmp = NULL;
int ret = -1;
@@ -9732,14 +9717,13 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd,
managedAdded = true;
}
- if (qemuBuildPRManagerInfoProps(disk, &props, &alias) < 0)
+ if (qemuBuildPRManagerInfoProps(disk, &props) < 0)
goto cleanup;
if (!(tmp = virQEMUBuildObjectCommandlineFromJSON("pr-manager-helper",
- alias,
+
disk->src->pr->mgralias,
props)))
goto cleanup;
- VIR_FREE(alias);
virJSONValueFree(props);
props = NULL;
@@ -9749,7 +9733,6 @@ qemuBuildMasterPRCommandLine(virCommandPtr cmd,
ret = 0;
cleanup:
- VIR_FREE(alias);
virJSONValueFree(props);
return ret;
}
diff --git a/src/qemu/qemu_command.h b/src/qemu/qemu_command.h
index 621592cd79..28bc33558b 100644
--- a/src/qemu/qemu_command.h
+++ b/src/qemu/qemu_command.h
@@ -56,8 +56,7 @@ virCommandPtr qemuBuildCommandLine(virQEMUDriverPtr driver,
/* Generate the object properties for pr-manager */
int qemuBuildPRManagerInfoProps(const virDomainDiskDef *disk,
- virJSONValuePtr *propsret,
- char **alias);
+ virJSONValuePtr *propsret);
/* Generate the object properties for a secret */
int qemuBuildSecretInfoProps(qemuDomainSecretInfoPtr secinfo,
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 92217e66fe..1572ce5c2d 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -1941,6 +1941,9 @@ qemuStorageSourcePrivateDataParse(xmlXPathContextPtr ctxt,
src->nodestorage =
virXPathString("string(./nodenames/nodename[@type='storage']/@name)",
ctxt);
src->nodeformat =
virXPathString("string(./nodenames/nodename[@type='format']/@name)",
ctxt);
+ if (src->pr)
+ src->pr->mgralias =
virXPathString("string(./reservations/@mgralias)", ctxt);
+
if (virStorageSourcePrivateDataParseRelPath(ctxt, src) < 0)
return -1;
@@ -1961,6 +1964,9 @@ qemuStorageSourcePrivateDataFormat(virStorageSourcePtr src,
virBufferAddLit(buf, "</nodenames>\n");
}
+ if (src->pr)
+ virBufferAsprintf(buf, "<reservations mgralias='%s'/>\n",
src->pr->mgralias);
+
if (virStorageSourcePrivateDataFormatRelPath(src, buf) < 0)
return -1;
@@ -11932,7 +11938,8 @@ qemuDomainPrepareDiskCachemode(virDomainDiskDefPtr disk)
static int
qemuDomainPrepareStorageSourcePR(virStorageSourcePtr src,
- qemuDomainObjPrivatePtr priv)
+ qemuDomainObjPrivatePtr priv,
+ const char *parentalias)
{
if (!src->pr)
return 0;
@@ -11940,6 +11947,11 @@ qemuDomainPrepareStorageSourcePR(virStorageSourcePtr src,
if (virStoragePRDefIsManaged(src->pr)) {
if (!(src->pr->path = qemuDomainGetManagedPRSocketPath(priv)))
return -1;
+ if (VIR_STRDUP(src->pr->mgralias, qemuDomainGetManagedPRAlias()) < 0)
+ return -1;
+ } else {
+ if (!(src->pr->mgralias = qemuDomainGetUnmanagedPRAlias(parentalias)))
+ return -1;
}
return 0;
@@ -11962,7 +11974,7 @@ qemuDomainPrepareDiskSource(virDomainDiskDefPtr disk,
if (qemuDomainPrepareDiskSourceChain(disk, NULL, cfg, priv->qemuCaps) < 0)
return -1;
- if (qemuDomainPrepareStorageSourcePR(disk->src, priv) < 0)
+ if (qemuDomainPrepareStorageSourcePR(disk->src, priv, disk->info.alias) <
0)
return -1;
return 0;
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 6557711ec1..9481123c19 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -387,13 +387,11 @@ qemuDomainMaybeStartPRDaemon(virDomainObjPtr vm,
static int
qemuMaybeBuildPRManagerInfoProps(virDomainObjPtr vm,
const virDomainDiskDef *disk,
- virJSONValuePtr *propsret,
- char **aliasret)
+ virJSONValuePtr *propsret)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
*propsret = NULL;
- *aliasret = NULL;
if (!disk->src->pr)
return 0;
@@ -404,7 +402,7 @@ qemuMaybeBuildPRManagerInfoProps(virDomainObjPtr vm,
return 0;
}
- return qemuBuildPRManagerInfoProps(disk, propsret, aliasret);
+ return qemuBuildPRManagerInfoProps(disk, propsret);
}
@@ -425,7 +423,6 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
char *devstr = NULL;
char *drivestr = NULL;
char *drivealias = NULL;
- char *prmgrAlias = NULL;
bool driveAdded = false;
bool secobjAdded = false;
bool encobjAdded = false;
@@ -462,7 +459,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
if (encinfo && qemuBuildSecretInfoProps(encinfo, &encobjProps) < 0)
goto error;
- if (qemuMaybeBuildPRManagerInfoProps(vm, disk, &prmgrProps, &prmgrAlias) <
0)
+ if (qemuMaybeBuildPRManagerInfoProps(vm, disk, &prmgrProps) < 0)
goto error;
/* Start daemon only after prmgrProps is built. Otherwise
@@ -511,7 +508,8 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
}
if (prmgrProps) {
- rv = qemuMonitorAddObject(priv->mon, "pr-manager-helper",
prmgrAlias,
+ rv = qemuMonitorAddObject(priv->mon, "pr-manager-helper",
+ disk->src->pr->mgralias,
prmgrProps);
prmgrProps = NULL; /* qemuMonitorAddObject consumes */
if (rv < 0)
@@ -541,7 +539,6 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
virJSONValueFree(encobjProps);
virJSONValueFree(secobjProps);
qemuDomainSecretDiskDestroy(disk);
- VIR_FREE(prmgrAlias);
VIR_FREE(drivealias);
VIR_FREE(drivestr);
VIR_FREE(devstr);
@@ -559,7 +556,7 @@ qemuDomainAttachDiskGeneric(virQEMUDriverPtr driver,
if (encobjAdded)
ignore_value(qemuMonitorDelObject(priv->mon, encinfo->s.aes.alias));
if (prmgrAdded)
- ignore_value(qemuMonitorDelObject(priv->mon, prmgrAlias));
+ ignore_value(qemuMonitorDelObject(priv->mon,
disk->src->pr->mgralias));
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -2;
virErrorRestore(&orig_err);
@@ -3832,22 +3829,18 @@ static bool qemuIsMultiFunctionDevice(virDomainDefPtr def,
static int
qemuDomainDiskNeedRemovePR(virDomainObjPtr vm,
virDomainDiskDefPtr disk,
- char **aliasret,
bool *stopDaemon)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
size_t i;
- *aliasret = NULL;
*stopDaemon = false;
if (!disk->src->pr)
return 0;
- if (!virStoragePRDefIsManaged(disk->src->pr)) {
- *aliasret = qemuDomainGetUnmanagedPRAlias(disk->info.alias);
- return *aliasret ? 0 : -1;
- }
+ if (!virStoragePRDefIsManaged(disk->src->pr))
+ return 0;
for (i = 0; i < vm->def->ndisks; i++) {
const virDomainDiskDef *domainDisk = vm->def->disks[i];
@@ -3862,9 +3855,6 @@ qemuDomainDiskNeedRemovePR(virDomainObjPtr vm,
if (i != vm->def->ndisks)
return 0;
- if (VIR_STRDUP(*aliasret, qemuDomainGetManagedPRAlias()) < 0)
- return -1;
-
if (priv->prDaemonRunning)
*stopDaemon = true;
@@ -3885,7 +3875,6 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
char *drivestr;
char *objAlias = NULL;
char *encAlias = NULL;
- char *prmgrAlias = NULL;
bool stopPRDaemon = false;
VIR_DEBUG("Removing disk %s from domain %p %s",
@@ -3924,7 +3913,7 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
}
}
- if (qemuDomainDiskNeedRemovePR(vm, disk, &prmgrAlias, &stopPRDaemon) < 0)
+ if (qemuDomainDiskNeedRemovePR(vm, disk, &stopPRDaemon) < 0)
return -1;
qemuDomainObjEnterMonitor(driver, vm);
@@ -3943,9 +3932,8 @@ qemuDomainRemoveDiskDevice(virQEMUDriverPtr driver,
VIR_FREE(encAlias);
/* If it fails, then so be it - it was a best shot */
- if (prmgrAlias)
- ignore_value(qemuMonitorDelObject(priv->mon, prmgrAlias));
- VIR_FREE(prmgrAlias);
+ if (disk->src->pr)
+ ignore_value(qemuMonitorDelObject(priv->mon,
disk->src->pr->mgralias));
if (disk->src->haveTLS)
ignore_value(qemuMonitorDelObject(priv->mon, disk->src->tlsAlias));
diff --git a/src/util/virstoragefile.c b/src/util/virstoragefile.c
index dbbe758f30..54de2c1c30 100644
--- a/src/util/virstoragefile.c
+++ b/src/util/virstoragefile.c
@@ -1899,6 +1899,7 @@ virStoragePRDefFree(virStoragePRDefPtr prd)
return;
VIR_FREE(prd->path);
+ VIR_FREE(prd->mgralias);
VIR_FREE(prd);
}
diff --git a/src/util/virstoragefile.h b/src/util/virstoragefile.h
index 3a90c60fa5..1631c4cf66 100644
--- a/src/util/virstoragefile.h
+++ b/src/util/virstoragefile.h
@@ -221,6 +221,9 @@ typedef virStoragePRDef *virStoragePRDefPtr;
struct _virStoragePRDef {
int managed; /* enum virTristateBool */
char *path;
+
+ /* manager object alias */
+ char *mgralias;
};
typedef struct _virStorageDriverData virStorageDriverData;
diff --git a/tests/qemustatusxml2xmldata/modern-in.xml
b/tests/qemustatusxml2xmldata/modern-in.xml
index d57e1f605f..d63fcf79f1 100644
--- a/tests/qemustatusxml2xmldata/modern-in.xml
+++ b/tests/qemustatusxml2xmldata/modern-in.xml
@@ -308,11 +308,15 @@
<backingStore type='file' index='1'>
<format type='qcow2'/>
<source file='/var/lib/libvirt/images/base.qcow2'>
+ <reservations managed='yes'>
+ <source type='unix' path='/somepath/ux.sck'
mode='client'/>
+ </reservations>
<privateData>
<nodenames>
<nodename type='storage' name='test-storage'/>
<nodename type='format' name='test-format'/>
</nodenames>
+ <reservations mgralias='test-alias'/>
<relPath>base.qcow2</relPath>
</privateData>
</source>
--
2.16.2