On 02/21/2018 01:11 PM, Michal Privoznik wrote:
Now that we generate pr-manager alias and socket path store them
in status XML so that they are preserved across daemon restarts.
Signed-off-by: Michal Privoznik <mprivozn(a)redhat.com>
---
src/qemu/qemu_domain.c | 90 ++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 88 insertions(+), 2 deletions(-)
Something that dawned on my this morning (sorry ;-)) - the ->alias could
easily be generated at reconnect time too.
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index dffc4c30e..45205fd03 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -2540,6 +2540,92 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
}
+static int
+qemuStorageSourcePrivateDataParsePR(xmlXPathContextPtr ctxt,
+ virStorageSourcePtr src)
+{
+ qemuDomainStorageSourcePrivatePtr srcPriv =
QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src);
+ qemuDomainDiskPRDPtr prd = NULL;
+ int rc;
+ int ret = -1;
+
+ if ((rc = virXPathBoolean("boolean(./prd)", ctxt)) == 0) {
^^
Extra space above
+ return 0;
+ } else if (rc < 0) {
+ return ret;
+ }
+
+ if (VIR_ALLOC(prd) < 0)
+ goto cleanup;
return ret works too since prd == NULL
+
+ if (!(prd->alias = virXPathString("string(./prd/alias)", ctxt)) ||
+ !(prd->path = virXPathString("string(./prd/path)", ctxt))) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("malformed <prd/>"));
+ goto cleanup;
+ }
+
+ VIR_STEAL_PTR(srcPriv->prd, prd);
+ ret = 0;
+ cleanup:
+ qemuDomainDiskPRDFree(prd);
+ return ret;
+}
+
+
+static int
+qemuStorageSourcePrivateDataFormatPR(virStorageSourcePtr src,
+ virBufferPtr buf)
+{
+ qemuDomainStorageSourcePrivatePtr srcPriv =
QEMU_DOMAIN_STORAGE_SOURCE_PRIVATE(src);
+ qemuDomainDiskPRDPtr prd;
+
+ if (!srcPriv || !srcPriv->prd)
+ return 0;
+
+ prd = srcPriv->prd;
Does saving the information really "matter" in whatever case it is that
uses a 'static' alias and path? IOW: Should we save some sort of
boolean to indicate PR was desired and then if path is also provided, we
can use that path; otherwise, use the 'static' path when we try to
reconnect the socket.
+
+ virBufferAddLit(buf, "<prd>\n");
+ virBufferAdjustIndent(buf, 2);
+ virBufferAsprintf(buf, "<alias>%s</alias>\n", prd->alias);
+ virBufferAsprintf(buf, "<path>%s</path>\n", prd->path);
alias and path could be attributes of prd too rather than elements on
their own, but that's just your implementation detail... IDC, but
figured I'd note it anyway.
John
+ virBufferAdjustIndent(buf, -2);
+ virBufferAddLit(buf, "</prd>\n");
+ return 0;
+}
+
+
+static int
+qemuStorageSourcePrivateDataParse(xmlXPathContextPtr ctxt,
+ virStorageSourcePtr src)
+{
+ if (!(src->privateData = qemuDomainStorageSourcePrivateNew()))
+ return -1;
+
+ if (virStorageSourcePrivateDataParseRelPath(ctxt, src) < 0)
+ return -1;
+
+ if (qemuStorageSourcePrivateDataParsePR(ctxt, src) < 0)
+ return -1;
+
+ return 0;
+}
+
+
+static int
+qemuStorageSourcePrivateDataFormat(virStorageSourcePtr src,
+ virBufferPtr buf)
+{
+ if (virStorageSourcePrivateDataFormatRelPath(src, buf) < 0)
+ return -1;
+
+ if (qemuStorageSourcePrivateDataFormatPR(src, buf) < 0)
+ return -1;
+
+ return 0;
+}
+
+
virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks = {
.alloc = qemuDomainObjPrivateAlloc,
.free = qemuDomainObjPrivateFree,
@@ -2548,8 +2634,8 @@ virDomainXMLPrivateDataCallbacks virQEMUDriverPrivateDataCallbacks
= {
.chrSourceNew = qemuDomainChrSourcePrivateNew,
.parse = qemuDomainObjPrivateXMLParse,
.format = qemuDomainObjPrivateXMLFormat,
- .storageParse = virStorageSourcePrivateDataParseRelPath,
- .storageFormat = virStorageSourcePrivateDataFormatRelPath,
+ .storageParse = qemuStorageSourcePrivateDataParse,
+ .storageFormat = qemuStorageSourcePrivateDataFormat,
};