[PATCH 13/15] conf: Implement support for <slices> of disk source

Peter Krempa pkrempa at redhat.com
Thu Feb 6 07:52:05 UTC 2020


Implement parsing and formatting of the 'source' and 'format' slices.

Signed-off-by: Peter Krempa <pkrempa at redhat.com>
---
 src/conf/domain_conf.c | 92 ++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 92 insertions(+)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index c95bd34fb5..4d1bace700 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -9467,6 +9467,62 @@ virDomainStorageSourceParseBase(const char *type,
 }


+static virStorageSourceSlicePtr
+virDomainStorageSourceParseSlice(xmlNodePtr node,
+                                 xmlXPathContextPtr ctxt)
+{
+    VIR_XPATH_NODE_AUTORESTORE(ctxt);
+    g_autofree char *offset = NULL;
+    g_autofree char *size = NULL;
+    g_autofree virStorageSourceSlicePtr ret = g_new0(virStorageSourceSlice, 1);
+
+    ctxt->node = node;
+
+    if (!(offset = virXPathString("string(./@offset)", ctxt)) ||
+        !(size = virXPathString("string(./@size)", ctxt))) {
+        virReportError(VIR_ERR_XML_ERROR, "%s",
+                       _("missing offset or size attribute of slice"));
+        return NULL;
+    }
+
+    if (virStrToLong_ullp(offset, NULL, 10, &ret->offset) < 0) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("malformed value '%s' of 'offset' attribute of slice"),
+                       offset);
+        return NULL;
+    }
+
+    if (virStrToLong_ullp(size, NULL, 10, &ret->size) < 0) {
+        virReportError(VIR_ERR_XML_ERROR,
+                       _("malformed value '%s' of 'size' attribute of slice"),
+                       size);
+        return NULL;
+    }
+
+    return g_steal_pointer(&ret);
+}
+
+
+static int
+virDomainStorageSourceParseSlices(virStorageSourcePtr src,
+                                  xmlXPathContextPtr ctxt)
+{
+    xmlNodePtr node;
+
+    if ((node = virXPathNode("./slices/slice[@type='storage']", ctxt))) {
+        if (!(src->sliceStorage = virDomainStorageSourceParseSlice(node, ctxt)))
+            return -1;
+    }
+
+    if ((node = virXPathNode("./slices/slice[@type='format']", ctxt))) {
+        if (!(src->sliceFormat = virDomainStorageSourceParseSlice(node, ctxt)))
+            return -1;
+    }
+
+    return 0;
+}
+
+
 /**
  * virDomainStorageSourceParse:
  * @node: XML node pointing to the source element to parse
@@ -9532,6 +9588,9 @@ virDomainStorageSourceParse(xmlNodePtr node,
     if (virDomainDiskSourcePRParse(node, ctxt, &src->pr) < 0)
         return -1;

+    if (virDomainStorageSourceParseSlices(src, ctxt) < 0)
+        return -1;
+
     if (virSecurityDeviceLabelDefParseXML(&src->seclabels, &src->nseclabels,
                                           ctxt, flags) < 0)
         return -1;
@@ -24373,6 +24432,37 @@ virDomainDiskSourceFormatPrivateData(virBufferPtr buf,
 }


+static void
+virDomainDiskSourceFormatSlice(virBufferPtr buf,
+                               const char *slicetype,
+                               virStorageSourceSlicePtr slice)
+{
+    g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
+
+    if (!slice)
+        return;
+
+    virBufferAsprintf(&attrBuf, " type='%s'", slicetype);
+    virBufferAsprintf(&attrBuf, " offset='%llu'", slice->offset);
+    virBufferAsprintf(&attrBuf, " size='%llu'", slice->size);
+
+    virXMLFormatElement(buf, "slice", &attrBuf, NULL);
+}
+
+
+static void
+virDomainDiskSourceFormatSlices(virBufferPtr buf,
+                                virStorageSourcePtr src)
+{
+    g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
+
+    virDomainDiskSourceFormatSlice(&childBuf, "format", src->sliceFormat);
+    virDomainDiskSourceFormatSlice(&childBuf, "storage", src->sliceStorage);
+
+    virXMLFormatElement(buf, "slices", NULL, &childBuf);
+}
+
+
 /**
  * virDomainDiskSourceFormat:
  * @buf: output buffer
@@ -24443,6 +24533,8 @@ virDomainDiskSourceFormat(virBufferPtr buf,
         return -1;
     }

+    virDomainDiskSourceFormatSlices(&childBuf, src);
+
     if (src->type != VIR_STORAGE_TYPE_NETWORK)
         virDomainSourceDefFormatSeclabel(&childBuf, src->nseclabels,
                                          src->seclabels, flags);
-- 
2.24.1




More information about the libvir-list mailing list