summary refs log tree commit diff
path: root/devices
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2019-01-03 09:40:01 -0800
committerchrome-bot <chrome-bot@chromium.org>2019-01-05 20:08:27 -0800
commit70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78 (patch)
tree5c132f8b936a3e2816f0b9d1302634dc8f6590c7 /devices
parent2f0318fc81f0aba9e45897915a0a606edf89271f (diff)
downloadcrosvm-70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78.tar
crosvm-70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78.tar.gz
crosvm-70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78.tar.bz2
crosvm-70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78.tar.lz
crosvm-70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78.tar.xz
crosvm-70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78.tar.zst
crosvm-70eb15dbb7cca5672c6e37e0f1853bf5b47c5a78.zip
devices: block: protect disk_size with a mutex
This will allow the disk size to be changed from the worker thread
during resize operations.

BUG=chromium:858815
TEST=build_test

Change-Id: I0b2e1a057831856b44f19c2ba30b4dd1ffdeafc3
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1394151
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')
-rw-r--r--devices/src/virtio/block.rs10
1 files changed, 7 insertions, 3 deletions
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs
index 15e0e73..ae212c3 100644
--- a/devices/src/virtio/block.rs
+++ b/devices/src/virtio/block.rs
@@ -13,6 +13,7 @@ use std::thread;
 use std::time::Duration;
 use std::u32;
 
+use sync::Mutex;
 use sys_util::Error as SysError;
 use sys_util::Result as SysResult;
 use sys_util::{
@@ -618,7 +619,7 @@ impl<T: DiskFile> Worker<T> {
 pub struct Block<T: DiskFile> {
     kill_evt: Option<EventFd>,
     disk_image: Option<T>,
-    disk_size: u64,
+    disk_size: Arc<Mutex<u64>>,
     avail_features: u64,
     read_only: bool,
 }
@@ -664,7 +665,7 @@ impl<T: DiskFile> Block<T> {
         Ok(Block {
             kill_evt: None,
             disk_image: Some(disk_image),
-            disk_size,
+            disk_size: Arc::new(Mutex::new(disk_size)),
             avail_features,
             read_only,
         })
@@ -704,7 +705,10 @@ impl<T: 'static + AsRawFd + DiskFile + Send> VirtioDevice for Block<T> {
     }
 
     fn read_config(&self, offset: u64, mut data: &mut [u8]) {
-        let config_space = build_config_space(self.disk_size);
+        let config_space = {
+            let disk_size = self.disk_size.lock();
+            build_config_space(*disk_size)
+        };
         let config_len = size_of_val(&config_space) as u64;
         if offset >= config_len {
             return;