use bitflags::bitflags;
mod bindings;
pub mod ctrl;
pub mod ctrl_async;
pub mod helpers;
pub mod io;
pub mod sys;
#[cfg(test)]
pub mod test_helpers;
pub mod uring_async;
#[allow(deprecated)]
pub use io::{
ublk_init_task_ring, with_queue_ring, with_queue_ring_mut, with_task_io_ring,
with_task_io_ring_mut, BufDesc, BufDescList, UblkBatchBuffers, UblkBatchCompletion,
UblkBatchConfig, UblkBatchQueue,
};
pub use ctrl::{ublk_init_ctrl_task_ring, with_ctrl_ring, with_ctrl_ring_mut};
pub use uring_async::{
run_uring_tasks, ublk_reap_events_with_handler, uring_poll_io_fn, wait_and_handle_io_events,
};
#[repr(u64)]
pub enum UblkUringData {
Target = 1_u64 << 63,
NonAsync = 1_u64 << 62,
}
bitflags! {
#[derive(Default, Debug, PartialEq, Eq, Copy, Clone)]
pub struct UblkFlags: u32 {
const UBLK_DEV_F_COMP_BATCH = 0b00000001;
const UBLK_DEV_F_ADD_DEV = 0b00000010;
const UBLK_DEV_F_RECOVER_DEV = 0b00000100;
const UBLK_DEV_F_DEL_DEV_ASYNC = 0b00001000;
const UBLK_DEV_F_SINGLE_CPU_AFFINITY = 0b00010000;
const UBLK_DEV_F_MLOCK_IO_BUFFER = 0b00100000;
const UBLK_DEV_F_INTERNAL_0 = 1_u32 << 31;
const UBLK_DEV_F_INTERNAL_1 = 1_u32 << 30;
const UBLK_DEV_F_INTERNAL_2 = 1_u32 << 29;
const UBLK_DEV_F_INTERNAL_3 = 1_u32 << 28;
const UBLK_DEV_F_INTERNAL_4 = 1_u32 << 27;
}
}
macro_rules! ublk_internal_flags_all {
() => {
UblkFlags::UBLK_DEV_F_INTERNAL_0
| UblkFlags::UBLK_DEV_F_INTERNAL_1
| UblkFlags::UBLK_DEV_F_INTERNAL_2
| UblkFlags::UBLK_DEV_F_INTERNAL_3
| UblkFlags::UBLK_DEV_F_INTERNAL_4
};
}
pub(crate) use ublk_internal_flags_all;
pub enum UblkFatRes {
BatchRes(Vec<(u16, i32)>),
ZonedAppendRes((i32, u64)),
}
pub enum UblkIORes {
Result(i32),
#[cfg(feature = "fat_complete")]
FatRes(UblkFatRes),
}
#[derive(thiserror::Error, Debug)]
pub enum UblkError {
#[error("uring submission timeout")]
UringTimeout,
#[error("IO Queued")]
UringIoQueued,
#[error("io_uring IO failure")]
UringIOError(i32),
#[error("json failure")]
JsonError(#[from] serde_json::Error),
#[error("queue down failure")]
QueueIsDown,
#[error("other IO failure")]
IOError(#[from] std::io::Error),
#[error("Invalid input")]
InvalidVal,
#[error("other failure")]
OtherError(i32),
}
#[cfg(test)]
mod libublk {
use crate::{UblkError, UblkIORes};
#[cfg(not(feature = "fat_complete"))]
#[test]
fn test_feature_fat_complete() {
let sz = core::mem::size_of::<Result<UblkIORes, UblkError>>();
assert!(sz == 16);
}
#[cfg(feature = "fat_complete")]
#[test]
fn test_feature_fat_complete() {
let sz = core::mem::size_of::<Result<UblkIORes, UblkError>>();
assert!(sz == 32);
}
}