This also fixes issue of removing both new and old cfg files
if unlinking old autostart link fails.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy(a)virtuozzo.com>
---
src/qemu/qemu_domain.c | 27 +++++++++++++++++++++++++++
src/qemu/qemu_domain.h | 5 +++++
src/qemu/qemu_driver.c | 39 ++++++---------------------------------
3 files changed, 38 insertions(+), 33 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 3dfa71650d..ff48744f39 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -16722,3 +16722,30 @@ qemuDomainInitializePflashStorageSource(virDomainObjPtr vm)
return 0;
}
+
+
+int
+qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg,
+ const char *name,
+ bool reportError)
+{
+ g_autofree char *cfg_file = NULL;
+ g_autofree char *autostart_link = NULL;
+
+ cfg_file = virDomainConfigFile(cfg->configDir, name);
+ autostart_link = virDomainConfigFile(cfg->autostartDir, name);
+
+ if (virFileExists(cfg_file) &&
+ unlink(cfg_file) < 0)
+ VIR_WARN("Failed to unlink '%s'", cfg_file);
+
+ if (virFileIsLink(autostart_link) == 1 &&
+ unlink(autostart_link) < 0) {
+ if (reportError) {
+ virReportError(errno, _("Failed to unlink '%s'"),
autostart_link);
+ return -1;
+ }
+ }
+
+ return 0;
+}
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index f8fb48f2ff..5a59d04f24 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -1263,3 +1263,8 @@ qemuDomainMakeCPUMigratable(virCPUDefPtr cpu);
int
qemuDomainInitializePflashStorageSource(virDomainObjPtr vm);
+
+int
+qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg,
+ const char *name,
+ bool reportError);
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 35ade1ef37..d2226fcf45 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -21999,25 +21999,7 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
new_dom_name = NULL;
if (virDomainDefSave(vm->def, driver->xmlopt, cfg->configDir) < 0)
- goto rollback;
-
- if (virFileExists(old_dom_cfg_file) &&
- unlink(old_dom_cfg_file) < 0) {
- virReportSystemError(errno,
- _("cannot remove old domain config file %s"),
- old_dom_cfg_file);
- goto rollback;
- }
-
- if (vm->autostart) {
- if (virFileIsLink(old_dom_autostart_link) &&
- unlink(old_dom_autostart_link) < 0) {
- virReportSystemError(errno,
- _("Failed to delete symlink '%s'"),
- old_dom_autostart_link);
- goto rollback;
- }
- }
+ goto cleanup;
event_new = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_DEFINED,
@@ -22025,25 +22007,16 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
ret = 0;
cleanup:
- virObjectEventStateQueue(driver->domainEventState, event_old);
- virObjectEventStateQueue(driver->domainEventState, event_new);
- return ret;
-
- rollback:
- if (old_dom_name) {
+ if (old_dom_name && ret < 0) {
new_dom_name = vm->def->name;
vm->def->name = old_dom_name;
old_dom_name = NULL;
}
- if (virFileExists(new_dom_cfg_file))
- unlink(new_dom_cfg_file);
-
- if (vm->autostart &&
- virFileExists(new_dom_autostart_link))
- unlink(new_dom_autostart_link);
-
- goto cleanup;
+ qemuDomainNamePathsCleanup(cfg, ret < 0 ? new_dom_name : old_dom_name, false);
+ virObjectEventStateQueue(driver->domainEventState, event_old);
+ virObjectEventStateQueue(driver->domainEventState, event_new);
+ return ret;
}
static int qemuDomainRename(virDomainPtr dom,
--
2.23.0