[PATCH 00/10] qemu: Snapshot and saveimage related refactors (background snapshot saga part 2)
This series fixes up some code (mostly removes unneeded) 'driver' argument and fixes control flow in some snapshot and save image related functions. This series also contains 2 patches necromanced from the original attempt to add background snapshot from Nikolay. Nikolay Shirokovskiy (2): qemu: snapshot: Don't overwrite 'ret' in qemuSnapshotCreateActiveExternal qemu: snapshot: Check earlier if memory snapshot is possible Peter Krempa (8): qemuHotplugAttachDBusVMState: Remove 'driver' argument qemuMigrationSrcToLegacyFile: Remove 'driver' argument qemuDomainEventEmitJobCompleted: Remove 'driver' argument qemuMigrationSrcToSparseFile: Remove 'driver' argument qemuMigrationSrcToFile: Remove 'driver' argument qemuSaveImageCreateFd: Remove 'driver' argument qemuSaveImageCreate: Remove 'driver' argument virQEMUSaveDataNew: Refactor cleanup src/qemu/qemu_backup.c | 2 +- src/qemu/qemu_domainjob.c | 6 +++--- src/qemu/qemu_domainjob.h | 3 +-- src/qemu/qemu_driver.c | 4 ++-- src/qemu/qemu_hotplug.c | 6 ++---- src/qemu/qemu_hotplug.h | 3 +-- src/qemu/qemu_migration.c | 36 ++++++++++++++++++------------------ src/qemu/qemu_migration.h | 5 ++--- src/qemu/qemu_saveimage.c | 27 ++++++++++++--------------- src/qemu/qemu_saveimage.h | 3 +-- src/qemu/qemu_snapshot.c | 22 ++++++++++++---------- 11 files changed, 55 insertions(+), 62 deletions(-) -- 2.52.0
From: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> Both qemuSaveImageCreate and qemuSnapshotCreateActiveExternalDisks follow the usual convention of returning 0 on success and -1 on error so there's no need store the values in 'ret'. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_snapshot.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 5b0b52e2ba..5ceaff3554 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1756,9 +1756,9 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driver, if (!(snap_params = qemuMigrationParamsNew())) goto cleanup; - if ((ret = qemuSaveImageCreate(driver, vm, snapdef->memorysnapshotfile, - data, compressor, snap_params, 0, - VIR_ASYNC_JOB_SNAPSHOT)) < 0) + if (qemuSaveImageCreate(driver, vm, snapdef->memorysnapshotfile, + data, compressor, snap_params, 0, + VIR_ASYNC_JOB_SNAPSHOT) < 0) goto cleanup; /* the memory image was created, remove it on errors */ @@ -1775,9 +1775,9 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driver, qemuSnapshotCreateActiveExternalDisksManual(vm, snap, VIR_ASYNC_JOB_SNAPSHOT) < 0) goto cleanup; - if ((ret = qemuSnapshotCreateActiveExternalDisks(vm, snap, - blockNamedNodeData, flags, - VIR_ASYNC_JOB_SNAPSHOT)) < 0) + if (qemuSnapshotCreateActiveExternalDisks(vm, snap, + blockNamedNodeData, flags, + VIR_ASYNC_JOB_SNAPSHOT) < 0) goto cleanup; /* the snapshot is complete now */ -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> We pass in 'vm' which contains it in the private data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_hotplug.c | 6 ++---- src/qemu/qemu_hotplug.h | 3 +-- src/qemu/qemu_migration.c | 9 ++++----- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index fb426deb1a..fccbef5d0c 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -330,7 +330,6 @@ qemuHotplugWaitForTrayEject(virDomainObj *vm, /** * qemuHotplugAttachDBusVMState: - * @driver: QEMU driver object * @vm: domain object * @asyncJob: asynchronous job identifier * @@ -339,8 +338,7 @@ qemuHotplugWaitForTrayEject(virDomainObj *vm, * Returns: 0 on success, -1 on error. */ int -qemuHotplugAttachDBusVMState(virQEMUDriver *driver, - virDomainObj *vm, +qemuHotplugAttachDBusVMState(virDomainObj *vm, virDomainAsyncJob asyncJob) { qemuDomainObjPrivate *priv = vm->privateData; @@ -355,7 +353,7 @@ qemuHotplugAttachDBusVMState(virQEMUDriver *driver, return 0; } - if (!(props = qemuBuildDBusVMStateInfoProps(driver, vm))) + if (!(props = qemuBuildDBusVMStateInfoProps(priv->driver, vm))) return -1; if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) diff --git a/src/qemu/qemu_hotplug.h b/src/qemu/qemu_hotplug.h index fb0b5b6cd7..e6c90253e4 100644 --- a/src/qemu/qemu_hotplug.h +++ b/src/qemu/qemu_hotplug.h @@ -120,8 +120,7 @@ unsigned long long qemuDomainGetUnplugTimeout(virDomainObj *vm) ATTRIBUTE_MOCKABLE; int -qemuHotplugAttachDBusVMState(virQEMUDriver *driver, - virDomainObj *vm, +qemuHotplugAttachDBusVMState(virDomainObj *vm, virDomainAsyncJob asyncJob); int diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 1371742529..a64a98046a 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -4602,15 +4602,14 @@ qemuMigrationSrcContinue(virDomainObj *vm, static int -qemuMigrationSetDBusVMState(virQEMUDriver *driver, - virDomainObj *vm) +qemuMigrationSetDBusVMState(virDomainObj *vm) { qemuDomainObjPrivate *priv = vm->privateData; if (priv->dbusVMStateIds) { int rv; - if (qemuHotplugAttachDBusVMState(driver, vm, VIR_ASYNC_JOB_NONE) < 0) + if (qemuHotplugAttachDBusVMState(vm, VIR_ASYNC_JOB_NONE) < 0) return -1; if (qemuDomainObjEnterMonitorAsync(vm, VIR_ASYNC_JOB_NONE) < 0) @@ -5097,7 +5096,7 @@ qemuMigrationSrcRun(virQEMUDriver *driver, } } - if (qemuMigrationSetDBusVMState(driver, vm) < 0) + if (qemuMigrationSetDBusVMState(vm) < 0) goto error; /* Before EnterMonitor, since already qemuProcessStopCPUs does that */ @@ -7268,7 +7267,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, unsigned long saveMigBandwidth = priv->migMaxBandwidth; virErrorPtr orig_err = NULL; - if (qemuMigrationSetDBusVMState(driver, vm) < 0) + if (qemuMigrationSetDBusVMState(vm) < 0) return -1; /* Increase migration bandwidth to unlimited since target is a file. -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> We pass in 'vm' which contains it in the private data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_migration.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index a64a98046a..32afc788ad 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7142,8 +7142,7 @@ qemuMigrationProcessUnattended(virQEMUDriver *driver, static int -qemuMigrationSrcToLegacyFile(virQEMUDriver *driver, - virDomainObj *vm, +qemuMigrationSrcToLegacyFile(virDomainObj *vm, int fd, virCommand *compressor, virDomainAsyncJob asyncJob) @@ -7160,7 +7159,7 @@ qemuMigrationSrcToLegacyFile(virQEMUDriver *driver, * doesn't have to open() the file, so while we still have to * grant SELinux access, we can do it on fd and avoid cleanup * later, as well as skip futzing with cgroup. */ - if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, + if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, compressor ? pipeFD[1] : fd) < 0) goto cleanup; @@ -7294,7 +7293,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, qemuMigrationParamsCapEnabled(migParams, QEMU_MIGRATION_CAP_MAPPED_RAM)) rc = qemuMigrationSrcToSparseFile(driver, vm, path, fd, bypassCache, asyncJob); else - rc = qemuMigrationSrcToLegacyFile(driver, vm, *fd, compressor, asyncJob); + rc = qemuMigrationSrcToLegacyFile(vm, *fd, compressor, asyncJob); if (rc < 0) goto cleanup; -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> We pass in 'vm' which contains it in the private data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_backup.c | 2 +- src/qemu/qemu_domainjob.c | 6 +++--- src/qemu/qemu_domainjob.h | 3 +-- src/qemu/qemu_migration.c | 4 ++-- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c index c3566bcd57..44514d08fc 100644 --- a/src/qemu/qemu_backup.c +++ b/src/qemu/qemu_backup.c @@ -619,7 +619,7 @@ qemuBackupJobTerminate(virDomainObj *vm, vm->job->completed->status = jobstatus; vm->job->completed->errmsg = g_strdup(priv->backup->errmsg); - qemuDomainEventEmitJobCompleted(priv->driver, vm); + qemuDomainEventEmitJobCompleted(vm); } g_clear_pointer(&priv->backup, virDomainBackupDefFree); diff --git a/src/qemu/qemu_domainjob.c b/src/qemu/qemu_domainjob.c index afea1ea57a..e5236c9778 100644 --- a/src/qemu/qemu_domainjob.c +++ b/src/qemu/qemu_domainjob.c @@ -95,9 +95,9 @@ qemuDomainAsyncJobPhaseFromString(virDomainAsyncJob job, void -qemuDomainEventEmitJobCompleted(virQEMUDriver *driver, - virDomainObj *vm) +qemuDomainEventEmitJobCompleted(virDomainObj *vm) { + qemuDomainObjPrivate *priv = vm->privateData; virObjectEvent *event; virTypedParameterPtr params = NULL; int nparams = 0; @@ -113,7 +113,7 @@ qemuDomainEventEmitJobCompleted(virQEMUDriver *driver, } event = virDomainEventJobCompletedNewFromObj(vm, params, nparams); - virObjectEventStateQueue(driver->domainEventState, event); + virObjectEventStateQueue(priv->driver->domainEventState, event); } diff --git a/src/qemu/qemu_domainjob.h b/src/qemu/qemu_domainjob.h index c3de401aa5..bd6731abb5 100644 --- a/src/qemu/qemu_domainjob.h +++ b/src/qemu/qemu_domainjob.h @@ -66,8 +66,7 @@ const char *qemuDomainAsyncJobPhaseToString(virDomainAsyncJob job, int qemuDomainAsyncJobPhaseFromString(virDomainAsyncJob job, const char *phase); -void qemuDomainEventEmitJobCompleted(virQEMUDriver *driver, - virDomainObj *vm); +void qemuDomainEventEmitJobCompleted(virDomainObj *vm); void qemuDomainObjAbortAsyncJob(virDomainObj *obj); void qemuDomainObjSetJobPhase(virDomainObj *obj, diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index 32afc788ad..b2d67a1e74 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -4122,7 +4122,7 @@ qemuMigrationSrcComplete(virQEMUDriver *driver, VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED_MIGRATED); virObjectEventStateQueue(driver->domainEventState, event); - qemuDomainEventEmitJobCompleted(driver, vm); + qemuDomainEventEmitJobCompleted(vm); priv->preMigrationMemlock = 0; } @@ -7313,7 +7313,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, if (compressor && virCommandWait(compressor, NULL) < 0) goto cleanup; - qemuDomainEventEmitJobCompleted(driver, vm); + qemuDomainEventEmitJobCompleted(vm); ret = 0; cleanup: -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> We pass in 'vm' which contains it in the private data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_migration.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index b2d67a1e74..a0ec2f5ff3 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7204,14 +7204,14 @@ qemuMigrationSrcToLegacyFile(virDomainObj *vm, static int -qemuMigrationSrcToSparseFile(virQEMUDriver *driver, - virDomainObj *vm, +qemuMigrationSrcToSparseFile(virDomainObj *vm, const char *path, int *fd, bool bypassCache, virDomainAsyncJob asyncJob) { - g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + qemuDomainObjPrivate *priv = vm->privateData; + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(priv->driver); VIR_AUTOCLOSE directFd = -1; int directFlag = 0; bool needUnlink = false; @@ -7233,12 +7233,14 @@ qemuMigrationSrcToSparseFile(virQEMUDriver *driver, if (directFd < 0) return -1; - if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, directFd) < 0) + if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, + directFd) < 0) return -1; } - if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, *fd) < 0) + if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, + *fd) < 0) return -1; if (qemuDomainObjEnterMonitorAsync(vm, asyncJob) < 0) @@ -7252,7 +7254,8 @@ qemuMigrationSrcToSparseFile(virQEMUDriver *driver, /* Helper function called while vm is active. */ int -qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, +qemuMigrationSrcToFile(virQEMUDriver *driver G_GNUC_UNUSED, + virDomainObj *vm, const char *path, int *fd, virCommand *compressor, @@ -7291,7 +7294,7 @@ qemuMigrationSrcToFile(virQEMUDriver *driver, virDomainObj *vm, if (migParams && qemuMigrationParamsCapEnabled(migParams, QEMU_MIGRATION_CAP_MAPPED_RAM)) - rc = qemuMigrationSrcToSparseFile(driver, vm, path, fd, bypassCache, asyncJob); + rc = qemuMigrationSrcToSparseFile(vm, path, fd, bypassCache, asyncJob); else rc = qemuMigrationSrcToLegacyFile(vm, *fd, compressor, asyncJob); -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> We pass in 'vm' which contains it in the private data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_migration.c | 3 +-- src/qemu/qemu_migration.h | 5 ++--- src/qemu/qemu_saveimage.c | 2 +- 4 files changed, 5 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 3c6dd97c04..abe91b303f 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -3136,7 +3136,7 @@ doCoreDump(virQEMUDriver *driver, if (!(dump_params = qemuMigrationParamsNew())) goto cleanup; - if (qemuMigrationSrcToFile(driver, vm, path, &fd, compressor, + if (qemuMigrationSrcToFile(vm, path, &fd, compressor, dump_params, (dump_flags & VIR_DUMP_BYPASS_CACHE), VIR_ASYNC_JOB_DUMP) < 0) diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c index a0ec2f5ff3..8ae1e4e843 100644 --- a/src/qemu/qemu_migration.c +++ b/src/qemu/qemu_migration.c @@ -7254,8 +7254,7 @@ qemuMigrationSrcToSparseFile(virDomainObj *vm, /* Helper function called while vm is active. */ int -qemuMigrationSrcToFile(virQEMUDriver *driver G_GNUC_UNUSED, - virDomainObj *vm, +qemuMigrationSrcToFile(virDomainObj *vm, const char *path, int *fd, virCommand *compressor, diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h index 51341f453d..db03144207 100644 --- a/src/qemu/qemu_migration.h +++ b/src/qemu/qemu_migration.h @@ -238,15 +238,14 @@ qemuMigrationSrcIsAllowed(virDomainObj *vm, unsigned int flags); int -qemuMigrationSrcToFile(virQEMUDriver *driver, - virDomainObj *vm, +qemuMigrationSrcToFile(virDomainObj *vm, const char *path, int *fd, virCommand *compressor, qemuMigrationParams *migParams, bool bypassCache, virDomainAsyncJob asyncJob) - ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2) G_GNUC_WARN_UNUSED_RESULT; + ATTRIBUTE_NONNULL(1) G_GNUC_WARN_UNUSED_RESULT; int qemuMigrationSrcCancelUnattended(virDomainObj *vm, diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 1b68a09595..c5620c82c5 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -501,7 +501,7 @@ qemuSaveImageCreate(virQEMUDriver *driver, goto cleanup; /* Perform the migration */ - if (qemuMigrationSrcToFile(driver, vm, path, &fd, compressor, saveParams, + if (qemuMigrationSrcToFile(vm, path, &fd, compressor, saveParams, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE), asyncJob) < 0) goto cleanup; -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> We pass in 'vm' which contains it in the private data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_saveimage.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index c5620c82c5..a2e760c462 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -427,15 +427,15 @@ qemuSaveImageDecompressionStop(virCommand *cmd, static int -qemuSaveImageCreateFd(virQEMUDriver *driver, - virDomainObj *vm, +qemuSaveImageCreateFd(virDomainObj *vm, const char *path, virFileWrapperFd **wrapperFd, bool sparse, bool *needUnlink, unsigned int flags) { - g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + qemuDomainObjPrivate *priv = vm->privateData; + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(priv->driver); int ret = -1; VIR_AUTOCLOSE fd = -1; int directFlag = 0; @@ -458,7 +458,7 @@ qemuSaveImageCreateFd(virQEMUDriver *driver, if (fd < 0) return -1; - if (qemuSecuritySetImageFDLabel(driver->securityManager, vm->def, fd) < 0) + if (qemuSecuritySetImageFDLabel(priv->driver->securityManager, vm->def, fd) < 0) return -1; if (!sparse && !(*wrapperFd = virFileWrapperFdNew(&fd, path, wrapperFlags))) @@ -492,7 +492,7 @@ qemuSaveImageCreate(virQEMUDriver *driver, bool sparse = data->header.format == QEMU_SAVE_FORMAT_SPARSE; /* Obtain the file handle. */ - fd = qemuSaveImageCreateFd(driver, vm, path, &wrapperFd, sparse, &needUnlink, flags); + fd = qemuSaveImageCreateFd(vm, path, &wrapperFd, sparse, &needUnlink, flags); if (fd < 0) goto cleanup; -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> We pass in 'vm' which contains it in the private data. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_saveimage.c | 6 +++--- src/qemu/qemu_saveimage.h | 3 +-- src/qemu/qemu_snapshot.c | 2 +- 4 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index abe91b303f..3f154969b8 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -2682,7 +2682,7 @@ qemuDomainSaveInternal(virQEMUDriver *driver, (flags & VIR_DOMAIN_SAVE_BYPASS_CACHE)))) goto endjob; - ret = qemuSaveImageCreate(driver, vm, path, data, compressor, + ret = qemuSaveImageCreate(vm, path, data, compressor, saveParams, flags, VIR_ASYNC_JOB_SAVE); if (ret < 0) goto endjob; diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index a2e760c462..09217a9c9d 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -475,8 +475,7 @@ qemuSaveImageCreateFd(virDomainObj *vm, * the caller needs to make sure that the processors are stopped and do all other * actions besides saving memory */ int -qemuSaveImageCreate(virQEMUDriver *driver, - virDomainObj *vm, +qemuSaveImageCreate(virDomainObj *vm, const char *path, virQEMUSaveData *data, virCommand *compressor, @@ -484,7 +483,8 @@ qemuSaveImageCreate(virQEMUDriver *driver, unsigned int flags, virDomainAsyncJob asyncJob) { - g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver); + qemuDomainObjPrivate *priv = vm->privateData; + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(priv->driver); bool needUnlink = false; int ret = -1; int fd = -1; diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h index 1fd96751a2..b46cabffe5 100644 --- a/src/qemu/qemu_saveimage.h +++ b/src/qemu/qemu_saveimage.h @@ -119,8 +119,7 @@ qemuSaveImageDecompressionStop(virCommand *cmd, const char *path); int -qemuSaveImageCreate(virQEMUDriver *driver, - virDomainObj *vm, +qemuSaveImageCreate(virDomainObj *vm, const char *path, virQEMUSaveData *data, virCommand *compressor, diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index 5ceaff3554..c8954fd805 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1756,7 +1756,7 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driver, if (!(snap_params = qemuMigrationParamsNew())) goto cleanup; - if (qemuSaveImageCreate(driver, vm, snapdef->memorysnapshotfile, + if (qemuSaveImageCreate(vm, snapdef->memorysnapshotfile, data, compressor, snap_params, 0, VIR_ASYNC_JOB_SNAPSHOT) < 0) goto cleanup; -- 2.52.0
From: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> Don't unnecessarily pause the VM if the snapshot can't be taken. Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com> Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_snapshot.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/qemu/qemu_snapshot.c b/src/qemu/qemu_snapshot.c index c8954fd805..b75e2b4233 100644 --- a/src/qemu/qemu_snapshot.c +++ b/src/qemu/qemu_snapshot.c @@ -1661,6 +1661,12 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driver, virQEMUSaveData *data = NULL; g_autoptr(GHashTable) blockNamedNodeData = NULL; + if (memory) { + /* When doing a snapshot with memory check if migration is possible */ + if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_SNAPSHOT, 0)) + return -1; + } + /* If quiesce was requested, then issue a freeze command, and a * counterpart thaw command when it is actually sent to agent. * The command will fail if the guest is paused or the guest agent @@ -1723,10 +1729,6 @@ qemuSnapshotCreateActiveExternal(virQEMUDriver *driver, if (memory) { g_autoptr(qemuMigrationParams) snap_params = NULL; - /* check if migration is possible */ - if (!qemuMigrationSrcIsAllowed(vm, false, VIR_ASYNC_JOB_SNAPSHOT, 0)) - goto cleanup; - qemuDomainJobSetStatsType(vm->job->current, QEMU_DOMAIN_JOB_STATS_TYPE_SAVEDUMP); -- 2.52.0
From: Peter Krempa <pkrempa@redhat.com> Use autoptr cleanup for 'data' and get rid of 'cleanup:' label. Signed-off-by: Peter Krempa <pkrempa@redhat.com> --- src/qemu/qemu_saveimage.c | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c index 09217a9c9d..cdfa9be09d 100644 --- a/src/qemu/qemu_saveimage.c +++ b/src/qemu/qemu_saveimage.c @@ -82,7 +82,7 @@ virQEMUSaveDataNew(char *domXML, virQEMUSaveFormat format, virDomainXMLOption *xmlopt) { - virQEMUSaveData *data = NULL; + g_autoptr(virQEMUSaveData) data = NULL; virQEMUSaveHeader *header; data = g_new0(virQEMUSaveData, 1); @@ -90,7 +90,7 @@ virQEMUSaveDataNew(char *domXML, if (cookieObj && !(data->cookie = virSaveCookieFormat((virObject *) cookieObj, virDomainXMLOptionGetSaveCookie(xmlopt)))) - goto error; + return NULL; header = &data->header; memcpy(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic)); @@ -99,11 +99,8 @@ virQEMUSaveDataNew(char *domXML, header->format = format; data->xml = domXML; - return data; - error: - virQEMUSaveDataFree(data); - return NULL; + return g_steal_pointer(&data); } -- 2.52.0
On Wed, Dec 10, 2025 at 11:32:21 +0100, Peter Krempa via Devel wrote:
This series fixes up some code (mostly removes unneeded) 'driver' argument and fixes control flow in some snapshot and save image related functions.
This series also contains 2 patches necromanced from the original attempt to add background snapshot from Nikolay.
Nikolay Shirokovskiy (2): qemu: snapshot: Don't overwrite 'ret' in qemuSnapshotCreateActiveExternal qemu: snapshot: Check earlier if memory snapshot is possible
Peter Krempa (8): qemuHotplugAttachDBusVMState: Remove 'driver' argument qemuMigrationSrcToLegacyFile: Remove 'driver' argument qemuDomainEventEmitJobCompleted: Remove 'driver' argument qemuMigrationSrcToSparseFile: Remove 'driver' argument qemuMigrationSrcToFile: Remove 'driver' argument qemuSaveImageCreateFd: Remove 'driver' argument qemuSaveImageCreate: Remove 'driver' argument virQEMUSaveDataNew: Refactor cleanup
Ping? :)
On Wed, Dec 10, 2025 at 11:32:21AM +0100, Peter Krempa via Devel wrote:
This series fixes up some code (mostly removes unneeded) 'driver' argument and fixes control flow in some snapshot and save image related functions.
This series also contains 2 patches necromanced from the original attempt to add background snapshot from Nikolay.
Nikolay Shirokovskiy (2): qemu: snapshot: Don't overwrite 'ret' in qemuSnapshotCreateActiveExternal qemu: snapshot: Check earlier if memory snapshot is possible
Peter Krempa (8): qemuHotplugAttachDBusVMState: Remove 'driver' argument qemuMigrationSrcToLegacyFile: Remove 'driver' argument qemuDomainEventEmitJobCompleted: Remove 'driver' argument qemuMigrationSrcToSparseFile: Remove 'driver' argument qemuMigrationSrcToFile: Remove 'driver' argument qemuSaveImageCreateFd: Remove 'driver' argument qemuSaveImageCreate: Remove 'driver' argument virQEMUSaveDataNew: Refactor cleanup
Reviewed-by: Pavel Hrdina <phrdina@redhat.com>
On a Wednesday in 2025, Peter Krempa via Devel wrote:
This series fixes up some code (mostly removes unneeded) 'driver' argument and fixes control flow in some snapshot and save image related functions.
This series also contains 2 patches necromanced from the original attempt to add background snapshot from Nikolay.
Nikolay Shirokovskiy (2): qemu: snapshot: Don't overwrite 'ret' in qemuSnapshotCreateActiveExternal qemu: snapshot: Check earlier if memory snapshot is possible
Peter Krempa (8): qemuHotplugAttachDBusVMState: Remove 'driver' argument qemuMigrationSrcToLegacyFile: Remove 'driver' argument qemuDomainEventEmitJobCompleted: Remove 'driver' argument qemuMigrationSrcToSparseFile: Remove 'driver' argument qemuMigrationSrcToFile: Remove 'driver' argument qemuSaveImageCreateFd: Remove 'driver' argument qemuSaveImageCreate: Remove 'driver' argument virQEMUSaveDataNew: Refactor cleanup
src/qemu/qemu_backup.c | 2 +- src/qemu/qemu_domainjob.c | 6 +++--- src/qemu/qemu_domainjob.h | 3 +-- src/qemu/qemu_driver.c | 4 ++-- src/qemu/qemu_hotplug.c | 6 ++---- src/qemu/qemu_hotplug.h | 3 +-- src/qemu/qemu_migration.c | 36 ++++++++++++++++++------------------ src/qemu/qemu_migration.h | 5 ++--- src/qemu/qemu_saveimage.c | 27 ++++++++++++--------------- src/qemu/qemu_saveimage.h | 3 +-- src/qemu/qemu_snapshot.c | 22 ++++++++++++---------- 11 files changed, 55 insertions(+), 62 deletions(-)
Reviewed-by: Ján Tomko <jtomko@redhat.com> Jano
participants (3)
-
Ján Tomko -
Pavel Hrdina -
Peter Krempa