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

Method new_from_header

block/src/qcow/mod.rs:765–794  ·  view source on GitHub ↗
(
        mut file: RawFile,
        header: &QcowHeader,
        sparse: bool,
    )

Source from the content-addressed store, hash-verified

763 }
764
765 fn new_from_header(
766 mut file: RawFile,
767 header: &QcowHeader,
768 sparse: bool,
769 ) -> BlockResult<QcowFile> {
770 file.rewind()
771 .map_err(|e| BlockError::new(BlockErrorKind::Io, Error::SeekingFile(e)))?;
772 header
773 .write_to(&mut file)
774 .map_err(|e| BlockError::new(BlockErrorKind::Io, e))?;
775
776 let mut qcow = Self::from_with_nesting_depth(file, MAX_NESTING_DEPTH, sparse)?;
777
778 // Set the refcount for each refcount table cluster.
779 let cluster_size = 0x01u64 << qcow.header.cluster_bits;
780 let refcount_table_base = qcow.header.refcount_table_offset;
781 let end_cluster_addr =
782 refcount_table_base + u64::from(qcow.header.refcount_table_clusters) * cluster_size;
783
784 let mut cluster_addr = 0;
785 while cluster_addr < end_cluster_addr {
786 let mut unref_clusters = qcow.set_cluster_refcount(cluster_addr, 1).map_err(|e| {
787 BlockError::new(BlockErrorKind::Io, Error::SettingRefcountRefcount(e))
788 })?;
789 qcow.unref_clusters.append(&mut unref_clusters);
790 cluster_addr += cluster_size;
791 }
792
793 Ok(qcow)
794 }
795
796 #[cfg(test)]
797 pub fn set_backing_file(&mut self, backing: Option<Box<Self>>) {

Callers

nothing calls this directly

Calls 3

newFunction · 0.85
write_toMethod · 0.45
set_cluster_refcountMethod · 0.45

Tested by

no test coverage detected