diff options
author | Dylan Reid <dgreid@chromium.org> | 2018-07-12 16:10:13 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-07-13 17:28:52 -0700 |
commit | 6fd0c6f223b9337e9583b9cbce1cf1cab9872076 (patch) | |
tree | 6a045177f7c493a8483207f797ea44d3f2f78214 /devices/src/virtio/block.rs | |
parent | d1e391b8d490621974eee8b1d6464eac1f9c1bb3 (diff) | |
download | crosvm-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.rs | 19 |
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 } |