mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-09-08 16:54:49 +00:00
conf: Implement support for <slices> of disk source
Implement parsing and formatting of the 'storage' slice. Signed-off-by: Peter Krempa <pkrempa@redhat.com> Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
parent
44f0f76890
commit
bbf5d05cfd
@ -9470,6 +9470,57 @@ 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;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virDomainStorageSourceParse:
|
* virDomainStorageSourceParse:
|
||||||
* @node: XML node pointing to the source element to parse
|
* @node: XML node pointing to the source element to parse
|
||||||
@ -9535,6 +9586,9 @@ virDomainStorageSourceParse(xmlNodePtr node,
|
|||||||
if (virDomainDiskSourcePRParse(node, ctxt, &src->pr) < 0)
|
if (virDomainDiskSourcePRParse(node, ctxt, &src->pr) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
if (virDomainStorageSourceParseSlices(src, ctxt) < 0)
|
||||||
|
return -1;
|
||||||
|
|
||||||
if (virSecurityDeviceLabelDefParseXML(&src->seclabels, &src->nseclabels,
|
if (virSecurityDeviceLabelDefParseXML(&src->seclabels, &src->nseclabels,
|
||||||
ctxt, flags) < 0)
|
ctxt, flags) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
@ -24376,6 +24430,36 @@ 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, "storage", src->sliceStorage);
|
||||||
|
|
||||||
|
virXMLFormatElement(buf, "slices", NULL, &childBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* virDomainDiskSourceFormat:
|
* virDomainDiskSourceFormat:
|
||||||
* @buf: output buffer
|
* @buf: output buffer
|
||||||
@ -24446,6 +24530,8 @@ virDomainDiskSourceFormat(virBufferPtr buf,
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virDomainDiskSourceFormatSlices(&childBuf, src);
|
||||||
|
|
||||||
if (src->type != VIR_STORAGE_TYPE_NETWORK)
|
if (src->type != VIR_STORAGE_TYPE_NETWORK)
|
||||||
virDomainSourceDefFormatSeclabel(&childBuf, src->nseclabels,
|
virDomainSourceDefFormatSeclabel(&childBuf, src->nseclabels,
|
||||||
src->seclabels, flags);
|
src->seclabels, flags);
|
||||||
|
Loading…
Reference in New Issue
Block a user