summary refs log tree commit diff
path: root/devices/src/virtio/block.rs
diff options
context:
space:
mode:
authorDylan Reid <dgreid@chromium.org>2018-07-12 16:10:13 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-07-13 17:28:52 -0700
commit6fd0c6f223b9337e9583b9cbce1cf1cab9872076 (patch)
tree6a045177f7c493a8483207f797ea44d3f2f78214 /devices/src/virtio/block.rs
parentd1e391b8d490621974eee8b1d6464eac1f9c1bb3 (diff)
downloadcrosvm-6fd0c6f223b9337e9583b9cbce1cf1cab9872076.tar
crosvm-6fd0c6f223b9337e9583b9cbce1cf1cab9872076.tar.gz
crosvm-6fd0c6f223b9337e9583b9cbce1cf1cab9872076.tar.bz2
crosvm-6fd0c6f223b9337e9583b9cbce1cf1cab9872076.tar.lz
crosvm-6fd0c6f223b9337e9583b9cbce1cf1cab9872076.tar.xz
crosvm-6fd0c6f223b9337e9583b9cbce1cf1cab9872076.tar.zst
crosvm-6fd0c6f223b9337e9583b9cbce1cf1cab9872076.zip
devices: block: Support flush command
The "supports flush" bit wasn't set in the device features, so the guest
wasn't syncing. Handle the request, which is 0 length so needs special
casing in the `parse` function.

Change-Id: I079611df912cd077362b2ee9925cf730ba86d9e5
Signed-off-by: Dylan Reid <dgreid@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1135940
Diffstat (limited to 'devices/src/virtio/block.rs')
-rw-r--r--devices/src/virtio/block.rs19
1 files changed, 19 insertions, 0 deletions
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs
index d322388..1b9b558 100644
--- a/devices/src/virtio/block.rs
+++ b/devices/src/virtio/block.rs
@@ -28,6 +28,8 @@ const VIRTIO_BLK_S_OK: u8 = 0;
 const VIRTIO_BLK_S_IOERR: u8 = 1;
 const VIRTIO_BLK_S_UNSUPP: u8 = 2;
 
+const VIRTIO_BLK_F_FLUSH: u32 = 0x200;
+
 pub trait DiskFile: Read + Seek + Write {}
 impl<D: Read + Seek + Write> DiskFile for D {}
 
@@ -131,6 +133,16 @@ impl Request {
         }
 
         let req_type = request_type(&mem, avail_desc.addr)?;
+        if req_type == RequestType::Flush {
+            return Ok(Request {
+                request_type: req_type,
+                sector: 0,
+                data_addr: GuestAddress(0),
+                data_len: 0,
+                status_addr: GuestAddress(0),
+            })
+        }
+
         let sector = sector(&mem, avail_desc.addr)?;
         let data_desc = avail_desc
             .next_descriptor()
@@ -356,6 +368,13 @@ impl<T: 'static + AsRawFd + DiskFile + Send> VirtioDevice for Block<T> {
         keep_fds
     }
 
+    fn features(&self, page: u32) -> u32 {
+        match page {
+            0 => VIRTIO_BLK_F_FLUSH,
+            _ => 0,
+        }
+    }
+
     fn device_type(&self) -> u32 {
         TYPE_BLOCK
     }