On Thu, Aug 08, 2024 at 05:38:01PM -0600, Jim Fehlig via Devel wrote:
> Add a 'save_image_version' setting to qemu.conf to control the image
> version when saving a VM with 'virsh save' or 'virsh managedsave'.
> Default to the new version 3.
>
> Signed-off-by: Jim Fehlig <[email protected]>
> ---
> src/qemu/libvirtd_qemu.aug | 1 +
> src/qemu/qemu.conf.in | 6 ++++++
> src/qemu/qemu_conf.c | 16 ++++++++++++++++
> src/qemu/qemu_conf.h | 5 +++++
> src/qemu/qemu_driver.c | 3 +--
> src/qemu/qemu_saveimage.c | 11 ++++++-----
> src/qemu/qemu_saveimage.h | 8 ++++----
> src/qemu/qemu_snapshot.c | 4 ++--
> src/qemu/test_libvirtd_qemu.aug.in | 1 +
> 9 files changed, 42 insertions(+), 13 deletions(-)
>
> diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug
> index 2b6526538f..acbfcd9fc3 100644
> --- a/src/qemu/libvirtd_qemu.aug
> +++ b/src/qemu/libvirtd_qemu.aug
> @@ -92,6 +92,7 @@ module Libvirtd_qemu =
> | str_array_entry "namespaces"
>
> let save_entry = str_entry "save_image_format"
> + | int_entry "save_image_version"
> | str_entry "dump_image_format"
> | str_entry "snapshot_image_format"
> | str_entry "auto_dump_path"
> diff --git a/src/qemu/qemu.conf.in b/src/qemu/qemu.conf.in
> index 6bc2140dcb..b5df8c1cc6 100644
> --- a/src/qemu/qemu.conf.in
> +++ b/src/qemu/qemu.conf.in
> @@ -590,6 +590,11 @@
> # at scheduled saving, and it is an error if the specified save_image_format
> # is not valid, or the requested compression program can't be found.
> #
> +# save_image_version is applicable when using 'virsh save' or 'virsh
> managed-save'.
> +# Currently only versions 2 and 3 are supported, with version 3 being the
> default.
> +# If saved images must be compatible with an older libvirt without this
> setting,
> +# then set save_image_format_version to 2.
> +#
> # dump_image_format is used when you use 'virsh dump' at emergency
> # crashdump, and if the specified dump_image_format is not valid, or
> # the requested compression program can't be found, this falls
> @@ -601,6 +606,7 @@
> # or the requested compression program can't be found.
> #
> #save_image_format = "raw"
> +#save_image_version = 3
> #dump_image_format = "raw"
> #snapshot_image_format = "raw"
>
> diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
> index b36bede6c3..ab4122708c 100644
> --- a/src/qemu/qemu_conf.c
> +++ b/src/qemu/qemu_conf.c
> @@ -66,6 +66,10 @@ VIR_LOG_INIT("qemu.qemu_conf");
> #define QEMU_MIGRATION_PORT_MIN 49152
> #define QEMU_MIGRATION_PORT_MAX 49215
>
> +/* Need to reconsile definition here and in qemu_saveimage.h */
> +#define QEMU_SAVE_VERSION 3
You've not used this - instead you used QEMU_SAVE_IMAGE_VERSION
defined in qemu_conf.h
> +
> +
> VIR_ENUM_IMPL(virQEMUSchedCore,
> QEMU_SCHED_CORE_LAST,
> "none",
> @@ -246,6 +250,8 @@ virQEMUDriverConfig *virQEMUDriverConfigNew(bool
> privileged,
> cfg->migrationPortMin = QEMU_MIGRATION_PORT_MIN;
> cfg->migrationPortMax = QEMU_MIGRATION_PORT_MAX;
>
> + cfg->saveImageVersion = QEMU_SAVE_IMAGE_VERSION;
> +
> /* For privileged driver, try and find hugetlbfs mounts automatically.
> * Non-privileged driver requires admin to create a dir for the
> * user, chown it, and then let user configure it manually. */
> @@ -608,6 +614,16 @@ static int
> virQEMUDriverConfigLoadSaveEntry(virQEMUDriverConfig *cfg,
> virConf *conf)
> {
> + if (virConfGetValueUInt(conf, "save_image_version",
> &cfg->saveImageVersion) < 0)
> + return -1;
> + if (cfg->saveImageVersion < QEMU_SAVE_IMAGE_VERSION_MIN ||
> + cfg->saveImageVersion > QEMU_SAVE_IMAGE_VERSION) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("Invalid save image version %1$u"),
> + cfg->saveImageVersion);
> + return -1;
> + }
> +
> if (virConfGetValueString(conf, "save_image_format",
> &cfg->saveImageFormat) < 0)
> return -1;
> if (virConfGetValueString(conf, "dump_image_format",
> &cfg->dumpImageFormat) < 0)
> diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
> index aa1e1a626c..55abede7e3 100644
> --- a/src/qemu/qemu_conf.h
> +++ b/src/qemu/qemu_conf.h
> @@ -45,6 +45,10 @@
>
> #define QEMU_DRIVER_NAME "QEMU"
>
> +#define QEMU_SAVE_IMAGE_VERSION_MIN 2
> +#define QEMU_SAVE_IMAGE_VERSION 3
Call the second one 'MAX' for parity, and also to make it more
obvious that we're not automatically using the 'MAX' by default.
> +
> +
> typedef enum {
> QEMU_SCHED_CORE_NONE = 0,
> QEMU_SCHED_CORE_VCPUS,
> @@ -193,6 +197,7 @@ struct _virQEMUDriverConfig {
> bool securityRequireConfined;
>
> char *saveImageFormat;
> + unsigned int saveImageVersion;
> char *dumpImageFormat;
> char *snapshotImageFormat;
>
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 736602333e..6c0d3e097c 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -2683,8 +2683,7 @@ qemuDomainSaveInternal(virQEMUDriver *driver,
> if (!(cookie = qemuDomainSaveCookieNew(vm)))
> goto endjob;
>
> - if (!(data = virQEMUSaveDataNew(xml, cookie, was_running, compressed,
> - driver->xmlopt)))
> + if (!(data = virQEMUSaveDataNew(driver, xml, cookie, was_running,
> compressed)))
> goto endjob;
> xml = NULL;
>
> diff --git a/src/qemu/qemu_saveimage.c b/src/qemu/qemu_saveimage.c
> index 50fec33f54..bffa0a3397 100644
> --- a/src/qemu/qemu_saveimage.c
> +++ b/src/qemu/qemu_saveimage.c
> @@ -95,25 +95,26 @@ G_DEFINE_AUTOPTR_CLEANUP_FUNC(virQEMUSaveData,
> virQEMUSaveDataFree);
> * This function steals @domXML on success.
> */
> virQEMUSaveData *
> -virQEMUSaveDataNew(char *domXML,
> +virQEMUSaveDataNew(virQEMUDriver *driver,
> + char *domXML,
> qemuDomainSaveCookie *cookieObj,
> bool running,
> - int compressed,
> - virDomainXMLOption *xmlopt)
> + int compressed)
> {
> virQEMUSaveData *data = NULL;
> virQEMUSaveHeader *header;
> + g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
>
> data = g_new0(virQEMUSaveData, 1);
>
> if (cookieObj &&
> !(data->cookie = virSaveCookieFormat((virObject *) cookieObj,
> -
> virDomainXMLOptionGetSaveCookie(xmlopt))))
> +
> virDomainXMLOptionGetSaveCookie(driver->xmlopt))))
> goto error;
>
> header = &data->header;
> memcpy(header->magic, QEMU_SAVE_PARTIAL, sizeof(header->magic));
> - header->version = QEMU_SAVE_VERSION;
> + header->version = cfg->saveImageVersion;
> header->was_running = running ? 1 : 0;
> header->compressed = compressed;
>
> diff --git a/src/qemu/qemu_saveimage.h b/src/qemu/qemu_saveimage.h
> index 9dd7de292d..3cee846f14 100644
> --- a/src/qemu/qemu_saveimage.h
> +++ b/src/qemu/qemu_saveimage.h
> @@ -28,7 +28,7 @@
> */
> #define QEMU_SAVE_MAGIC "LibvirtQemudSave"
> #define QEMU_SAVE_PARTIAL "LibvirtQemudPart"
> -#define QEMU_SAVE_VERSION 3
> +#define QEMU_SAVE_VERSION QEMU_SAVE_IMAGE_VERSION
Surely we shouldn't need this constant anymore since you changed
the qemu_saveimage.c code to use 'cfg->saveImageVersion' instead
of 'QEMU_SAVE_VERSION'
>
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|