(
&self,
disk: &mut T,
disk_nsectors: u64,
mem: &vm_memory::GuestMemoryMmap<B>,
serial: &[u8],
)
| 181 | } |
| 182 | |
| 183 | pub fn execute<T: Seek + Read + Write, B: Bitmap + 'static>( |
| 184 | &self, |
| 185 | disk: &mut T, |
| 186 | disk_nsectors: u64, |
| 187 | mem: &vm_memory::GuestMemoryMmap<B>, |
| 188 | serial: &[u8], |
| 189 | ) -> Result<u32, ExecuteError> { |
| 190 | self.check_data_bounds(disk_nsectors)?; |
| 191 | |
| 192 | disk.seek(SeekFrom::Start(self.sector << SECTOR_SHIFT)) |
| 193 | .map_err(ExecuteError::Seek)?; |
| 194 | let mut len = 0; |
| 195 | for (data_addr, data_len) in &self.data_descriptors { |
| 196 | match self.request_type { |
| 197 | RequestType::In => { |
| 198 | let mut buf = vec![0u8; *data_len as usize]; |
| 199 | disk.read_exact(&mut buf).map_err(ExecuteError::ReadExact)?; |
| 200 | mem.read_exact_volatile_from( |
| 201 | *data_addr, |
| 202 | &mut buf.as_slice(), |
| 203 | *data_len as usize, |
| 204 | ) |
| 205 | .map_err(ExecuteError::Read)?; |
| 206 | len += data_len; |
| 207 | } |
| 208 | RequestType::Out => { |
| 209 | let mut buf: Vec<u8> = Vec::new(); |
| 210 | mem.write_all_volatile_to(*data_addr, &mut buf, *data_len as usize) |
| 211 | .map_err(ExecuteError::Write)?; |
| 212 | disk.write_all(&buf).map_err(ExecuteError::WriteAll)?; |
| 213 | if !self.writeback { |
| 214 | disk.flush().map_err(ExecuteError::Flush)?; |
| 215 | } |
| 216 | } |
| 217 | RequestType::Flush => disk.flush().map_err(ExecuteError::Flush)?, |
| 218 | RequestType::GetDeviceId => { |
| 219 | if (*data_len as usize) < serial.len() { |
| 220 | return Err(ExecuteError::BadRequest(Error::InvalidOffset)); |
| 221 | } |
| 222 | mem.write_slice(serial, *data_addr) |
| 223 | .map_err(ExecuteError::Write)?; |
| 224 | } |
| 225 | RequestType::Discard => { |
| 226 | return Err(ExecuteError::Unsupported(VIRTIO_BLK_T_DISCARD)); |
| 227 | } |
| 228 | RequestType::WriteZeroes => { |
| 229 | return Err(ExecuteError::Unsupported(VIRTIO_BLK_T_WRITE_ZEROES)); |
| 230 | } |
| 231 | RequestType::Unsupported(t) => return Err(ExecuteError::Unsupported(t)), |
| 232 | } |
| 233 | } |
| 234 | Ok(len) |
| 235 | } |
| 236 | |
| 237 | pub fn execute_async<B: Bitmap + 'static>( |
| 238 | &mut self, |
no test coverage detected