]> xenbits.xensource.com Git - libvirt.git/commitdiff
xen-xm: fix data loss in domain edit
authorPhilipp Hahn <hahn@univention.de>
Mon, 6 Feb 2012 13:09:12 +0000 (14:09 +0100)
committerEric Blake <eblake@redhat.com>
Mon, 6 Feb 2012 22:14:36 +0000 (15:14 -0700)
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>
src/xen/xm_internal.c

index 02a0e1da2a33f72b202da6050bd619b941dfd11b..3cb315a6c6da56104901e3fc2d28669bcfcc30f8 100644 (file)
@@ -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);