From 4770a96c6624640dbe09c5ee9d0167664507e8fd Mon Sep 17 00:00:00 2001 From: Nikolay Shirokovskiy Date: Tue, 3 Nov 2020 09:50:44 +0300 Subject: [PATCH] qemu: rename: support renaming snapshots directory This is basically just saves snapshots metadata on disk after name is changed in memory as path to domain snapshot directory depends on name. After that old snapshot directory is deleted with snapshot metadata files. Signed-off-by: Nikolay Shirokovskiy Reviewed-by: Daniel Henrique Barboza --- src/qemu/qemu_domain.c | 7 +++++++ src/qemu/qemu_driver.c | 33 +++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index b26a8d3f40..e287e31e36 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -11102,9 +11102,11 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg, { g_autofree char *cfg_file = NULL; g_autofree char *autostart_link = NULL; + g_autofree char *snap_dir = NULL; cfg_file = virDomainConfigFile(cfg->configDir, name); autostart_link = virDomainConfigFile(cfg->autostartDir, name); + snap_dir = g_strdup_printf("%s/%s", cfg->snapshotDir, name); if (virFileExists(cfg_file) && unlink(cfg_file) < 0) { @@ -11120,5 +11122,10 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg, return -1; } + if (virFileIsDir(snap_dir) && + virFileDeleteTree(snap_dir) < 0 && + !bestEffort) + return -1; + return 0; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b5f3178884..cb86f52364 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -19096,6 +19096,30 @@ qemuDomainSetUserPassword(virDomainPtr dom, } +struct qemuDomainMomentWriteMetadataData { + virQEMUDriverPtr driver; + virDomainObjPtr vm; +}; + + +static int +qemuDomainSnapshotWriteMetadataIter(void *payload, + const char *name G_GNUC_UNUSED, + void *opaque) +{ + struct qemuDomainMomentWriteMetadataData *data = opaque; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(data->driver); + int ret; + + ret = qemuDomainSnapshotWriteMetadata(data->vm, payload, + data->driver->xmlopt, + cfg->snapshotDir); + + virObjectUnref(cfg); + return ret; +} + + static int qemuDomainRenameCallback(virDomainObjPtr vm, const char *new_name, @@ -19114,6 +19138,10 @@ qemuDomainRenameCallback(virDomainObjPtr vm, g_autofree char *old_dom_cfg_file = NULL; g_autofree char *new_dom_autostart_link = NULL; g_autofree char *old_dom_autostart_link = NULL; + struct qemuDomainMomentWriteMetadataData data = { + .driver = driver, + .vm = vm, + }; virCheckFlags(0, ret); @@ -19153,6 +19181,11 @@ qemuDomainRenameCallback(virDomainObjPtr vm, vm->def->name = new_dom_name; new_dom_name = NULL; + if (virDomainSnapshotForEach(vm->snapshots, + qemuDomainSnapshotWriteMetadataIter, + &data) < 0) + goto cleanup; + if (virDomainDefSave(vm->def, driver->xmlopt, cfg->configDir) < 0) goto cleanup;