// Copyright © 2021 Intel Corporation // // SPDX-License-Identifier: Apache-2.0 AND BSD-3-Clause use thiserror::Error; use vmm_sys_util::eventfd::EventFd; #[derive(Error, Debug)] pub enum DiskFileError { /// Failed getting disk file size. #[error("Failed getting disk file size: {0}")] Size(#[source] std::io::Error), /// Failed creating a new AsyncIo. #[error("Failed creating a new AsyncIo: {0}")] NewAsyncIo(#[source] std::io::Error), } #[derive(Debug)] pub struct DiskTopology { pub logical_block_size: u64, pub physical_block_size: u64, pub minimum_io_size: u64, pub optimal_io_size: u64, } impl Default for DiskTopology { fn default() -> Self { Self { logical_block_size: 512, physical_block_size: 512, minimum_io_size: 512, optimal_io_size: 0, } } } pub type DiskFileResult = std::result::Result; pub trait DiskFile: Send + Sync { fn size(&mut self) -> DiskFileResult; fn new_async_io(&self, ring_depth: u32) -> DiskFileResult>; fn topology(&mut self) -> DiskTopology { DiskTopology::default() } } #[derive(Error, Debug)] pub enum AsyncIoError { /// Failed vectored reading from file. #[error("Failed vectored reading from file: {0}")] ReadVectored(#[source] std::io::Error), /// Failed vectored writing to file. #[error("Failed vectored writing to file: {0}")] WriteVectored(#[source] std::io::Error), /// Failed synchronizing file. #[error("Failed synchronizing file: {0}")] Fsync(#[source] std::io::Error), } pub type AsyncIoResult = std::result::Result; pub trait AsyncIo: Send + Sync { fn notifier(&self) -> &EventFd; fn read_vectored( &mut self, offset: libc::off_t, iovecs: Vec, user_data: u64, ) -> AsyncIoResult<()>; fn write_vectored( &mut self, offset: libc::off_t, iovecs: Vec, user_data: u64, ) -> AsyncIoResult<()>; fn fsync(&mut self, user_data: Option) -> AsyncIoResult<()>; fn complete(&mut self) -> Vec<(u64, i32)>; }