summary refs log tree commit diff
path: root/disk/src/qcow/qcow_raw_file.rs
diff options
context:
space:
mode:
authorA. Cody Schuffelen <schuffelen@google.com>2019-12-26 13:05:10 -0800
committerCommit Bot <commit-bot@chromium.org>2020-02-25 20:28:07 +0000
commit5ad3bc345904b252efd6dd2ef4853f5ee06ae3c5 (patch)
tree16b281f8be0f7daa06cd8b98937e8395ab589f2a /disk/src/qcow/qcow_raw_file.rs
parent0275efb3a00b2cbe15ec92a314bf163a3ca1433e (diff)
downloadcrosvm-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.rs12
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)
+    }
 }