[libvirt] [PATCH v5 3/5] storage: add support for creating qcow2 images with extensions

Ján Tomko jtomko at redhat.com
Wed Jun 19 15:24:12 UTC 2013


Add -o compat= and -o lazy_refcounts options for qemu-img.
---
 src/storage/storage_backend.c                   | 62 ++++++++++++++++++++++---
 tests/storagevolxml2argvdata/qcow2-1.1.argv     |  1 +
 tests/storagevolxml2argvdata/qcow2-lazy.argv    |  1 +
 tests/storagevolxml2argvdata/vol-qcow2-1.1.xml  | 32 +++++++++++++
 tests/storagevolxml2argvdata/vol-qcow2-lazy.xml | 35 ++++++++++++++
 tests/storagevolxml2argvtest.c                  |  2 +
 6 files changed, 126 insertions(+), 7 deletions(-)
 create mode 100644 tests/storagevolxml2argvdata/qcow2-1.1.argv
 create mode 100644 tests/storagevolxml2argvdata/qcow2-lazy.argv
 create mode 100644 tests/storagevolxml2argvdata/vol-qcow2-1.1.xml
 create mode 100644 tests/storagevolxml2argvdata/vol-qcow2-lazy.xml

diff --git a/src/storage/storage_backend.c b/src/storage/storage_backend.c
index deea850..b2c9608 100644
--- a/src/storage/storage_backend.c
+++ b/src/storage/storage_backend.c
@@ -633,9 +633,15 @@ static int
 virStorageBackendCreateQemuImgOpts(char **opts,
                                    const char *backingType,
                                    bool encryption,
-                                   bool preallocate)
+                                   bool preallocate,
+                                   int format,
+                                   const char *compat,
+                                   virBitmapPtr features)
 {
     virBuffer buf = VIR_BUFFER_INITIALIZER;
+    bool b;
+    int i;
+
     if (backingType)
         virBufferAsprintf(&buf, "backing_fmt=%s,", backingType);
     if (encryption)
@@ -643,16 +649,45 @@ virStorageBackendCreateQemuImgOpts(char **opts,
     if (preallocate)
         virBufferAddLit(&buf, "preallocation=metadata,");
 
+    if (compat)
+        virBufferAsprintf(&buf, "compat=%s,", compat);
+    if (features && format == VIR_STORAGE_FILE_QCOW2) {
+        for (i = 0; i < VIR_STORAGE_FILE_FEATURE_LAST; i++) {
+            ignore_value(virBitmapGetBit(features, i, &b));
+            if (b) {
+                switch (i) {
+                case VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS:
+                    if (STREQ(compat, "0.10")) {
+                        virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                       _("Feature %s not supported with compat"
+                                         " level %s"),
+                                       virStorageFileFeatureTypeToString(i),
+                                       compat);
+                        goto error;
+                    }
+                    break;
+                case VIR_STORAGE_FILE_FEATURE_LAST:
+                    ;
+                }
+                virBufferAsprintf(&buf, "%s,",
+                                  virStorageFileFeatureTypeToString(i));
+            }
+        }
+    }
+
     virBufferTrim(&buf, ",", -1);
 
-    if (virBufferError(&buf)) {
-        virBufferFreeAndReset(&buf);
-        virReportOOMError();
-        return -1;
-    }
+    if (virBufferError(&buf))
+        goto no_memory;
 
     *opts = virBufferContentAndReset(&buf);
     return 0;
+
+no_memory:
+    virReportOOMError();
+error:
+    virBufferFreeAndReset(&buf);
+    return -1;
 }
 
 virCommandPtr
@@ -695,6 +730,16 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
                        _("metadata preallocation only available with qcow2"));
         return NULL;
     }
