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;
}