MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / decompress_l2_cluster

Method decompress_l2_cluster

block/src/qcow/mod.rs:1396–1422  ·  view source on GitHub ↗

Decompress the cluster, return EIO on failure

(&mut self, l2_entry: u64)

Source from the content-addressed store, hash-verified

1394
1395 // Decompress the cluster, return EIO on failure
1396 fn decompress_l2_cluster(&mut self, l2_entry: u64) -> std::io::Result<Vec<u8>> {
1397 let (compressed_cluster_addr, compressed_cluster_size) =
1398 l2_entry_compressed_cluster_layout(l2_entry, self.header.cluster_bits);
1399 // Read compressed cluster from raw file
1400 self.raw_file
1401 .file_mut()
1402 .seek(SeekFrom::Start(compressed_cluster_addr))?;
1403 let mut compressed_cluster = vec![0; compressed_cluster_size];
1404 self.raw_file
1405 .file_mut()
1406 .read_exact(&mut compressed_cluster)?;
1407 let decoder = self.header.get_decoder();
1408 // Decompress
1409 let cluster_size = self.raw_file.cluster_size() as usize;
1410 let mut decompressed_cluster = vec![0; cluster_size];
1411 let decompressed_size = decoder
1412 .decode(&compressed_cluster, &mut decompressed_cluster)
1413 .map_err(|_| {
1414 self.set_corrupt_bit_best_effort();
1415 io::Error::from_raw_os_error(EIO)
1416 })?;
1417 if decompressed_size as u64 != self.raw_file.cluster_size() {
1418 self.set_corrupt_bit_best_effort();
1419 return Err(std::io::Error::from_raw_os_error(EIO));
1420 }
1421 Ok(decompressed_cluster)
1422 }
1423
1424 fn file_read(
1425 &mut self,

Callers 2

file_readMethod · 0.45
file_offset_writeMethod · 0.45

Calls 7

file_mutMethod · 0.80
get_decoderMethod · 0.80
decodeMethod · 0.80
seekMethod · 0.45
cluster_sizeMethod · 0.45

Tested by

no test coverage detected