(
mut file: RawFile,
header: &QcowHeader,
sparse: bool,
)
| 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>>) { |
nothing calls this directly
no test coverage detected