]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: rename: support renaming snapshots directory
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Tue, 3 Nov 2020 06:50:44 +0000 (09:50 +0300)
committerNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Fri, 13 Nov 2020 11:49:50 +0000 (14:49 +0300)
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 <nshirokovskiy@virtuozzo.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/qemu/qemu_domain.c
src/qemu/qemu_driver.c

index b26a8d3f40c08183ca3cc7ad90db16d28d41bb7a..e287e31e3681385541d6dd63421f0a558ca7c1b4 100644 (file)
@@ -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;
 }
index b5f31788849f9dcedf482b505b578cd17e3b5eb6..cb86f52364460c25300320f6d18c4d49cc3aa819 100644 (file)
@@ -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;