Fix autostart flag when loading running domains
authorMichael Chapman <mike@very.puzzling.org>
Mon, 13 Jun 2011 03:05:45 +0000 (13:05 +1000)
committerEric Blake <eblake@redhat.com>
Tue, 14 Jun 2011 20:21:23 +0000 (14:21 -0600)
Drivers load running persistent and transient domain configs before
inactive persistent domain configs, however only the latter would set a
domain's autostart flag. This mismatch between the loaded and on-disk
state could later cause problems with "virsh autostart":

  # virsh autostart example
  error: Failed to mark domain example as autostarted
  error: Failed to create symlink '/etc/libvirt/qemu/autostart/example.xml to '/etc/libvirt/qemu/example.xml': File exists

This patch ensures the autostart flag is set correctly even when the
domain is already defined.

Fixes:

  https://bugzilla.redhat.com/show_bug.cgi?id=632100
  https://bugzilla.redhat.com/show_bug.cgi?id=675319

Signed-off-by: Michael Chapman <mike@very.puzzling.org>

AUTHORS
src/conf/domain_conf.c

diff --git a/AUTHORS b/AUTHORS
index 63661b1..dbc00c7 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -175,6 +175,7 @@ Patches have also been contributed by:
   Heath Petersen       <HeathPetersen@Kandre.com>
   Neil Wilson          <neil@aldur.co.uk>
   Ohad Levy            <ohadlevy@gmail.com>
+  Michael Chapman      <mike@very.puzzling.org>
 
   [....send patches to get your name here....]
 
index 65d4f89..be5267b 100644 (file)
@@ -9862,21 +9862,24 @@ static virDomainObjPtr virDomainLoadConfig(virCapsPtr caps,
                                       VIR_DOMAIN_XML_INACTIVE)))
         goto error;
 
-    /* if the domain is already in our hashtable, we don't need to do
-     * anything further
+    if ((autostartLink = virDomainConfigFile(autostartDir, name)) == NULL)
+        goto error;
+
+    if ((autostart = virFileLinkPointsTo(autostartLink, configFile)) < 0)
+        goto error;
+
+    /* if the domain is already in our hashtable, we only need to
+     * update the autostart flag
      */
     if ((dom = virDomainFindByUUID(doms, def->uuid))) {
+        dom->autostart = autostart;
+
         VIR_FREE(configFile);
+        VIR_FREE(autostartLink);
         virDomainDefFree(def);
         return dom;
     }
 
-    if ((autostartLink = virDomainConfigFile(autostartDir, name)) == NULL)
-        goto error;
-
-    if ((autostart = virFileLinkPointsTo(autostartLink, configFile)) < 0)
-        goto error;
-
     if (!(dom = virDomainAssignDef(caps, doms, def, false)))
         goto error;