[PATCH 0/8] qemu: support renaming domains with snapshots/checkpoints

Nikolay Shirokovskiy (8): qemu: remove duplicate code for removing remnant files qemu: qemuDomainRenameCallback: fix sending false undefined event qemu: rename: support renaming snapshots directory qemu: rename: support renaming checkpoints directory qemu: update name on reverting from snapshot qemu: rename: remove snapshot/checkpoint restriction qemu: refactor qemuDomainDefineXMLFlags qemu: qemu: remove remnant files on define src/qemu/qemu_checkpoint.c | 2 +- src/qemu/qemu_checkpoint.h | 6 ++ src/qemu/qemu_domain.c | 41 ++++++++++ src/qemu/qemu_domain.h | 5 ++ src/qemu/qemu_driver.c | 161 ++++++++++++++++++++++--------------- src/qemu/qemu_migration.c | 3 + 6 files changed, 153 insertions(+), 65 deletions(-) -- 2.23.0

This also fixes issue of removing both new and old cfg files if unlinking old autostart link fails. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@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

If saving cfg file fails we send false undefine event currently. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_driver.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index d2226fcf45..70cad837f2 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -21989,10 +21989,6 @@ qemuDomainRenameCallback(virDomainObjPtr vm, } } - event_old = virDomainEventLifecycleNewFromObj(vm, - VIR_DOMAIN_EVENT_UNDEFINED, - VIR_DOMAIN_EVENT_UNDEFINED_RENAMED); - /* Switch name in domain definition. */ old_dom_name = vm->def->name; vm->def->name = new_dom_name; @@ -22001,9 +21997,15 @@ qemuDomainRenameCallback(virDomainObjPtr vm, if (virDomainDefSave(vm->def, driver->xmlopt, cfg->configDir) < 0) goto cleanup; + event_old = virDomainEventLifecycleNew(vm->def->id, old_dom_name, vm->def->uuid, + VIR_DOMAIN_EVENT_UNDEFINED, + VIR_DOMAIN_EVENT_UNDEFINED_RENAMED); event_new = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_DEFINED, VIR_DOMAIN_EVENT_DEFINED_RENAMED); + virObjectEventStateQueue(driver->domainEventState, event_old); + virObjectEventStateQueue(driver->domainEventState, event_new); + ret = 0; cleanup: @@ -22014,8 +22016,6 @@ qemuDomainRenameCallback(virDomainObjPtr vm, } qemuDomainNamePathsCleanup(cfg, ret < 0 ? new_dom_name : old_dom_name, false); - virObjectEventStateQueue(driver->domainEventState, event_old); - virObjectEventStateQueue(driver->domainEventState, event_new); return ret; } -- 2.23.0

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- 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 ff48744f39..0c4cb09158 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -16731,9 +16731,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) @@ -16747,5 +16749,10 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg, } } + if (virFileIsDir(snap_dir) && virFileDeleteTree(snap_dir) < 0) { + if (reportError) + return -1; + } + return 0; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 70cad837f2..6bde4d3de0 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -21938,6 +21938,30 @@ qemuDomainSetUserPassword(virDomainPtr dom, } +struct qemuDomainMomentWriteMetadataData { + virQEMUDriverPtr driver; + virDomainObjPtr vm; +}; + + +static int +qemuDomainSnapshotWriteMetadataIter(void *payload, + const void *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, @@ -21955,6 +21979,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); @@ -21994,6 +22022,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; -- 2.23.0

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_checkpoint.c | 2 +- src/qemu/qemu_checkpoint.h | 6 ++++++ src/qemu/qemu_domain.c | 7 +++++++ src/qemu/qemu_driver.c | 23 +++++++++++++++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c index c06bfe6a21..c13a005403 100644 --- a/src/qemu/qemu_checkpoint.c +++ b/src/qemu/qemu_checkpoint.c @@ -76,7 +76,7 @@ qemuCheckpointObjFromCheckpoint(virDomainObjPtr vm, } -static int +int qemuCheckpointWriteMetadata(virDomainObjPtr vm, virDomainMomentObjPtr checkpoint, virDomainXMLOptionPtr xmlopt, diff --git a/src/qemu/qemu_checkpoint.h b/src/qemu/qemu_checkpoint.h index cf1e9e46cb..10e1198897 100644 --- a/src/qemu/qemu_checkpoint.h +++ b/src/qemu/qemu_checkpoint.h @@ -80,3 +80,9 @@ qemuCheckpointDiscardDiskBitmaps(virStorageSourcePtr src, virJSONValuePtr actions, const char *diskdst, GSList **reopenimages); + +int +qemuCheckpointWriteMetadata(virDomainObjPtr vm, + virDomainMomentObjPtr checkpoint, + virDomainXMLOptionPtr xmlopt, + const char *checkpointDir); diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c index 0c4cb09158..45dbc1c7da 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -16732,10 +16732,12 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg, g_autofree char *cfg_file = NULL; g_autofree char *autostart_link = NULL; g_autofree char *snap_dir = NULL; + g_autofree char *chk_dir = NULL; cfg_file = virDomainConfigFile(cfg->configDir, name); autostart_link = virDomainConfigFile(cfg->autostartDir, name); snap_dir = g_strdup_printf("%s/%s", cfg->snapshotDir, name); + chk_dir = g_strdup_printf("%s/%s", cfg->checkpointDir, name); if (virFileExists(cfg_file) && unlink(cfg_file) < 0) @@ -16754,5 +16756,10 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg, return -1; } + if (virFileIsDir(chk_dir) && virFileDeleteTree(chk_dir) < 0) { + if (reportError) + return -1; + } + return 0; } diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6bde4d3de0..288067dd67 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -21962,6 +21962,24 @@ qemuDomainSnapshotWriteMetadataIter(void *payload, } +static int +qemuDomainCheckpointWriteMetadataIter(void *payload, + const void *name G_GNUC_UNUSED, + void *opaque) +{ + struct qemuDomainMomentWriteMetadataData *data = opaque; + virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(data->driver); + int ret; + + ret = qemuCheckpointWriteMetadata(data->vm, payload, + data->driver->xmlopt, + cfg->snapshotDir); + + virObjectUnref(cfg); + return ret; +} + + static int qemuDomainRenameCallback(virDomainObjPtr vm, const char *new_name, @@ -22027,6 +22045,11 @@ qemuDomainRenameCallback(virDomainObjPtr vm, &data) < 0) goto cleanup; + if (virDomainCheckpointForEach(vm->checkpoints, + qemuDomainCheckpointWriteMetadataIter, + &data) < 0) + goto cleanup; + if (virDomainDefSave(vm->def, driver->xmlopt, cfg->configDir) < 0) goto cleanup; -- 2.23.0

