From 6df7cda4ad342d65fcb66a25e3e469f7be6bb20d Mon Sep 17 00:00:00 2001 From: Muminul Islam Date: Fri, 27 Mar 2026 23:49:58 -0700 Subject: [PATCH] block: Implement AsyncDiskFile trait for RawFileDiskAio Add disk_file::AsyncDiskFile trait implementation for RawFileDiskAio with try_clone() and new_async_io() methods. try_clone() duplicates the underlying file descriptor and wraps it in a new RawFileDiskAio. new_async_io() creates a RawFileAsyncAio (Linux AIO) backend, wrapping errors in BlockError instead of DiskFileError. Signed-off-by: Muminul Islam --- block/src/raw_async_aio.rs | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/block/src/raw_async_aio.rs b/block/src/raw_async_aio.rs index 9a990c105..74e161152 100644 --- a/block/src/raw_async_aio.rs +++ b/block/src/raw_async_aio.rs @@ -117,6 +117,24 @@ impl disk_file::Resizable for RawFileDiskAio { impl disk_file::DiskFile for RawFileDiskAio {} +impl disk_file::AsyncDiskFile for RawFileDiskAio { + fn try_clone(&self) -> BlockResult> { + let file = self + .file + .try_clone() + .map_err(|e| BlockError::new(BlockErrorKind::Io, DiskFileError::Clone(e)))?; + Ok(Box::new(RawFileDiskAio { file })) + } + + fn new_async_io(&self, ring_depth: u32) -> BlockResult> { + let mut raw = RawFileAsyncAio::new(self.file.as_raw_fd(), ring_depth) + .map_err(|e| BlockError::new(BlockErrorKind::Io, DiskFileError::NewAsyncIo(e)))?; + raw.alignment = + DiskTopology::probe(&self.file).map_or(SECTOR_SIZE, |t| t.logical_block_size); + Ok(Box::new(raw) as Box) + } +} + pub struct RawFileAsyncAio { fd: RawFd, ctx: aio::IoContext,