From 16abb28b85c131c331f84e20ff666bb5b7b24453 Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Sat, 18 Apr 2026 00:20:34 +0200 Subject: [PATCH] block: qcow: Test compressed cluster read via QcowDiskSync Write a known data pattern to a QCOW2 image, convert all allocated clusters to compressed format using compress_allocated_clusters, reopen the image through QcowDiskSync, and verify that reading back the full cluster returns the original data. Signed-off-by: Anatol Belski --- block/src/qcow_sync.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/block/src/qcow_sync.rs b/block/src/qcow_sync.rs index d33a2fd6a..4d80349d0 100644 --- a/block/src/qcow_sync.rs +++ b/block/src/qcow_sync.rs @@ -448,6 +448,7 @@ mod unit_tests { use super::*; use crate::disk_file::{AsyncDiskFile, DiskSize, Resizable}; use crate::qcow::{BackingFileConfig, ImageType, QcowFile, RawFile}; + use crate::qcow_common::unit_tests::compress_allocated_clusters; fn create_disk_with_data( file_size: u64, @@ -1933,4 +1934,20 @@ mod unit_tests { let abuf = AlignedBuf::new(513, 512).unwrap(); assert_eq!(abuf.layout().size(), 1024); } + + #[test] + fn test_compressed_read() { + let cluster_size = 65536usize; + let data: Vec = (0..=255).cycle().take(cluster_size).collect(); + let (temp, disk) = create_disk_with_data(100 * 1024 * 1024, &data, 0, false, false); + drop(disk); + + compress_allocated_clusters(&mut temp.as_file().try_clone().unwrap()); + + let disk = + QcowDiskSync::new(temp.as_file().try_clone().unwrap(), false, false, false).unwrap(); + + let buf = async_read(&disk, 0, cluster_size); + assert_eq!(buf, data); + } }