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 <nshirokovskiy@virtuozzo.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
This commit is contained in:
Nikolay Shirokovskiy 2020-11-03 09:50:44 +03:00
parent 1f209eac1d
commit 4770a96c66
2 changed files with 40 additions and 0 deletions

View 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;
}

View 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;