From 9966f3a93cb5c463a4f7ab53eff7d7559b71f2c8 Mon Sep 17 00:00:00 2001 From: Tristan Deloche Date: Fri, 25 Sep 2026 19:51:23 +0100 Subject: [PATCH 1/3] utils.qemu - use qemu-img convert-based check for --target-is-zero support probe Due to changes in the format of `qemu-img --help` in Qemu 10.x, the previous logic always returns false, as --target-is-zero is no longer a top-level suggested flag. The flag continues showing in qemu-img convert --help however. The whole skipZero feature appears unused by native CloudStack, but this preserves the support while remaining backwards compatible with Qemu 8.x ie: ``` $ qemu-img --version && qemu-img convert --help | grep target-is-zero qemu-img version 10.1.0 (qemu-kvm-10.1.0-17.el9_8.5) Copyright (c) 2003-2025 Fabrice Bellard and the QEMU Project developers [-n] [--target-is-zero] [-c] --target-is-zero ``` ``` $ qemu-img --version && qemu-img convert --help | grep target-is-zero qemu-img version 8.2.0 (qemu-kvm-8.2.0-11.el9_4) Copyright (c) 2003-2023 Fabrice Bellard and the QEMU Project developers convert [--object objectdef] [--image-opts] [--target-image-opts] [--target-is-zero] [--bitmaps] [-U] [-C] [-c] [-p] [-q] [-n] [-f fmt] [-t cache] [-T src_cache] [-O output_fmt] [-B backing_file [-F backing_fmt]] [-o options] [-l snapshot_param] [-S sparse_size] [-r rate_limit] [-m num_coroutines] [-W] [--salvage] filename [filename2 [...]] output_filename ``` --- .../main/java/org/apache/cloudstack/utils/qemu/QemuImg.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java index e51c80e521c7..41588f0f5684 100644 --- a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java +++ b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java @@ -122,8 +122,8 @@ public enum BitmapOperation { /** * Create a QemuImg object that supports skipping target zeroes - * We detect this support via qemu-img help since support can - * be backported rather than found in a specific version. + * We detect this support via qemu-img convert --help since support + * can be backported rather than found in a specific version. * * @param timeout script timeout, default 0 * @param skipZeroIfSupported Don't write zeroes to target device during convert, if supported by qemu-img @@ -132,7 +132,7 @@ public enum BitmapOperation { public QemuImg(final long timeout, final boolean skipZeroIfSupported, final boolean noCache) throws LibvirtException { if (skipZeroIfSupported) { final Script s = new Script(_qemuImgPath, timeout); - s.add("--help"); + s.add("convert --help"); final OutputInterpreter.AllLinesParser parser = new OutputInterpreter.AllLinesParser(); final String result = s.execute(parser); From e4e8088027a7b71bfd7c322f44f4dc4db6b8c9da Mon Sep 17 00:00:00 2001 From: Tristan Deloche Date: Fri, 25 Sep 2026 19:46:14 +0100 Subject: [PATCH 2/3] utils.qemu - use create-based disk format support detection Due to changes in the format of `qemu-img --help` in Qemu 10.x, the previous logic always returns false: ``` $ qemu-img --help ... Supported image formats: blkdebug blklogwrites blkverify compress copy-before-write copy-on-read file ftp ftps host_cdrom host_device http https io_uring luks nbd null-aio null-co nvme nvme-io_uring preallocate qcow2 quorum raw rbd snapshot-access throttle vdi vhdx virtio-blk-vfio-pci virtio-blk-vhost-user virtio-blk-vhost-vdpa vmdk vpc ``` The approach of doing a create -f $format -o help and relying on the exit code is more robust as a first level probe --- .../java/org/apache/cloudstack/utils/qemu/QemuImg.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java index 41588f0f5684..0211fb1a485d 100644 --- a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java +++ b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java @@ -911,6 +911,16 @@ public void setSkipTargetVolumeCreation(boolean skipTargetVolumeCreation) { } public boolean supportsImageFormat(QemuImg.PhysicalDiskFormat format) { + // qemu-img create -f $format -o help + // - prints supported format options with rc=0 on known format, and + // - error message with rc=1 on unsupported formet + final Script createProbe = new Script(_qemuImgPath, timeout); + createProbe.add("create", "-f", format.toString(), "-o", "help"); + String createProbeResult = createProbe.execute(new OutputInterpreter.AllLinesParser()); + if (createProbeResult == null) { + return true; + } + final Script s = new Script(_qemuImgPath, timeout); s.add("--help"); From eef39c86f39e045398124c4814cedac02f27f2d8 Mon Sep 17 00:00:00 2001 From: Suresh Kumar Anaparti Date: Tue, 29 Sep 2026 17:48:49 +0530 Subject: [PATCH 3/3] Fix comments and command syntax in QemuImg.java Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> --- .../main/java/org/apache/cloudstack/utils/qemu/QemuImg.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java index 0211fb1a485d..a0e24a7df8a0 100644 --- a/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java +++ b/plugins/hypervisors/kvm/src/main/java/org/apache/cloudstack/utils/qemu/QemuImg.java @@ -132,7 +132,7 @@ public enum BitmapOperation { public QemuImg(final long timeout, final boolean skipZeroIfSupported, final boolean noCache) throws LibvirtException { if (skipZeroIfSupported) { final Script s = new Script(_qemuImgPath, timeout); - s.add("convert --help"); + s.add("convert", "--help"); final OutputInterpreter.AllLinesParser parser = new OutputInterpreter.AllLinesParser(); final String result = s.execute(parser); @@ -913,7 +913,7 @@ public void setSkipTargetVolumeCreation(boolean skipTargetVolumeCreation) { public boolean supportsImageFormat(QemuImg.PhysicalDiskFormat format) { // qemu-img create -f $format -o help // - prints supported format options with rc=0 on known format, and - // - error message with rc=1 on unsupported formet + // - error message with rc=1 on unsupported format final Script createProbe = new Script(_qemuImgPath, timeout); createProbe.add("create", "-f", format.toString(), "-o", "help"); String createProbeResult = createProbe.execute(new OutputInterpreter.AllLinesParser());