Fix autostart flag when loading running domains

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>
This commit is contained in:
Michael Chapman 2011-06-13 13:05:45 +10:00 committed by Eric Blake
parent 4cff75a41b
commit 30697181dc
2 changed files with 13 additions and 9 deletions

View File

@ -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....]

View 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 ((dom = virDomainFindByUUID(doms, def->uuid))) {
VIR_FREE(configFile);
virDomainDefFree(def);
return dom;
}
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 (!(dom = virDomainAssignDef(caps, doms, def, false)))
goto error;