+    if (vol->target.compat && vol->target.format != VIR_STORAGE_FILE_QCOW2) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("compatibility option only available with qcow2"));
+        return NULL;
+    }
+    if (vol->target.features && vol->target.format != VIR_STORAGE_FILE_QCOW2) {
+        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                       _("format features only available with qcow2"));
+        return NULL;
+    }
 
     if (inputvol) {
         if (!(inputPath = inputvol->target.path)) {
@@ -816,7 +861,10 @@ virStorageBackendCreateQemuImgCmd(virConnectPtr conn,
     if (imgformat == QEMU_IMG_BACKING_FORMAT_OPTIONS) {
         if (virStorageBackendCreateQemuImgOpts(&opts,
                                                backing ? backingType : NULL,
-                                               do_encryption, preallocate) < 0)
+                                               do_encryption, preallocate,
+                                               vol->target.format,
+                                               vol->target.compat,
+                                               vol->target.features) < 0)
             return NULL;
         if (opts)
             virCommandAddArgList(cmd, "-o", opts, NULL);
diff --git a/tests/storagevolxml2argvdata/qcow2-1.1.argv b/tests/storagevolxml2argvdata/qcow2-1.1.argv
new file mode 100644
index 0000000..797499f
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-1.1.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 -b /dev/null -o backing_fmt=raw,encryption=on,compat=1.1 /var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/qcow2-lazy.argv b/tests/storagevolxml2argvdata/qcow2-lazy.argv
new file mode 100644
index 0000000..9160d47
--- /dev/null
+++ b/tests/storagevolxml2argvdata/qcow2-lazy.argv
@@ -0,0 +1 @@
+qemu-img create -f qcow2 -b /dev/null -o backing_fmt=raw,encryption=on,compat=1.1,lazy_refcounts /var/lib/libvirt/images/OtherDemo.img 5242880K
diff --git a/tests/storagevolxml2argvdata/vol-qcow2-1.1.xml b/tests/storagevolxml2argvdata/vol-qcow2-1.1.xml
new file mode 100644
index 0000000..696e1e0
--- /dev/null
+++ b/tests/storagevolxml2argvdata/vol-qcow2-1.1.xml
@@ -0,0 +1,32 @@
+<volume>
+  <name>OtherDemo.img</name>
+  <key>/var/lib/libvirt/images/OtherDemo.img</key>
+  <source>
+  </source>
+  <capacity unit="G">5</capacity>
+  <allocation>294912</allocation>
+  <target>
+    <path>/var/lib/libvirt/images/OtherDemo.img</path>
+    <format type='qcow2'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+    <encryption format='qcow'>
+      <secret type='passphrase' uuid='e78d4b51-a2af-485f-b0f5-afca709a80f4'/>
+    </encryption>
+    <features/>
+  </target>
+  <backingStore>
+    <path>/dev/null</path>
+    <format type='raw'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+  </backingStore>
+</volume>
diff --git a/tests/storagevolxml2argvdata/vol-qcow2-lazy.xml b/tests/storagevolxml2argvdata/vol-qcow2-lazy.xml
new file mode 100644
index 0000000..c1d7875
--- /dev/null
+++ b/tests/storagevolxml2argvdata/vol-qcow2-lazy.xml
@@ -0,0 +1,35 @@
+<volume>
+  <name>OtherDemo.img</name>
+  <key>/var/lib/libvirt/images/OtherDemo.img</key>
+  <source>
+  </source>
+  <capacity unit="G">5</capacity>
+  <allocation>294912</allocation>
+  <target>
+    <path>/var/lib/libvirt/images/OtherDemo.img</path>
+    <format type='qcow2'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+    <encryption format='qcow'>
+      <secret type='passphrase' uuid='e78d4b51-a2af-485f-b0f5-afca709a80f4'/>
+    </encryption>
+    <compat>1.1</compat>
+    <features>
+      <lazy_refcounts/>
+    </features>
+  </target>
+  <backingStore>
+    <path>/dev/null</path>
+    <format type='raw'/>
+    <permissions>
+      <mode>0644</mode>
+      <owner>0</owner>
+      <group>0</group>
+      <label>unconfined_u:object_r:virt_image_t:s0</label>
+    </permissions>
+  </backingStore>
+</volume>
diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c
index 92ab2f2..25ff5a7 100644
--- a/tests/storagevolxml2argvtest.c
+++ b/tests/storagevolxml2argvtest.c
@@ -188,6 +188,8 @@ mymain(void)
             "qcow2-nobacking-none", 0, FMT_NONE);
     DO_TEST(false, "pool-dir", "vol-qcow2-nobacking", "vol-file",
             "qcow2-nobacking-convert-none", 0, FMT_NONE);
+    DO_TEST(false, "pool-dir", "vol-qcow2-lazy", NULL, "qcow2-lazy", 0, FMT_OPTIONS);
+    DO_TEST(false, "pool-dir", "vol-qcow2-1.1", NULL, "qcow2-1.1", 0, FMT_OPTIONS);
 
     return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
 }
-- 
1.8.1.5




More information about the libvir-list mailing list