diff options
author | Daniel Verkamp <dverkamp@chromium.org> | 2018-12-04 13:16:05 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-01-05 20:08:27 -0800 |
commit | 2f0318fc81f0aba9e45897915a0a606edf89271f (patch) | |
tree | d00f92c41a72228bfe3542cbd94523403196b332 /devices/src/virtio/block.rs | |
parent | e57d906dbb2cfcccd491418b0a0c674a4197cf0c (diff) | |
download | crosvm-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.rs | 10 |
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(); } } |