diff options
author | Philipp Hahn <hahn@univention.de> | 2012-02-06 14:09:12 +0100 |
---|---|---|
committer | Eric Blake <eblake@redhat.com> | 2012-02-06 15:14:36 -0700 |
commit | 700102c992b596bb9d2002c9c033ed006ad6f188 (patch) | |
tree | dbabee56e7e2ac5e1c39c9f66415a50c3dfd7cba | |
parent | seclabel: make code and RNG match (diff) | |
download | libvirt-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.c | 7 |
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); |