From 28e0a9545079dbb1655ce56e9ab06714f8eab231 Mon Sep 17 00:00:00 2001 From: Philipp Schuster Date: Mon, 19 May 2025 09:51:26 +0200 Subject: [PATCH] misc: virtio-devices: streamline #[source] and Error This streamlines the code base to follow best practices for error handling in Rust: Each error struct implements std::error::Error (most due via thiserror::Error derive macro) and sets its source accordingly. This allows future work that nicely prints the error chains, for example. So far, the convention is that each error prints its sub error as part of its Display::fmt() impl. Signed-off-by: Philipp Schuster On-behalf-of: SAP philipp.schuster@sap.com --- virtio-devices/src/balloon.rs | 14 +++++++------- virtio-devices/src/console.rs | 10 +++++----- virtio-devices/src/epoll_helper.rs | 14 +++++++------- virtio-devices/src/pmem.rs | 4 ++-- virtio-devices/src/rng.rs | 4 ++-- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/virtio-devices/src/balloon.rs b/virtio-devices/src/balloon.rs index 924475f0e..070158cfd 100644 --- a/virtio-devices/src/balloon.rs +++ b/virtio-devices/src/balloon.rs @@ -65,27 +65,27 @@ const VIRTIO_BALLOON_F_REPORTING: u64 = 5; #[derive(Error, Debug)] pub enum Error { #[error("Guest gave us bad memory addresses.: {0}")] - GuestMemory(GuestMemoryError), + GuestMemory(#[source] GuestMemoryError), #[error("Guest gave us a write only descriptor that protocol says to read from")] UnexpectedWriteOnlyDescriptor, #[error("Guest sent us invalid request")] InvalidRequest, #[error("Fallocate fail.: {0}")] - FallocateFail(std::io::Error), + FallocateFail(#[source] std::io::Error), #[error("Madvise fail.: {0}")] - MadviseFail(std::io::Error), + MadviseFail(#[source] std::io::Error), #[error("Failed to EventFd write.: {0}")] - EventFdWriteFail(std::io::Error), + EventFdWriteFail(#[source] std::io::Error), #[error("Invalid queue index: {0}")] InvalidQueueIndex(usize), #[error("Fail tp signal: {0}")] - FailedSignal(io::Error), + FailedSignal(#[source] io::Error), #[error("Descriptor chain is too short")] DescriptorChainTooShort, #[error("Failed adding used index: {0}")] - QueueAddUsed(virtio_queue::Error), + QueueAddUsed(#[source] virtio_queue::Error), #[error("Failed creating an iterator over the queue: {0}")] - QueueIterator(virtio_queue::Error), + QueueIterator(#[source] virtio_queue::Error), } // Got from include/uapi/linux/virtio_balloon.h diff --git a/virtio-devices/src/console.rs b/virtio-devices/src/console.rs index 64dbca21f..da96a336d 100644 --- a/virtio-devices/src/console.rs +++ b/virtio-devices/src/console.rs @@ -52,15 +52,15 @@ enum Error { #[error("Descriptor chain too short")] DescriptorChainTooShort, #[error("Failed to read from guest memory: {0}")] - GuestMemoryRead(vm_memory::guest_memory::Error), + GuestMemoryRead(#[source] vm_memory::guest_memory::Error), #[error("Failed to write to guest memory: {0}")] - GuestMemoryWrite(vm_memory::guest_memory::Error), + GuestMemoryWrite(#[source] vm_memory::guest_memory::Error), #[error("Failed to write_all output: {0}")] - OutputWriteAll(io::Error), + OutputWriteAll(#[source] io::Error), #[error("Failed to flush output: {0}")] - OutputFlush(io::Error), + OutputFlush(#[source] io::Error), #[error("Failed to add used index: {0}")] - QueueAddUsed(virtio_queue::Error), + QueueAddUsed(#[source] virtio_queue::Error), } #[derive(Copy, Clone, Debug, Serialize, Deserialize)] diff --git a/virtio-devices/src/epoll_helper.rs b/virtio-devices/src/epoll_helper.rs index 3f78768f7..8ef080e64 100644 --- a/virtio-devices/src/epoll_helper.rs +++ b/virtio-devices/src/epoll_helper.rs @@ -25,19 +25,19 @@ pub struct EpollHelper { #[derive(Error, Debug)] pub enum EpollHelperError { #[error("Failed to create Fd: {0}")] - CreateFd(std::io::Error), + CreateFd(#[source] std::io::Error), #[error("Failed to epoll_ctl: {0}")] - Ctl(std::io::Error), + Ctl(#[source] std::io::Error), #[error("IO error: {0}")] - IoError(std::io::Error), + IoError(#[source] std::io::Error), #[error("Failed to epoll_wait: {0}")] - Wait(std::io::Error), + Wait(#[source] std::io::Error), #[error("Failed to get virtio-queue index: {0}")] - QueueRingIndex(virtio_queue::Error), + QueueRingIndex(#[source] virtio_queue::Error), #[error("Failed to handle virtio device events: {0}")] - HandleEvent(anyhow::Error), + HandleEvent(#[source] anyhow::Error), #[error("Failed to handle timeout: {0}")] - HandleTimeout(anyhow::Error), + HandleTimeout(#[source] anyhow::Error), } pub const EPOLL_HELPER_EVENT_PAUSE: u16 = 0; diff --git a/virtio-devices/src/pmem.rs b/virtio-devices/src/pmem.rs index d46cdd6f2..7df772955 100644 --- a/virtio-devices/src/pmem.rs +++ b/virtio-devices/src/pmem.rs @@ -76,7 +76,7 @@ unsafe impl ByteValued for VirtioPmemResp {} #[derive(Error, Debug)] enum Error { #[error("Bad guest memory addresses: {0}")] - GuestMemory(GuestMemoryError), + GuestMemory(#[source] GuestMemoryError), #[error("Unexpected write-only descriptor")] UnexpectedWriteOnlyDescriptor, #[error("Unexpected read-only descriptor")] @@ -88,7 +88,7 @@ enum Error { #[error("Invalid request")] InvalidRequest, #[error("Failed adding used index: {0}")] - QueueAddUsed(virtio_queue::Error), + QueueAddUsed(#[source] virtio_queue::Error), } #[derive(Debug, PartialEq, Eq)] diff --git a/virtio-devices/src/rng.rs b/virtio-devices/src/rng.rs index 918285ac7..f89e18068 100644 --- a/virtio-devices/src/rng.rs +++ b/virtio-devices/src/rng.rs @@ -42,9 +42,9 @@ enum Error { #[error("Invalid descriptor")] InvalidDescriptor, #[error("Failed to write to guest memory: {0}")] - GuestMemoryWrite(vm_memory::guest_memory::Error), + GuestMemoryWrite(#[source] vm_memory::guest_memory::Error), #[error("Failed adding used index: {0}")] - QueueAddUsed(virtio_queue::Error), + QueueAddUsed(#[source] virtio_queue::Error), } struct RngEpollHandler {