static int
-virDomainMemoryDefPostParse(virDomainMemoryDefPtr mem)
+virDomainMemoryDefPostParse(virDomainMemoryDefPtr mem,
+ const virDomainDef *def)
{
switch (mem->model) {
case VIR_DOMAIN_MEMORY_MODEL_VIRTIO_PMEM:
break;
case VIR_DOMAIN_MEMORY_MODEL_NVDIMM:
+ /* If no NVDIMM UUID was provided in XML, generate one. */
+ if (ARCH_IS_PPC64(def->os.arch) &&
+ !mem->uuid) {
+
+ mem->uuid = g_new0(unsigned char, VIR_UUID_BUFLEN);
+ if (virUUIDGenerate(mem->uuid) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR,
+ "%s", _("Failed to generate UUID"));
+ return -1;
+ }
+ }
+ break;
+
case VIR_DOMAIN_MEMORY_MODEL_DIMM:
case VIR_DOMAIN_MEMORY_MODEL_NONE:
case VIR_DOMAIN_MEMORY_MODEL_LAST:
break;
case VIR_DOMAIN_DEVICE_MEMORY:
- ret = virDomainMemoryDefPostParse(dev->data.memory);
+ ret = virDomainMemoryDefPostParse(dev->data.memory, def);
break;
case VIR_DOMAIN_DEVICE_LEASE:
virDomainMemoryDefParseXML(virDomainXMLOptionPtr xmlopt,
xmlNodePtr memdevNode,
xmlXPathContextPtr ctxt,
- const virDomainDef *dom,
unsigned int flags)
{
VIR_XPATH_NODE_AUTORESTORE(ctxt)
}
VIR_FREE(tmp);
+ /* Extract NVDIMM UUID. */
if (def->model == VIR_DOMAIN_MEMORY_MODEL_NVDIMM &&
- ARCH_IS_PPC64(dom->os.arch)) {
- /* Extract nvdimm uuid or generate a new one */
- tmp = virXPathString("string(./uuid[1])", ctxt);
-
+ (tmp = virXPathString("string(./uuid[1])", ctxt))) {
def->uuid = g_new0(unsigned char, VIR_UUID_BUFLEN);
- if (!tmp) {
- if (virUUIDGenerate(def->uuid) < 0) {
- virReportError(VIR_ERR_INTERNAL_ERROR,
- "%s", _("Failed to generate UUID"));
- goto error;
- }
- } else if (virUUIDParse(tmp, def->uuid) < 0) {
+
+ if (virUUIDParse(tmp, def->uuid) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("malformed uuid element"));
goto error;
}
}
+ VIR_FREE(tmp);
/* source */
if ((node = virXPathNode("./source", ctxt)) &&
break;
case VIR_DOMAIN_DEVICE_MEMORY:
if (!(dev->data.memory = virDomainMemoryDefParseXML(xmlopt, node,
- ctxt, def,
- flags)))
+ ctxt, flags)))
return NULL;
break;
case VIR_DOMAIN_DEVICE_IOMMU:
virDomainMemoryDefPtr mem = virDomainMemoryDefParseXML(xmlopt,
nodes[i],
ctxt,
- def,
flags);
if (!mem)
goto error;
return -1;
}
- if (ARCH_IS_PPC64(def->os.arch) && mem->labelsize == 0) {
+ if (ARCH_IS_PPC64(def->os.arch)) {
+ if (mem->labelsize == 0) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("label size is required for NVDIMM device"));
+ return -1;
+ }
+ } else if (mem->uuid) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
- _("label size is required for NVDIMM device"));
+ _("UUID is not supported for NVDIMM device"));
return -1;
}
break;