summary refs log tree commit diff
path: root/qcow
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2018-09-27 18:23:59 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-10-13 14:55:25 -0700
commit6b28917b83a99b5638fee0931114586da1ec9dba (patch)
tree3236984466ffa1c185930d0448b2b56a95f5587d /qcow
parentabbe0c8cf0e5c418d46f0c6c4cabbd02b6702bd0 (diff)
downloadcrosvm-6b28917b83a99b5638fee0931114586da1ec9dba.tar
crosvm-6b28917b83a99b5638fee0931114586da1ec9dba.tar.gz
crosvm-6b28917b83a99b5638fee0931114586da1ec9dba.tar.bz2
crosvm-6b28917b83a99b5638fee0931114586da1ec9dba.tar.lz
crosvm-6b28917b83a99b5638fee0931114586da1ec9dba.tar.xz
crosvm-6b28917b83a99b5638fee0931114586da1ec9dba.tar.zst
crosvm-6b28917b83a99b5638fee0931114586da1ec9dba.zip
qcow: create BufWriter with exact capacity
Rather than using the default BufWriter capacity (currently 8K),
calculate the exact size required to contain the table.  This further
consolidates the write() system calls to the minimum required.

BUG=chromium:891335
TEST=Manually verify expected write() calls with strace

Change-Id: I9ade77024e60a92d30b65beb07c2385e5dacc167
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1250035
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Diffstat (limited to 'qcow')
-rw-r--r--qcow/src/qcow_raw_file.rs4
1 files changed, 2 insertions, 2 deletions
diff --git a/qcow/src/qcow_raw_file.rs b/qcow/src/qcow_raw_file.rs
index c178b3c..7d97b78 100644
--- a/qcow/src/qcow_raw_file.rs
+++ b/qcow/src/qcow_raw_file.rs
@@ -66,7 +66,7 @@ impl QcowRawFile {
         non_zero_flags: u64,
     ) -> io::Result<()> {
         self.file.seek(SeekFrom::Start(offset))?;
-        let mut buffer = BufWriter::new(&self.file);
+        let mut buffer = BufWriter::with_capacity(table.len() * size_of::<u64>(), &self.file);
         for addr in table {
             let val = if *addr == 0 {
                 0
@@ -91,7 +91,7 @@ impl QcowRawFile {
     /// Writes a refcount block to the file.
     pub fn write_refcount_block(&mut self, offset: u64, table: &[u16]) -> io::Result<()> {
         self.file.seek(SeekFrom::Start(offset))?;
-        let mut buffer = BufWriter::new(&self.file);
+        let mut buffer = BufWriter::with_capacity(table.len() * size_of::<u16>(), &self.file);
         for count in table {
             buffer.write_u16::<BigEndian>(*count)?;
         }