From a6ea791e2522179e4bb25620f2bfb585385fb6bb Mon Sep 17 00:00:00 2001 From: Peter Krempa Date: Mon, 11 Jun 2018 17:34:34 +0200 Subject: [PATCH] conf: Implement private data formatting and parsing for disks MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Allow storing of private data in the status XML for disks. Signed-off-by: Peter Krempa Reviewed-by: Ján Tomko --- src/conf/domain_conf.c | 63 ++++++++++++++++++++++++++++++++++++++++++ src/conf/domain_conf.h | 7 +++++ 2 files changed, 70 insertions(+) diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 26f35fa4ee..6b43c78ca4 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -9679,6 +9679,33 @@ virDomainDiskDefDriverParseXML(virDomainDiskDefPtr def, } +static int +virDomainDiskDefParsePrivateData(xmlXPathContextPtr ctxt, + virDomainDiskDefPtr disk, + virDomainXMLOptionPtr xmlopt) +{ + xmlNodePtr private_node = virXPathNode("./privateData", ctxt); + xmlNodePtr save_node = ctxt->node; + int ret = -1; + + if (!xmlopt || + !xmlopt->privateData.diskParse || + !private_node) + return 0; + + ctxt->node = private_node; + + if (xmlopt->privateData.diskParse(ctxt, disk) < 0) + goto cleanup; + + ret = 0; + + cleanup: + ctxt->node = save_node; + return ret; +} + + #define VENDOR_LEN 8 #define PRODUCT_LEN 16 @@ -10094,6 +10121,10 @@ virDomainDiskDefParseXML(virDomainXMLOptionPtr xmlopt, goto error; } + if (flags & VIR_DOMAIN_DEF_PARSE_STATUS && + virDomainDiskDefParsePrivateData(ctxt, def, xmlopt) < 0) + goto error; + if (virDomainDiskDefParseValidate(def, vmSeclabels, nvmSeclabels) < 0) goto error; @@ -24206,6 +24237,35 @@ virDomainDiskDefFormatMirror(virBufferPtr buf, } +static int +virDomainDiskDefFormatPrivateData(virBufferPtr buf, + virDomainDiskDefPtr disk, + unsigned int flags, + virDomainXMLOptionPtr xmlopt) +{ + virBuffer childBuf = VIR_BUFFER_INITIALIZER; + + if (!(flags & VIR_DOMAIN_DEF_FORMAT_STATUS) || + !xmlopt || + !xmlopt->privateData.diskFormat) + return 0; + + virBufferSetChildIndent(&childBuf, buf); + + if (xmlopt->privateData.diskFormat(disk, &childBuf) < 0) + goto error; + + if (virXMLFormatElement(buf, "privateData", NULL, &childBuf) < 0) + goto error; + + return 0; + + error: + virBufferFreeAndReset(&childBuf); + return -1; +} + + static int virDomainDiskDefFormat(virBufferPtr buf, virDomainDiskDefPtr def, @@ -24319,6 +24379,9 @@ virDomainDiskDefFormat(virBufferPtr buf, virDomainDeviceInfoFormat(buf, &def->info, flags | VIR_DOMAIN_DEF_FORMAT_ALLOW_BOOT); + if (virDomainDiskDefFormatPrivateData(buf, def, flags, xmlopt) < 0) + return -1; + virBufferAdjustIndent(buf, -2); virBufferAddLit(buf, "\n"); return 0; diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index e7f5a95e94..c0ad072db5 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -2738,6 +2738,11 @@ typedef int (*virDomainXMLPrivateDataParseFunc)(xmlXPathContextPtr, typedef void *(*virDomainXMLPrivateDataGetParseOpaqueFunc)(virDomainObjPtr vm); +typedef int (*virDomainXMLPrivateDataDiskParseFunc)(xmlXPathContextPtr ctxt, + virDomainDiskDefPtr disk); +typedef int (*virDomainXMLPrivateDataDiskFormatFunc)(virDomainDiskDefPtr disk, + virBufferPtr buf); + typedef int (*virDomainXMLPrivateDataStorageSourceParseFunc)(xmlXPathContextPtr ctxt, virStorageSourcePtr src); typedef int (*virDomainXMLPrivateDataStorageSourceFormatFunc)(virStorageSourcePtr src, @@ -2752,6 +2757,8 @@ struct _virDomainXMLPrivateDataCallbacks { /* note that private data for devices are not copied when using * virDomainDefCopy and similar functions */ virDomainXMLPrivateDataNewFunc diskNew; + virDomainXMLPrivateDataDiskParseFunc diskParse; + virDomainXMLPrivateDataDiskFormatFunc diskFormat; virDomainXMLPrivateDataNewFunc vcpuNew; virDomainXMLPrivateDataNewFunc chrSourceNew; virDomainXMLPrivateDataNewFunc vsockNew; -- 2.47.2