aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPhilipp Hahn <hahn@univention.de>2012-02-06 14:09:12 +0100
committerEric Blake <eblake@redhat.com>2012-02-06 15:14:36 -0700
commit700102c992b596bb9d2002c9c033ed006ad6f188 (patch)
treedbabee56e7e2ac5e1c39c9f66415a50c3dfd7cba
parentseclabel: make code and RNG match (diff)
downloadlibvirt-700102c992b596bb9d2002c9c033ed006ad6f188.tar.gz
libvirt-700102c992b596bb9d2002c9c033ed006ad6f188.tar.bz2
libvirt-700102c992b596bb9d2002c9c033ed006ad6f188.zip
xen-xm: fix data loss in domain edit
On CentOS5: If "virsh edit $DOM" is used and an error happens (for example changing any live cycle action to a non-existing value), libvirt forgets that $DOM exists, since it is already removed from the internal hash tables, which are used for domain lookup. In once case (unreproducible) even the persistent configuration /etc/xen/$DOM was deleted. Instead of using the compound function xenXMConfigSaveFile() explicitly use xenFomatXM() and virConfWriteFile() to distinguish between a failure in converting the libvirt definition to the xen-xm format and a problem when writing the file. Signed-off-by: Philipp Hahn <hahn@univention.de>
-rw-r--r--src/xen/xm_internal.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/src/xen/xm_internal.c b/src/xen/xm_internal.c
index 02a0e1da2..3cb315a6c 100644
--- a/src/xen/xm_internal.c
+++ b/src/xen/xm_internal.c
@@ -1073,6 +1073,7 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
char *filename;
const char *oldfilename;
virDomainDefPtr def = NULL;
+ virConfPtr conf = NULL;
xenXMConfCachePtr entry = NULL;
xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
@@ -1101,6 +1102,9 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
return (NULL);
}
+ if (!(conf = xenFormatXM(conn, def, priv->xendConfigVersion)))
+ goto error;
+
/*
* check that if there is another domain defined with the same uuid
* it has the same name
@@ -1156,7 +1160,7 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
if (!(filename = virFileBuildPath(priv->configDir, def->name, NULL)))
goto error;
- if (xenXMConfigSaveFile(conn, filename, def) < 0)
+ if (virConfWriteFile(filename, conf) < 0)
goto error;
if (VIR_ALLOC(entry) < 0) {
@@ -1199,6 +1203,7 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml)
if (entry)
VIR_FREE(entry->filename);
VIR_FREE(entry);
+ virConfFree(conf);
virDomainDefFree(def);
xenUnifiedUnlock(priv);
return (NULL);