From c565d4eb88ad964339ee99f966910c9e9069d291 Mon Sep 17 00:00:00 2001 From: Dylan Reid Date: Fri, 24 Apr 2026 17:07:11 -0700 Subject: [PATCH] virtio-devices: block: don't kill worker on per-request errors The guest can cause submit and completion failures with malformed chains or invalid addresses. However, this shouldn't permanently stall the device and terminate the worker. Genuine reset-worthy failures set needs_reset and return `Ok` anyways and will more cleanly reset the worker. Signed-off-by: Dylan Reid --- virtio-devices/src/block.rs | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/virtio-devices/src/block.rs b/virtio-devices/src/block.rs index 09d5d9692..528946026 100644 --- a/virtio-devices/src/block.rs +++ b/virtio-devices/src/block.rs @@ -417,9 +417,10 @@ Setting device status to 'NEEDS_RESET' and stopping processing queues until rese } fn process_queue_submit_and_signal(&mut self) -> result::Result<(), EpollHelperError> { - self.process_queue_submit().map_err(|e| { - EpollHelperError::HandleEvent(anyhow!("Failed to process queue (submit): {e:?}")) - })?; + // Per-request errors are logged but non-device fatal. + if let Err(e) = self.process_queue_submit() { + warn!("Failed to process queue (submit): {e:?}"); + } self.try_signal_used_queue() } @@ -672,11 +673,9 @@ impl EpollHelperHandler for BlockEpollHandler { EpollHelperError::HandleEvent(anyhow!("Failed to get queue event: {e:?}")) })?; - self.process_queue_complete().map_err(|e| { - EpollHelperError::HandleEvent(anyhow!( - "Failed to process queue (complete): {e:?}" - )) - })?; + if let Err(e) = self.process_queue_complete() { + warn!("Failed to process queue (complete): {e:?}"); + } self.try_signal_used_queue()?;