[libvirt] Re: [PATCH] also allow use of XZ for Qemu image compression

Jim Meyering jim at meyering.net
Wed Sep 9 06:59:35 UTC 2009


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.

>From 24309516094b058cce9f5eb123877bd5eec2cfc2 Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyering at 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.
(qemudDomainSave, qemudDomainRestore): Handle the new member.
* src/qemu.conf: Mention xz, too.
---
 src/qemu.conf     |    2 +-
 src/qemu_driver.c |   10 +++++++++-
 2 files changed, 10 insertions(+), 2 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..99b3390 100644
--- a/src/qemu_driver.c
+++ b/src/qemu_driver.c
@@ -3622,8 +3622,9 @@ 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_LZOP,
+    QEMUD_SAVE_FORMAT_XZ,
 };

 struct qemud_save_header {
@@ -3666,6 +3667,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 +3764,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 +4391,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




More information about the libvir-list mailing list