From 899c2df248a4cb9c42ae2b41d6550a296530583b Mon Sep 17 00:00:00 2001 From: Anatol Belski Date: Thu, 2 Jul 2026 23:06:34 +0200 Subject: [PATCH] block: qcow: Make the qcow image compressor test positional Convert the qcow image compressor test helper to positional access instead of the cursor. Test only change. Assisted-by: Claude:Opus-4.8 Signed-off-by: Anatol Belski --- block/src/formats/qcow/common.rs | 44 +++++++++++++++++--------------- 1 file changed, 24 insertions(+), 20 deletions(-) diff --git a/block/src/formats/qcow/common.rs b/block/src/formats/qcow/common.rs index 6253ff11f..b2e0f3f98 100644 --- a/block/src/formats/qcow/common.rs +++ b/block/src/formats/qcow/common.rs @@ -37,9 +37,9 @@ pub fn decompress_cluster( #[cfg(test)] pub(crate) mod unit_tests { use std::fs::File; - use std::io::{Read, Seek, SeekFrom, Write}; + use std::io::Write; + use std::os::unix::fs::FileExt; - use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; use flate2::Compression; use flate2::write::DeflateEncoder; @@ -68,26 +68,30 @@ pub(crate) mod unit_tests { /// Compress every allocated cluster in a QCOW2 image file in place. pub fn compress_allocated_clusters(file: &mut File) { - file.seek(SeekFrom::Start(HEADER_CLUSTER_BITS_OFFSET)) + let mut buf4 = [0u8; 4]; + file.read_exact_at(&mut buf4, HEADER_CLUSTER_BITS_OFFSET) .unwrap(); - let cluster_bits = file.read_u32::().unwrap(); + let cluster_bits = u32::from_be_bytes(buf4); let cluster_size = 1u64 << cluster_bits; - file.seek(SeekFrom::Start(HEADER_L1_SIZE_OFFSET)).unwrap(); - let l1_size = file.read_u32::().unwrap(); + file.read_exact_at(&mut buf4, HEADER_L1_SIZE_OFFSET) + .unwrap(); + let l1_size = u32::from_be_bytes(buf4); - file.seek(SeekFrom::Start(HEADER_L1_TABLE_OFFSET)).unwrap(); - let l1_table_offset = file.read_u64::().unwrap(); + let mut buf8 = [0u8; 8]; + file.read_exact_at(&mut buf8, HEADER_L1_TABLE_OFFSET) + .unwrap(); + let l1_table_offset = u64::from_be_bytes(buf8); let entries_per_l2 = cluster_size / 8; - let mut append_offset = file.seek(SeekFrom::End(0)).unwrap(); + let mut append_offset = file.metadata().unwrap().len(); append_offset = (append_offset + 511) & !511; for l1_idx in 0..l1_size as u64 { let l1_entry_offset = l1_table_offset + l1_idx * 8; - file.seek(SeekFrom::Start(l1_entry_offset)).unwrap(); - let l1_entry = file.read_u64::().unwrap(); + file.read_exact_at(&mut buf8, l1_entry_offset).unwrap(); + let l1_entry = u64::from_be_bytes(buf8); let l2_table_addr = l1_entry & L1_L2_ADDR_MASK; if l2_table_addr == 0 { @@ -96,8 +100,8 @@ pub(crate) mod unit_tests { for l2_idx in 0..entries_per_l2 { let l2_entry_offset = l2_table_addr + l2_idx * 8; - file.seek(SeekFrom::Start(l2_entry_offset)).unwrap(); - let l2_entry = file.read_u64::().unwrap(); + file.read_exact_at(&mut buf8, l2_entry_offset).unwrap(); + let l2_entry = u64::from_be_bytes(buf8); if l2_entry & CLUSTER_USED_FLAG == 0 || l2_entry & COMPRESSED_FLAG != 0 { continue; @@ -109,26 +113,26 @@ pub(crate) mod unit_tests { } let mut cluster_data = vec![0u8; cluster_size as usize]; - file.seek(SeekFrom::Start(host_cluster_addr)).unwrap(); - file.read_exact(&mut cluster_data).unwrap(); + file.read_exact_at(&mut cluster_data, host_cluster_addr) + .unwrap(); let mut encoder = DeflateEncoder::new(Vec::new(), Compression::default()); encoder.write_all(&cluster_data).unwrap(); let compressed = encoder.finish().unwrap(); - file.seek(SeekFrom::Start(append_offset)).unwrap(); - file.write_all(&compressed).unwrap(); + file.write_all_at(&compressed, append_offset).unwrap(); let padded_len = (compressed.len() + 511) & !511; if padded_len > compressed.len() { let padding = vec![0u8; padded_len - compressed.len()]; - file.write_all(&padding).unwrap(); + file.write_all_at(&padding, append_offset + compressed.len() as u64) + .unwrap(); } let new_entry = make_compressed_l2_entry(append_offset, compressed.len(), cluster_bits); - file.seek(SeekFrom::Start(l2_entry_offset)).unwrap(); - file.write_u64::(new_entry).unwrap(); + file.write_all_at(&new_entry.to_be_bytes(), l2_entry_offset) + .unwrap(); append_offset += padded_len as u64; }