qemuDomainObjPrivateXMLFormatPR(buf, priv);
+ if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV))
+ virBufferAsprintf(buf, "<nodename index='%llu'/>\n", priv->nodenameindex);
+
if (qemuDomainObjPrivateXMLFormatBlockjobs(buf, vm) < 0)
return -1;
if (qemuDomainObjPrivateXMLParseBlockjobs(priv, ctxt) < 0)
goto error;
+ qemuDomainStorageIdReset(priv);
+ if (virXPathULongLong("string(./nodename/@index)", ctxt,
+ &priv->nodenameindex) == -2) {
+ virReportError(VIR_ERR_XML_ERROR, "%s",
+ _("failed to parse node name index"));
+ goto error;
+ }
+
return 0;
error:
return ret;
}
+
+
+/**
+ * qemuDomainStorageIdNew:
+ * @priv: qemu VM private data object.
+ *
+ * Generate a new unique id for a storage object. Useful for node name generation.
+ */
+unsigned int
+qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv)
+{
+ return ++priv->nodenameindex;
+}
+
+
+/**
+ * qemuDomainStorageIdReset:
+ * @priv: qemu VM private data object.
+ *
+ * Resets the data for the node name generator. The node names need to be unique
+ * for a single instance, so can be reset on VM shutdown.
+ */
+void
+qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv)
+{
+ priv->nodenameindex = 0;
+}
/* true if qemu-pr-helper process is running for the domain */
bool prDaemonRunning;
+
+ /* counter for generating node names for qemu disks */
+ unsigned long long nodenameindex;
};
# define QEMU_DOMAIN_PRIVATE(vm) \
char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv);
+unsigned int qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv);
+void qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv);
+
#endif /* __QEMU_DOMAIN_H__ */
/* clear all private data entries which are no longer needed */
qemuDomainObjPrivateDataClear(priv);
+ /* reset node name allocator */
+ qemuDomainStorageIdReset(priv);
+
/* The "release" hook cleans up additional resources */
if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
char *xml = qemuDomainDefFormatXML(driver, vm->def, 0);
<flag name='isa-serial'/>
<flag name='dump-completed'/>
<flag name='hda-output'/>
+ <flag name='blockdev'/>
</qemuCaps>
<devices>
<device alias='rng0'/>
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
<chardevStdioLogd/>
<allowReboot value='yes'/>
+ <nodename index='123'/>
<blockjobs active='no'/>
<domain type='kvm' id='1'>
<name>upstream</name>