diff --git a/qcow/src/qcow.rs b/qcow/src/qcow.rs index 2fafcd0f3..c86320580 100755 --- a/qcow/src/qcow.rs +++ b/qcow/src/qcow.rs @@ -1065,11 +1065,7 @@ impl QcowFile { fn get_new_cluster(&mut self) -> std::io::Result { // First use a pre allocated cluster if one is available. if let Some(free_cluster) = self.avail_clusters.pop() { - let cluster_size = self.raw_file.cluster_size() as usize; - self.raw_file - .file_mut() - .seek(SeekFrom::Start(free_cluster))?; - self.raw_file.file_mut().write_zeroes(cluster_size)?; + self.raw_file.zero_cluster(free_cluster)?; return Ok(free_cluster); } diff --git a/qcow/src/qcow_raw_file.rs b/qcow/src/qcow_raw_file.rs index dab57c5ff..55f8a1e25 100644 --- a/qcow/src/qcow_raw_file.rs +++ b/qcow/src/qcow_raw_file.rs @@ -7,6 +7,7 @@ use std::io::{self, BufWriter, Seek, SeekFrom}; use std::mem::size_of; use byteorder::{BigEndian, ReadBytesExt, WriteBytesExt}; +use vmm_sys_util::WriteZeroes; /// A qcow file. Allows reading/writing clusters and appending clusters. #[derive(Debug)] @@ -133,6 +134,14 @@ impl QcowRawFile { pub fn cluster_offset(&self, address: u64) -> u64 { address & self.cluster_mask } + + /// Zeros out a cluster in the file. + pub fn zero_cluster(&mut self, address: u64) -> io::Result<()> { + let cluster_size = self.cluster_size as usize; + self.file.seek(SeekFrom::Start(address))?; + self.file.write_zeroes(cluster_size)?; + Ok(()) + } } impl Clone for QcowRawFile {