提交 e436881b 编写于 作者: P Peter Krempa

qemu: domain: Add infrastructure to generate block node names

Node names for block objects in qemu need to be unique for an instance
of the qemu process. Add a counter to generate objects sequentially and
store it in the status XML so that we can restore it.

The helpers added allow to create new node names and reset the counter
after the VM process terminates.
Signed-off-by: NPeter Krempa <pkrempa@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 d6580c10
...@@ -2438,6 +2438,9 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, ...@@ -2438,6 +2438,9 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf,
qemuDomainObjPrivateXMLFormatPR(buf, priv); qemuDomainObjPrivateXMLFormatPR(buf, priv);
if (virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_BLOCKDEV))
virBufferAsprintf(buf, "<nodename index='%llu'/>\n", priv->nodenameindex);
if (qemuDomainObjPrivateXMLFormatBlockjobs(buf, vm) < 0) if (qemuDomainObjPrivateXMLFormatBlockjobs(buf, vm) < 0)
return -1; return -1;
...@@ -2933,6 +2936,14 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, ...@@ -2933,6 +2936,14 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt,
if (qemuDomainObjPrivateXMLParseBlockjobs(priv, ctxt) < 0) if (qemuDomainObjPrivateXMLParseBlockjobs(priv, ctxt) < 0)
goto error; 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; return 0;
error: error:
...@@ -13179,3 +13190,30 @@ qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv) ...@@ -13179,3 +13190,30 @@ qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv)
return ret; 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;
}
...@@ -363,6 +363,9 @@ struct _qemuDomainObjPrivate { ...@@ -363,6 +363,9 @@ struct _qemuDomainObjPrivate {
/* true if qemu-pr-helper process is running for the domain */ /* true if qemu-pr-helper process is running for the domain */
bool prDaemonRunning; bool prDaemonRunning;
/* counter for generating node names for qemu disks */
unsigned long long nodenameindex;
}; };
# define QEMU_DOMAIN_PRIVATE(vm) \ # define QEMU_DOMAIN_PRIVATE(vm) \
...@@ -1063,4 +1066,7 @@ qemuDomainDiskCachemodeFlags(int cachemode, ...@@ -1063,4 +1066,7 @@ qemuDomainDiskCachemodeFlags(int cachemode,
char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv); char * qemuDomainGetManagedPRSocketPath(qemuDomainObjPrivatePtr priv);
unsigned int qemuDomainStorageIdNew(qemuDomainObjPrivatePtr priv);
void qemuDomainStorageIdReset(qemuDomainObjPrivatePtr priv);
#endif /* __QEMU_DOMAIN_H__ */ #endif /* __QEMU_DOMAIN_H__ */
...@@ -7157,6 +7157,9 @@ void qemuProcessStop(virQEMUDriverPtr driver, ...@@ -7157,6 +7157,9 @@ void qemuProcessStop(virQEMUDriverPtr driver,
/* clear all private data entries which are no longer needed */ /* clear all private data entries which are no longer needed */
qemuDomainObjPrivateDataClear(priv); qemuDomainObjPrivateDataClear(priv);
/* reset node name allocator */
qemuDomainStorageIdReset(priv);
/* The "release" hook cleans up additional resources */ /* The "release" hook cleans up additional resources */
if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) { if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
char *xml = qemuDomainDefFormatXML(driver, vm->def, 0); char *xml = qemuDomainDefFormatXML(driver, vm->def, 0);
......
...@@ -233,6 +233,7 @@ ...@@ -233,6 +233,7 @@
<flag name='isa-serial'/> <flag name='isa-serial'/>
<flag name='dump-completed'/> <flag name='dump-completed'/>
<flag name='hda-output'/> <flag name='hda-output'/>
<flag name='blockdev'/>
</qemuCaps> </qemuCaps>
<devices> <devices>
<device alias='rng0'/> <device alias='rng0'/>
...@@ -258,6 +259,7 @@ ...@@ -258,6 +259,7 @@
<channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/> <channelTargetDir path='/var/lib/libvirt/qemu/channel/target/domain-1-upstream'/>
<chardevStdioLogd/> <chardevStdioLogd/>
<allowReboot value='yes'/> <allowReboot value='yes'/>
<nodename index='123'/>
<blockjobs active='no'/> <blockjobs active='no'/>
<domain type='kvm' id='1'> <domain type='kvm' id='1'>
<name>upstream</name> <name>upstream</name>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册