summary refs log tree commit diff
path: root/devices/src/virtio/block.rs
diff options
context:
space:
mode:
authorSonny Rao <sonnyrao@chromium.org>2018-04-27 15:37:55 -0700
committerchrome-bot <chrome-bot@chromium.org>2018-05-04 03:02:42 -0700
commitcaaeb044603f2f4859b29a93cb16730d85afcb3d (patch)
tree6fab937eacfcc5690d9cd0a9e0b2154397605fdc /devices/src/virtio/block.rs
parent5622f125847cc4c478020897cf7c9d5a45e185eb (diff)
downloadcrosvm-caaeb044603f2f4859b29a93cb16730d85afcb3d.tar
crosvm-caaeb044603f2f4859b29a93cb16730d85afcb3d.tar.gz
crosvm-caaeb044603f2f4859b29a93cb16730d85afcb3d.tar.bz2
crosvm-caaeb044603f2f4859b29a93cb16730d85afcb3d.tar.lz
crosvm-caaeb044603f2f4859b29a93cb16730d85afcb3d.tar.xz
crosvm-caaeb044603f2f4859b29a93cb16730d85afcb3d.tar.zst
crosvm-caaeb044603f2f4859b29a93cb16730d85afcb3d.zip
devices: block: add sector info to block errors
This would have been useful in figuring out recent bugs in the block
sub system.

BUG=chromium:837453
TEST=manual test on kevin with qcow device

Change-Id: I3e3360bb0226e3cd7052e0431ce555cfef5e091b
Reviewed-on: https://chromium-review.googlesource.com/1034013
Commit-Ready: Sonny Rao <sonnyrao@chromium.org>
Tested-by: Sonny Rao <sonnyrao@chromium.org>
Reviewed-by: Zach Reizner <zachr@chromium.org>
Diffstat (limited to 'devices/src/virtio/block.rs')
-rw-r--r--devices/src/virtio/block.rs37
1 files changed, 28 insertions, 9 deletions
diff --git a/devices/src/virtio/block.rs b/devices/src/virtio/block.rs
index 2faa45d..d322388 100644
--- a/devices/src/virtio/block.rs
+++ b/devices/src/virtio/block.rs
@@ -82,9 +82,22 @@ fn sector(mem: &GuestMemory, desc_addr: GuestAddress) -> result::Result<u64, Par
 #[derive(Debug)]
 enum ExecuteError {
     Flush(io::Error),
-    Read(GuestAddress, u32, GuestMemoryError),
-    Seek(io::Error),
-    Write(GuestAddress, u32, GuestMemoryError),
+    Read {
+        addr: GuestAddress,
+        length: u32,
+        sector: u64,
+        guestmemerr: GuestMemoryError
+    },
+    Seek {
+        ioerr: io::Error,
+        sector: u64
+    },
+    Write {
+        addr: GuestAddress,
+        length: u32,
+        sector: u64,
+        guestmemerr: GuestMemoryError
+    },
     Unsupported(u32),
 }
 
@@ -92,9 +105,9 @@ impl ExecuteError {
     fn status(&self) -> u8 {
         match self {
             &ExecuteError::Flush(_) => VIRTIO_BLK_S_IOERR,
-            &ExecuteError::Read(_, _, _) => VIRTIO_BLK_S_IOERR,
-            &ExecuteError::Seek(_) => VIRTIO_BLK_S_IOERR,
-            &ExecuteError::Write(_, _, _) => VIRTIO_BLK_S_IOERR,
+            &ExecuteError::Read{ .. } => VIRTIO_BLK_S_IOERR,
+            &ExecuteError::Seek{ .. } => VIRTIO_BLK_S_IOERR,
+            &ExecuteError::Write{ .. } => VIRTIO_BLK_S_IOERR,
             &ExecuteError::Unsupported(_) => VIRTIO_BLK_S_UNSUPP,
         }
     }
@@ -157,16 +170,22 @@ impl Request {
                                        mem: &GuestMemory)
                                        -> result::Result<u32, ExecuteError> {
         disk.seek(SeekFrom::Start(self.sector << SECTOR_SHIFT))
-            .map_err(ExecuteError::Seek)?;
+            .map_err(|e| ExecuteError::Seek{ ioerr: e, sector: self.sector })?;
         match self.request_type {
             RequestType::In => {
                 mem.read_to_memory(self.data_addr, disk, self.data_len as usize)
-                    .map_err(|e| ExecuteError::Read(self.data_addr, self.data_len, e))?;
+                    .map_err(|e| ExecuteError::Read{ addr: self.data_addr,
+                                                     length: self.data_len,
+                                                     sector: self.sector,
+                                                     guestmemerr: e })?;
                 return Ok(self.data_len);
             }
             RequestType::Out => {
                 mem.write_from_memory(self.data_addr, disk, self.data_len as usize)
-                    .map_err(|e| ExecuteError::Write(self.data_addr, self.data_len, e))?;
+                    .map_err(|e| ExecuteError::Write{ addr: self.data_addr,
+                                                      length: self.data_len,
+                                                      sector: self.sector,
+                                                      guestmemerr: e })?;
             }
             RequestType::Flush => disk.flush().map_err(ExecuteError::Flush)?,
             RequestType::Unsupported(t) => return Err(ExecuteError::Unsupported(t)),