diff --git a/src/storage/storage_driver.c b/src/storage/storage_driver.c index bc16e87c6b..6e51603d10 100644 --- a/src/storage/storage_driver.c +++ b/src/storage/storage_driver.c @@ -1810,7 +1810,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj, goto cleanup; } - newvol = virStorageVolDefParseString(pool->def, xmldesc, 0); + newvol = virStorageVolDefParseString(pool->def, xmldesc, + VIR_VOL_XML_PARSE_NO_CAPACITY); if (newvol == NULL) goto cleanup; @@ -1824,7 +1825,8 @@ storageVolCreateXMLFrom(virStoragePoolPtr obj, goto cleanup; } - /* Is there ever a valid case for this? */ + /* Use the original volume's capacity in case the new capacity + * is less than that, or it was omitted */ if (newvol->target.capacity < origvol->target.capacity) newvol->target.capacity = origvol->target.capacity; diff --git a/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv new file mode 100644 index 0000000000..9073b1b163 --- /dev/null +++ b/tests/storagevolxml2argvdata/qcow2-nocapacity-convert-prealloc.argv @@ -0,0 +1,4 @@ +qemu-img convert -f raw -O qcow2 \ +-o encryption=on,preallocation=metadata \ +/var/lib/libvirt/images/sparse.img \ +/var/lib/libvirt/images/OtherDemo.img diff --git a/tests/storagevolxml2argvtest.c b/tests/storagevolxml2argvtest.c index c1f8a9d46e..52bb85625d 100644 --- a/tests/storagevolxml2argvtest.c +++ b/tests/storagevolxml2argvtest.c @@ -49,6 +49,7 @@ testCompareXMLToArgvFiles(bool shouldFail, char *expectedCmdline = NULL; char *actualCmdline = NULL; int ret = -1; + unsigned long parse_flags = 0; int len; @@ -84,7 +85,10 @@ testCompareXMLToArgvFiles(bool shouldFail, goto cleanup; } - if (!(vol = virStorageVolDefParseString(pool, volXmlData, 0))) + if (inputvolxml) + parse_flags |= VIR_VOL_XML_PARSE_NO_CAPACITY; + + if (!(vol = virStorageVolDefParseString(pool, volXmlData, parse_flags))) goto cleanup; if (inputvolxml && @@ -305,6 +309,9 @@ mymain(void) DO_TEST("pool-dir", "vol-qcow2-nocow", NULL, NULL, "qcow2-nocow-compat", 0, FMT_COMPAT); + DO_TEST("pool-dir", "vol-qcow2-nocapacity", + "pool-dir", "vol-file", + "qcow2-nocapacity-convert-prealloc", flags, FMT_OPTIONS); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } diff --git a/tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml b/tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml new file mode 100644 index 0000000000..9746900f5c --- /dev/null +++ b/tests/storagevolxml2xmlin/vol-qcow2-nocapacity.xml @@ -0,0 +1,19 @@ + + OtherDemo.img + /var/lib/libvirt/images/OtherDemo.img + + + + /var/lib/libvirt/images/OtherDemo.img + + + 0644 + 0 + 0 + + + + + + + diff --git a/tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml b/tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml new file mode 100644 index 0000000000..223e6892fd --- /dev/null +++ b/tests/storagevolxml2xmlout/vol-qcow2-nocapacity.xml @@ -0,0 +1,21 @@ + + OtherDemo.img + /var/lib/libvirt/images/OtherDemo.img + + + 0 + 0 + + /var/lib/libvirt/images/OtherDemo.img + + + 0644 + 0 + 0 + + + + + + + diff --git a/tests/storagevolxml2xmltest.c b/tests/storagevolxml2xmltest.c index 5deb62c55e..0d6c818e0d 100644 --- a/tests/storagevolxml2xmltest.c +++ b/tests/storagevolxml2xmltest.c @@ -126,6 +126,8 @@ mymain(void) DO_TEST("pool-sheepdog", "vol-sheepdog"); DO_TEST("pool-gluster", "vol-gluster-dir"); DO_TEST("pool-gluster", "vol-gluster-dir-neg-uid"); + DO_TEST_FULL("pool-dir", "vol-qcow2-nocapacity", + VIR_VOL_XML_PARSE_NO_CAPACITY); return ret == 0 ? EXIT_SUCCESS : EXIT_FAILURE; }