MCPcopy Create free account
hub / github.com/cloud-hypervisor/cloud-hypervisor / execute

Method execute

block/src/request.rs:183–235  ·  view source on GitHub ↗
(
        &self,
        disk: &mut T,
        disk_nsectors: u64,
        mem: &vm_memory::GuestMemoryMmap<B>,
        serial: &[u8],
    )

Source from the content-addressed store, hash-verified

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,

Callers 1

process_queueMethod · 0.80

Calls 6

newFunction · 0.85
check_data_boundsMethod · 0.80
as_sliceMethod · 0.80
seekMethod · 0.45
flushMethod · 0.45
lenMethod · 0.45

Tested by

no test coverage detected