diff options
author | A. Cody Schuffelen <schuffelen@google.com> | 2019-12-26 13:05:10 -0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-02-25 20:28:07 +0000 |
commit | 5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5 (patch) | |
tree | 16b281f8be0f7daa06cd8b98937e8395ab589f2a /disk/src/qcow/qcow_raw_file.rs | |
parent | 0275efb3a00b2cbe15ec92a314bf163a3ca1433e (diff) | |
download | crosvm-5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5.tar crosvm-5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5.tar.gz crosvm-5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5.tar.bz2 crosvm-5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5.tar.lz crosvm-5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5.tar.xz crosvm-5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5.tar.zst crosvm-5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5.zip |
Initialize qcow clusters off the backing file when present
This preserves any data that the backing file had on a cluster when doing a write to a subset of that cluster. These writes cause a performance penalty on creating new clusters if a backing file is present. TEST=unit tests BUG=b:140069322 Change-Id: I724990225617c05e5f2dea39e39ce84c940328fc Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1982832 Tested-by: kokoro <noreply+kokoro@google.com> Commit-Queue: Cody Schuffelen <schuffelen@google.com> Reviewed-by: Daniel Verkamp <dverkamp@chromium.org>
Diffstat (limited to 'disk/src/qcow/qcow_raw_file.rs')
-rw-r--r-- | disk/src/qcow/qcow_raw_file.rs | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/disk/src/qcow/qcow_raw_file.rs b/disk/src/qcow/qcow_raw_file.rs index ede28d8..09d2176 100644 --- a/disk/src/qcow/qcow_raw_file.rs +++ b/disk/src/qcow/qcow_raw_file.rs @@ -6,7 +6,8 @@ use std::fs::File; use std::io::{self, BufWriter, Read, Seek, SeekFrom, Write}; use std::mem::size_of; -use sys_util::WriteZeroes; +use data_model::VolatileMemory; +use sys_util::{FileReadWriteAtVolatile, WriteZeroes}; /// A qcow file. Allows reading/writing clusters and appending clusters. #[derive(Debug)] @@ -145,4 +146,13 @@ impl QcowRawFile { self.file.write_zeroes_all(cluster_size)?; Ok(()) } + + /// Writes + pub fn write_cluster(&mut self, address: u64, mut initial_data: Vec<u8>) -> io::Result<()> { + let raw_slice = initial_data.as_mut_slice(); + let volatile_slice = raw_slice + .get_slice(0, self.cluster_size) + .map_err(|e| io::Error::new(io::ErrorKind::Other, format!("{:?}", e)))?; + self.file.write_all_at_volatile(volatile_slice, address) + } } |