[libvirt] [PATCH v3] qemu: fix broken autostart symlink after renaming domain.
Julio Faracco
jcfaracco at gmail.com
Tue Jul 17 03:54:57 UTC 2018
Changelog:
V1: The patch was automatically rejected due to some tabs
automatically added by my VIM editor.
V2: Tabs changed by spaces.
V3: Rebasing the patch considering the Erik's suggestions.
--
Julio Cesar Faracco
Em ter, 17 de jul de 2018 às 00:52, Julio Faracco
<jcfaracco at gmail.com> escreveu:
>
> If a domain is configured to start on boot, it has a symlink to the
> domain definition inside the autostart directory. If you rename this
> domain, the definition is renamed too. The symlink need to be pointed to
> this renamed file. This commit recreates the symlink after renaming the
> XML file.
>
> Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1594985
>
> Signed-off-by: Julio Faracco <jcfaracco at gmail.com>
> ---
> src/qemu/qemu_driver.c | 42 ++++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 42 insertions(+)
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 8fae46370e..6bbea324b9 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -20914,6 +20914,8 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
> char *old_dom_name = NULL;
> char *new_dom_cfg_file = NULL;
> char *old_dom_cfg_file = NULL;
> + char *new_dom_autostart_link = NULL;
> + char *old_dom_autostart_link = NULL;
>
> virCheckFlags(0, ret);
>
> @@ -20934,6 +20936,22 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
> vm->def->name)))
> goto cleanup;
>
> + if (vm->autostart) {
> + if (!(new_dom_autostart_link = virDomainConfigFile(cfg->autostartDir,
> + new_dom_name)) ||
> + !(old_dom_autostart_link = virDomainConfigFile(cfg->autostartDir,
> + vm->def->name)))
> + goto cleanup;
> +
> + if (virFileIsLink(old_dom_autostart_link) &&
> + unlink(old_dom_autostart_link) < 0) {
> + virReportSystemError(errno,
> + _("Failed to delete symlink '%s'"),
> + old_dom_autostart_link);
> + goto cleanup;
> + }
> + }
> +
> event_old = virDomainEventLifecycleNewFromObj(vm,
> VIR_DOMAIN_EVENT_UNDEFINED,
> VIR_DOMAIN_EVENT_UNDEFINED_RENAMED);
> @@ -20946,6 +20964,16 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
> if (virDomainSaveConfig(cfg->configDir, driver->caps, vm->def) < 0)
> goto rollback;
>
> +
> + if (vm->autostart) {
> + if (symlink(new_dom_cfg_file, new_dom_autostart_link) < 0) {
> + virReportSystemError(errno,
> + _("Failed to create symlink '%s to '%s'"),
> + new_dom_autostart_link, new_dom_cfg_file);
> + goto rollback;
> + }
> + }
> +
> if (virFileExists(old_dom_cfg_file) &&
> unlink(old_dom_cfg_file) < 0) {
> virReportSystemError(errno,
> @@ -20960,6 +20988,8 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
> ret = 0;
>
> cleanup:
> + VIR_FREE(old_dom_autostart_link);
> + VIR_FREE(new_dom_autostart_link);
> VIR_FREE(old_dom_cfg_file);
> VIR_FREE(new_dom_cfg_file);
> VIR_FREE(old_dom_name);
> @@ -20979,6 +21009,18 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
> if (virFileExists(new_dom_cfg_file))
> unlink(new_dom_cfg_file);
>
> + if (vm->autostart) {
> + if (virFileExists(new_dom_autostart_link))
> + unlink(new_dom_autostart_link);
> +
> + if (!virFileExists(old_dom_autostart_link) &&
> + symlink(old_dom_cfg_file, old_dom_autostart_link) < 0) {
> + virReportSystemError(errno,
> + _("Failed to create symlink '%s to '%s'"),
> + old_dom_autostart_link, old_dom_cfg_file);
> + }
> + }
> +
> goto cleanup;
> }
>
> --
> 2.17.1
>
More information about the libvir-list
mailing list