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 <philipp.schuster@cyberus-technology.de>
On-behalf-of: SAP philipp.schuster@sap.com
This commit is contained in:
Philipp Schuster 2025-05-19 09:51:26 +02:00 committed by Rob Bradford
parent a615c809eb
commit 28e0a95450
5 changed files with 23 additions and 23 deletions

View file

@ -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

View file

@ -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)]

View file

@ -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;

View file

@ -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)]

View file

@ -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 {