diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index fc99649da..1589cda02 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -212,22 +212,29 @@ impl BlockEpollHandler { request.set_writeback(self.writeback.load(Ordering::Acquire)); - if request - .execute_async( - desc_chain.memory(), - self.disk_nsectors, - self.disk_image.as_mut(), - &self.serial, - desc_chain.head_index() as u64, - ) - .map_err(Error::RequestExecuting)? - { + let result = request.execute_async( + desc_chain.memory(), + self.disk_nsectors, + self.disk_image.as_mut(), + &self.serial, + desc_chain.head_index() as u64, + ); + + if let Ok(true) = result { self.inflight_requests .push_back((desc_chain.head_index(), request)); } else { + let status = match result { + Ok(_) => VIRTIO_BLK_S_OK, + Err(e) => { + warn!("Request failed: {:x?} {:?}", request, e); + VIRTIO_BLK_S_IOERR + } + }; + desc_chain .memory() - .write_obj(VIRTIO_BLK_S_OK as u8, request.status_addr) + .write_obj(status as u8, request.status_addr) .map_err(Error::RequestStatus)?; // If no asynchronous operation has been submitted, we can @@ -389,12 +396,12 @@ impl BlockEpollHandler { (VIRTIO_BLK_S_OK as u8, result as u32) } else { - error!( + warn!( "Request failed: {:x?} {:?}", request, io::Error::from_raw_os_error(-result) ); - return Err(Error::AsyncRequestFailure); + (VIRTIO_BLK_S_IOERR as u8, 0) }; mem.write_obj(status, request.status_addr)