If domain name is changed since snapshot we need to update it to current in config taken from snapshot. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_driver.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 288067dd67..875b665cdf 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -16326,6 +16326,11 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, driver->xmlopt, priv->qemuCaps, true); if (!config) goto endjob; + + if (STRNEQ(config->name, vm->def->name)) { + VIR_FREE(config->name); + config->name = g_strdup(vm->def->name); + } } if (snap->def->inactiveDom) { @@ -16333,6 +16338,11 @@ qemuDomainRevertToSnapshot(virDomainSnapshotPtr snapshot, driver->xmlopt, priv->qemuCaps, true); if (!inactiveConfig) goto endjob; + + if (STRNEQ(inactiveConfig->name, vm->def->name)) { + VIR_FREE(inactiveConfig->name); + inactiveConfig->name = g_strdup(vm->def->name); + } } else { /* Inactive domain definition is missing: * - either this is an old active snapshot and we need to copy the -- 2.23.0

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_driver.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 875b665cdf..4553ebfb80 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -22128,18 +22128,6 @@ static int qemuDomainRename(virDomainPtr dom, goto endjob; } - if (virDomainSnapshotObjListNum(vm->snapshots, NULL, 0) > 0) { - virReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("cannot rename domain with snapshots")); - goto endjob; - } - - if (virDomainListCheckpoints(vm->checkpoints, NULL, dom, NULL, flags) > 0) { - virReportError(VIR_ERR_OPERATION_INVALID, - "%s", _("cannot rename domain with checkpoints")); - goto endjob; - } - if (virDomainObjListRename(driver->domains, vm, new_name, flags, qemuDomainRenameCallback, driver) < 0) goto endjob; -- 2.23.0

Let's move objlist restoring to cleanup section so that we can handle failure of actions between virDomainObjListAdd and virDomainDefSave. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_driver.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4553ebfb80..e1b9240893 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7630,7 +7630,7 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, if (!(def = virDomainDefParseString(xml, driver->xmlopt, NULL, parse_flags))) - goto cleanup; + return NULL; if (virXMLCheckIllegalChars("name", def->name, "\n") < 0) goto cleanup; @@ -7644,10 +7644,23 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, goto cleanup; def = NULL; + if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def, + driver->xmlopt, cfg->configDir) < 0) + goto cleanup; + vm->persistent = 1; - if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def, - driver->xmlopt, cfg->configDir) < 0) { + event = virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT_DEFINED, + !oldDef ? + VIR_DOMAIN_EVENT_DEFINED_ADDED : + VIR_DOMAIN_EVENT_DEFINED_UPDATED); + + VIR_INFO("Creating domain '%s'", vm->def->name); + dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id); + + cleanup: + if (!def) { if (oldDef) { /* There is backup so this VM was defined before. * Just restore the backup. */ @@ -7660,22 +7673,9 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, } else { /* Brand new domain. Remove it */ VIR_INFO("Deleting domain '%s'", vm->def->name); - vm->persistent = 0; qemuDomainRemoveInactiveJob(driver, vm); } - goto cleanup; } - - event = virDomainEventLifecycleNewFromObj(vm, - VIR_DOMAIN_EVENT_DEFINED, - !oldDef ? - VIR_DOMAIN_EVENT_DEFINED_ADDED : - VIR_DOMAIN_EVENT_DEFINED_UPDATED); - - VIR_INFO("Creating domain '%s'", vm->def->name); - dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id); - - cleanup: virDomainDefFree(oldDef); virDomainDefFree(def); virDomainObjEndAPI(&vm); -- 2.23.0

