summary refs log tree commit diff
path: root/devices/src/virtio/block.rs
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2018-12-04 13:16:05 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-01-05 20:08:27 -0800
commit2f0318fc81f0aba9e45897915a0a606edf89271f (patch)
treed00f92c41a72228bfe3542cbd94523403196b332 /devices/src/virtio/block.rs
parente57d906dbb2cfcccd491418b0a0c674a4197cf0c (diff)
downloadcrosvm-2f0318fc81f0aba9e45897915a0a606edf89271f.tar
crosvm-2f0318fc81f0aba9e45897915a0a606edf89271f.tar.gz
crosvm-2f0318fc81f0aba9e45897915a0a606edf89271f.tar.bz2
crosvm-2f0318fc81f0aba9e45897915a0a606edf89271f.tar.lz
crosvm-2f0318fc81f0aba9e45897915a0a606edf89271f.tar.xz
crosvm-2f0318fc81f0aba9e45897915a0a606edf89271f.tar.zst
crosvm-2f0318fc81f0aba9e45897915a0a606edf89271f.zip
devices: block: build config space on demand
This will allow the config space to change when a disk resize takes
place.

BUG=chromium:858815
TEST=Boot Termina on kevin

Change-Id: I115a7923097c3fd1f31535e9c48c87caa32f99d7
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1394150
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Reviewed-by: Dylan Reid <dgreid@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'devices/src/virtio/block.rs')
-rw-r--r--devices/src/virtio/block.rs10
1 files changed, 6 insertions, 4 deletions
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs
index 0371809..15e0e73 100644
--- a/devices/src/virtio/block.rs
+++ b/devices/src/virtio/block.rs
@@ -618,7 +618,7 @@ impl<T: DiskFile> Worker<T> {
 pub struct Block<T: DiskFile> {
     kill_evt: Option<EventFd>,
     disk_image: Option<T>,
-    config_space: virtio_blk_config,
+    disk_size: u64,
     avail_features: u64,
     read_only: bool,
 }
@@ -664,7 +664,7 @@ impl<T: DiskFile> Block<T> {
         Ok(Block {
             kill_evt: None,
             disk_image: Some(disk_image),
-            config_space: build_config_space(disk_size),
+            disk_size,
             avail_features,
             read_only,
         })
@@ -704,15 +704,17 @@ impl<T: 'static + AsRawFd + DiskFile + Send> VirtioDevice for Block<T> {
     }
 
     fn read_config(&self, offset: u64, mut data: &mut [u8]) {
-        let config_len = size_of_val(&self.config_space) as u64;
+        let config_space = build_config_space(self.disk_size);
+        let config_len = size_of_val(&config_space) as u64;
         if offset >= config_len {
             return;
         }
+
         if let Some(end) = offset.checked_add(data.len() as u64) {
             let offset = offset as usize;
             let end = cmp::min(end, config_len) as usize;
             // This write can't fail, offset and end are checked against config_len.
-            data.write_all(&self.config_space.as_slice()[offset..end])
+            data.write_all(&config_space.as_slice()[offset..end])
                 .unwrap();
         }
     }