# the requested compression program can't be found, this falls
# back to "raw" compression.
#
+# snapshot_image_format specifies the compression algorithm of the memory save
+# image when an external snapshot of a domain is taken. This does not apply
+# on disk image format. It is an error if the specified format isn't valid,
+# or the requested compression program can't be found.
+#
#save_image_format = "raw"
#dump_image_format = "raw"
+#snapshot_image_format = "raw"
# When a domain is configured to be auto-dumped when libvirtd receives a
# watchdog event from qemu guest, libvirtd will save dump files in directory
GET_VALUE_STR("save_image_format", cfg->saveImageFormat);
GET_VALUE_STR("dump_image_format", cfg->dumpImageFormat);
+ GET_VALUE_STR("snapshot_image_format", cfg->snapshotImageFormat);
+
GET_VALUE_STR("auto_dump_path", cfg->autoDumpPath);
GET_VALUE_BOOL("auto_dump_bypass_cache", cfg->autoDumpBypassCache);
GET_VALUE_BOOL("auto_start_bypass_cache", cfg->autoStartBypassCache);
bool transaction = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_TRANSACTION);
int thaw = 0; /* 1 if freeze succeeded, -1 if freeze failed */
bool pmsuspended = false;
+ virQEMUDriverConfigPtr cfg = NULL;
+ int compressed = QEMU_SAVE_FORMAT_RAW;
if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SNAPSHOT) < 0)
goto cleanup;
JOB_MASK(QEMU_JOB_SUSPEND) |
JOB_MASK(QEMU_JOB_MIGRATION_OP));
+ cfg = virQEMUDriverGetConfig(driver);
+ if (cfg->snapshotImageFormat) {
+ compressed = qemuSaveCompressionTypeFromString(cfg->snapshotImageFormat);
+ if (compressed < 0) {
+ virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+ _("Invalid snapshot image format specified "
+ "in configuration file"));
+ goto cleanup;
+ }
+ if (!qemuCompressProgramAvailable(compressed)) {
+ virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+ _("Compression program for image format "
+ "in configuration file isn't available"));
+ goto cleanup;
+ }
+ }
+
if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)))
goto endjob;
if ((ret = qemuDomainSaveMemory(driver, vm, snap->def->file,
- xml, QEMU_SAVE_FORMAT_RAW,
- resume, 0,
+ xml, compressed, resume, 0,
QEMU_ASYNC_JOB_SNAPSHOT)) < 0)
goto endjob;
cleanup:
VIR_FREE(xml);
+ virObjectUnref(cfg);
if (memory_unlink && ret < 0)
unlink(snap->def->file);