On 03.03.2020 11:19, Nikolay Shirokovskiy wrote:
Let's move objlist restoring to cleanup section so that we can handle failure of actions between virDomainObjListAdd and virDomainDefSave.
Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_driver.c | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 4553ebfb80..e1b9240893 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7630,7 +7630,7 @@ qemuDomainDefineXMLFlags(virConnectPtr conn,
if (!(def = virDomainDefParseString(xml, driver->xmlopt, NULL, parse_flags))) - goto cleanup; + return NULL;
if (virXMLCheckIllegalChars("name", def->name, "\n") < 0) goto cleanup; @@ -7644,10 +7644,23 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, goto cleanup; def = NULL;
+ if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def, + driver->xmlopt, cfg->configDir) < 0) + goto cleanup; + vm->persistent = 1;
- if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def, - driver->xmlopt, cfg->configDir) < 0) { + event = virDomainEventLifecycleNewFromObj(vm, + VIR_DOMAIN_EVENT_DEFINED, + !oldDef ? + VIR_DOMAIN_EVENT_DEFINED_ADDED : + VIR_DOMAIN_EVENT_DEFINED_UPDATED); + + VIR_INFO("Creating domain '%s'", vm->def->name); + dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id); + + cleanup: + if (!def) {
if (!dom && !def) Nikolay
if (oldDef) { /* There is backup so this VM was defined before. * Just restore the backup. */ @@ -7660,22 +7673,9 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, } else { /* Brand new domain. Remove it */ VIR_INFO("Deleting domain '%s'", vm->def->name); - vm->persistent = 0; qemuDomainRemoveInactiveJob(driver, vm); } - goto cleanup; } - - event = virDomainEventLifecycleNewFromObj(vm, - VIR_DOMAIN_EVENT_DEFINED, - !oldDef ? - VIR_DOMAIN_EVENT_DEFINED_ADDED : - VIR_DOMAIN_EVENT_DEFINED_UPDATED); - - VIR_INFO("Creating domain '%s'", vm->def->name); - dom = virGetDomain(conn, vm->def->name, vm->def->uuid, vm->def->id); - - cleanup: virDomainDefFree(oldDef); virDomainDefFree(def); virDomainObjEndAPI(&vm);

Due to failures on previous rename/undefine we can already have autolink etc files for the domain to be defined. Remove them. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> --- src/qemu/qemu_driver.c | 6 ++++++ src/qemu/qemu_migration.c | 3 +++ 2 files changed, 9 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index e1b9240893..f534f8ec99 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -7644,6 +7644,9 @@ qemuDomainDefineXMLFlags(virConnectPtr conn, goto cleanup; def = NULL; + if (!oldDef && qemuDomainNamePathsCleanup(cfg, vm->def->name, true) < 0) + goto cleanup; + if (virDomainDefSave(vm->newDef ? vm->newDef : vm->def, driver->xmlopt, cfg->configDir) < 0) goto cleanup; @@ -22030,6 +22033,9 @@ qemuDomainRenameCallback(virDomainObjPtr vm, vm->def->name))) goto cleanup; + if (qemuDomainNamePathsCleanup(cfg, new_name, true) < 0) + goto cleanup; + if (vm->autostart) { if (!(new_dom_autostart_link = virDomainConfigFile(cfg->autostartDir, new_dom_name)) || diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 3fc5388d6a..2e49e466f2 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -4915,6 +4915,9 @@ qemuMigrationDstPersist(virQEMUDriverPtr driver, priv->qemuCaps))) goto error; + if (!oldDef && qemuDomainNamePathsCleanup(cfg, vmdef->name, true) < 0) + goto error; + if (virDomainDefSave(vmdef, driver->xmlopt, cfg->configDir) < 0 && !ignoreSaveError) goto error; -- 2.23.0

ping On 03.03.2020 11:19, Nikolay Shirokovskiy wrote:
Nikolay Shirokovskiy (8): qemu: remove duplicate code for removing remnant files qemu: qemuDomainRenameCallback: fix sending false undefined event qemu: rename: support renaming snapshots directory qemu: rename: support renaming checkpoints directory qemu: update name on reverting from snapshot qemu: rename: remove snapshot/checkpoint restriction qemu: refactor qemuDomainDefineXMLFlags qemu: qemu: remove remnant files on define
src/qemu/qemu_checkpoint.c | 2 +- src/qemu/qemu_checkpoint.h | 6 ++ src/qemu/qemu_domain.c | 41 ++++++++++ src/qemu/qemu_domain.h | 5 ++ src/qemu/qemu_driver.c | 161 ++++++++++++++++++++++--------------- src/qemu/qemu_migration.c | 3 + 6 files changed, 153 insertions(+), 65 deletions(-)
participants (2)
-
Nikolay Shirokovskiy
-
nshirokovskiy