
Jim Meyering wrote:
Chris Lalancette wrote:
Jim Meyering wrote:
While this patch stays minimal by simply adding XZ/xz to the list, I think it would be better to remove lzma, since it uses an inferior format (which lacks an integrity check), and has been effectively subsumed by xz.
Let me know if you'd like that, and I'll prepare the slightly more invasive patch.
I'm on the fence about it. While I do understand the situation now (thanks for explaining), I think keeping lzma for compatibility with older distros might be a good idea. Either way, we have to keep the LZMA slot in the enum "free", since it's part of the on-disk ABI for the save format. And on that note...
diff --git a/src/qemu_driver.c b/src/qemu_driver.c index f64d70b..7b64712 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -3622,7 +3622,8 @@ enum qemud_save_formats { QEMUD_SAVE_FORMAT_RAW, QEMUD_SAVE_FORMAT_GZIP, QEMUD_SAVE_FORMAT_BZIP2, - QEMUD_SAVE_FORMAT_LZMA, + QEMUD_SAVE_FORMAT_LZMA, /* deprecated, in favor of xz */ + QEMUD_SAVE_FORMAT_XZ, QEMUD_SAVE_FORMAT_LZOP, };
You'll need to add QEMUD_SAVE_FORMAT_XZ to the end of the enum, to maintain on-disk compatibility. Otherwise it looks good.
Thanks. Good point. Here's an amended patch: Note, I've reordered the if/else placement to match enum member ordering, too. ...
At Chris' suggestion, I've added a comment warning not to do what I did ;-) To make it even more obvious that these numbers matter, I've assigned explicit constants in the enum: + QEMUD_SAVE_FORMAT_RAW = 0, + QEMUD_SAVE_FORMAT_GZIP = 1, + QEMUD_SAVE_FORMAT_BZIP2 = 2, Currently, if someone accidentally adds this (mistakenly reused number): + QEMUD_SAVE_FORMAT_OOPS = 2, the compiler won't catch it. However, with a small additional change to use VIR_ENUM_DECL and VIR_ENUM_IMPL, thus replacing the if/elsif/ chains, and the compiler *would* detect that mistake. It'd also help to factor out the QEMUD_SAVE_FORMAT_<> to "<>" association, rather than having literals like "gzip" and "bzip2" in two places. Now that I've described that, I'll prepare a separate patch. For now, here's the added comment and enum initializers.
From ef653538806f981ca6ca5bb270e7a8fb1618f6d4 Mon Sep 17 00:00:00 2001 From: Jim Meyering <meyering@redhat.com> Date: Tue, 8 Sep 2009 20:52:37 +0200 Subject: [PATCH] also allow use of XZ for Qemu image compression
* src/qemu_driver.c (enum qemud_save_formats) [QEMUD_SAVE_FORMAT_XZ]: New member. [QEMUD_SAVE_FORMAT_LZMA]: Mark as deprecated. Use an explicit value for each member. (qemudDomainSave, qemudDomainRestore): Handle the new member. * src/qemu.conf: Mention xz, too. --- src/qemu.conf | 2 +- src/qemu_driver.c | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/qemu.conf b/src/qemu.conf index 06babc4..342bb8a 100644 --- a/src/qemu.conf +++ b/src/qemu.conf @@ -134,7 +134,7 @@ # memory from the domain is dumped out directly to a file. If you have # guests with a large amount of memory, however, this can take up quite # a bit of space. If you would like to compress the images while they -# are being saved to disk, you can also set "gzip", "bzip2", "lzma" +# are being saved to disk, you can also set "gzip", "bzip2", "lzma", "xz", # or "lzop" for save_image_format. Note that this means you slow down # the process of saving a domain in order to save disk space. # diff --git a/src/qemu_driver.c b/src/qemu_driver.c index f64d70b..0cdcd98 100644 --- a/src/qemu_driver.c +++ b/src/qemu_driver.c @@ -3619,11 +3619,15 @@ static char *qemudEscapeShellArg(const char *in) #define QEMUD_SAVE_VERSION 2 enum qemud_save_formats { - QEMUD_SAVE_FORMAT_RAW, - QEMUD_SAVE_FORMAT_GZIP, - QEMUD_SAVE_FORMAT_BZIP2, - QEMUD_SAVE_FORMAT_LZMA, - QEMUD_SAVE_FORMAT_LZOP, + QEMUD_SAVE_FORMAT_RAW = 0, + QEMUD_SAVE_FORMAT_GZIP = 1, + QEMUD_SAVE_FORMAT_BZIP2 = 2, + QEMUD_SAVE_FORMAT_LZMA = 3, /* deprecated, in favor of xz */ + QEMUD_SAVE_FORMAT_LZOP = 4, + QEMUD_SAVE_FORMAT_XZ = 5, + /* Note: add new members only at the end. + These values are used in the on-disk format. + Do not change or re-use numbers. */ }; struct qemud_save_header { @@ -3666,6 +3670,8 @@ static int qemudDomainSave(virDomainPtr dom, header.compressed = QEMUD_SAVE_FORMAT_LZMA; else if (STREQ(driver->saveImageFormat, "lzop")) header.compressed = QEMUD_SAVE_FORMAT_LZOP; + else if (STREQ(driver->saveImageFormat, "xz")) + header.compressed = QEMUD_SAVE_FORMAT_XZ; else { qemudReportError(dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED, "%s", _("Invalid save image format specified in configuration file")); @@ -3761,6 +3767,9 @@ static int qemudDomainSave(virDomainPtr dom, else if (header.compressed == QEMUD_SAVE_FORMAT_LZOP) internalret = virAsprintf(&command, "migrate \"exec:" "lzop -c >> '%s' 2>/dev/null\"", safe_path); + else if (header.compressed == QEMUD_SAVE_FORMAT_XZ) + internalret = virAsprintf(&command, "migrate \"exec:" + "xz -c >> '%s' 2>/dev/null\"", safe_path); else { qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR, _("Invalid compress format %d"), @@ -4385,6 +4394,8 @@ static int qemudDomainRestore(virConnectPtr conn, intermediate_argv[0] = "lzma"; else if (header.compressed == QEMUD_SAVE_FORMAT_LZOP) intermediate_argv[0] = "lzop"; + else if (header.compressed == QEMUD_SAVE_FORMAT_XZ) + intermediate_argv[0] = "xz"; else if (header.compressed != QEMUD_SAVE_FORMAT_RAW) { qemudReportError(conn, NULL, NULL, VIR_ERR_OPERATION_FAILED, _("Unknown compressed save format %d"), -- 1.6.5.rc0.164.g5f6b0