From 9a14fdb7f80f0adf6f3bea9e55c3392c1ba13273 Mon Sep 17 00:00:00 2001 From: Rob Bradford Date: Mon, 20 Apr 2026 10:15:36 +0100 Subject: [PATCH] virtio-devices: block: Correctly report number of bytes written The driver needs to be notified with the number of bytes written by the device. Ensure that the correct number of bytes is reported. Signed-off-by: Rob Bradford --- virtio-devices/src/block.rs | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index 2e28c60da..8e96431e8 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -268,7 +268,7 @@ Setting device status to 'NEEDS_RESET' and stopping processing queues until rese // If no asynchronous operation has been submitted, we can // simply return the used descriptor. queue - .add_used(desc_chain.memory(), desc_chain.head_index(), 0) + .add_used(desc_chain.memory(), desc_chain.head_index(), 1) .map_err(Error::QueueAddUsed)?; queue .enable_notification(self.mem.memory().deref()) @@ -349,10 +349,17 @@ Setting device status to 'NEEDS_RESET' and stopping processing queues until rese .write_obj(status as u8, request.status_addr) .map_err(Error::RequestStatus)?; + let len = if status == VIRTIO_BLK_S_OK + && request.request_type == RequestType::GetDeviceId + { + self.serial.len() as u32 + 1 + } else { + 1 + }; // If no asynchronous operation has been submitted, we can // simply return the used descriptor. queue - .add_used(desc_chain.memory(), desc_chain.head_index(), 0) + .add_used(desc_chain.memory(), desc_chain.head_index(), len) .map_err(Error::QueueAddUsed)?; queue .enable_notification(self.mem.memory().deref()) @@ -373,7 +380,7 @@ Setting device status to 'NEEDS_RESET' and stopping processing queues until rese mem.write_obj(VIRTIO_BLK_S_IOERR as u8, request.status_addr) .map_err(Error::RequestStatus)?; queue - .add_used(mem.deref(), desc_index, 0) + .add_used(mem.deref(), desc_index, 1) .map_err(Error::QueueAddUsed)?; queue .enable_notification(mem.deref()) @@ -528,14 +535,19 @@ Setting device status to 'NEEDS_RESET' and stopping processing queues until rese .write_latency_avg .store(write_avg, Ordering::Relaxed); - (VIRTIO_BLK_S_OK as u8, result as u32) + let len = if request.request_type == RequestType::In { + result as u32 + 1 + } else { + 1 + }; + (VIRTIO_BLK_S_OK as u8, len) } else { warn!( "Request failed: {:x?} {:?}", request, io::Error::from_raw_os_error(-result) ); - (VIRTIO_BLK_S_IOERR as u8, 0) + (VIRTIO_BLK_S_IOERR as u8, 1) }; mem.write_obj(status, request.status_addr)