On Mon, Feb 18, 2013 at 15:38:45 +0100, Michal Privoznik wrote:
If migratioin fails because of whatever reason and we've
pre-created any disks, we should remove them instead of letting
them lying around. Moreover, we need to save the disks sources
into domain status file in case libvirtd gets restarted.
---
src/qemu/qemu_domain.c | 30 ++++++++++++++++++++++++++++--
src/qemu/qemu_domain.h | 2 ++
src/qemu/qemu_migration.c | 13 +++++++++++++
src/qemu/qemu_process.c | 8 ++++++++
4 files changed, 51 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 8df2739..66e0d82 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -231,10 +231,15 @@ error:
static void qemuDomainObjPrivateFree(void *data)
{
+ size_t i;
int or unsigned would also work :-)
qemuDomainObjPrivatePtr priv = data;
virObjectUnref(priv->qemuCaps);
+ for (i = 0; i < priv->nnbdDisk; i++)
+ VIR_FREE(priv->nbdDisk[i]);
+ VIR_FREE(priv->nbdDisk);
+
qemuDomainPCIAddressSetFree(priv->pciaddrs);
virDomainChrSourceDefFree(priv->monConfig);
qemuDomainObjFreeJob(priv);
@@ -263,6 +268,7 @@ static int qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void
*data)
qemuDomainObjPrivatePtr priv = data;
const char *monitorpath;
enum qemuDomainJob job;
+ size_t i;
int or unsigned would also work :-)
/* priv->monitor_chr is set only for qemu */
if (priv->monConfig) {
...
@@ -473,6 +484,21 @@ static int
qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data)
priv->fakeReboot = virXPathBoolean("boolean(./fakereboot)", ctxt) ==
1;
+ n = virXPathNodeSet("./nbdDisk/disk", ctxt, &nodes);
+ if (n < 0)
+ goto error;
+ if (n) {
+ if (VIR_REALLOC_N(priv->nbdDisk, n) < 0) {
+ virReportOOMError();
+ goto error;
+ }
+ priv->nnbdDisk = n;
+
+ for (i = 0; i < n; i++)
+ if (!(priv->nbdDisk[i] = virXMLPropString(nodes[i], "src")))
+ goto error;
Ouch, for some reason I though virXMLPropString does not strdup the
attribute value. But looking at xmlGetProp (which virXMLPropString is
just a wrapper for) the caller is responsible for freeing the memory.
Thus your code is correct and we have a lot of memory leaks in our XML
parsers :-(
+ }
+
return 0;
error:
ACK
Jirka