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)
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 ((enum virStorageFileFeature) i) {
+ case VIR_STORAGE_FILE_FEATURE_LAZY_REFCOUNTS:
+ if (STREQ_NULLABLE(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_NONE:
+ 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
_("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)) {
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);
"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);
+ DO_TEST(true, "pool-dir", "vol-qcow2-0.10-lazy", NULL, "qcow2-0.10-lazy", 0,
+ FMT_OPTIONS);
return ret==0 ? EXIT_SUCCESS : EXIT_FAILURE;
}