From 7de07e802efe64631bca99aaed9ca12b849b902a Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Sun, 4 Sep 2022 20:27:16 -0600 Subject: [PATCH] 0.5.1 - add DiskIo type --- Cargo.toml | 2 +- src/disk/io.rs | 38 ++++++++++++++++++++++++++++++++++++++ src/disk/mod.rs | 4 ++++ 3 files changed, 43 insertions(+), 1 deletion(-) create mode 100644 src/disk/io.rs diff --git a/Cargo.toml b/Cargo.toml index c8f4390422..b26a28a4ca 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,7 +2,7 @@ name = "redoxfs" description = "The Redox Filesystem" repository = "https://gitlab.redox-os.org/redox-os/redoxfs" -version = "0.5.0" +version = "0.5.1" license-file = "LICENSE" readme = "README.md" authors = ["Jeremy Soller "] diff --git a/src/disk/io.rs b/src/disk/io.rs new file mode 100644 index 0000000000..5b20a8f3f6 --- /dev/null +++ b/src/disk/io.rs @@ -0,0 +1,38 @@ +use std::io::{Read, Seek, SeekFrom, Write}; +use syscall::error::{Error, Result, EIO}; + +use crate::disk::Disk; +use crate::BLOCK_SIZE; + +macro_rules! try_disk { + ($expr:expr) => { + match $expr { + Ok(val) => val, + Err(err) => { + eprintln!("Disk I/O Error: {}", err); + return Err(Error::new(EIO)); + } + } + }; +} + +pub struct DiskIo(pub T); + +impl Disk for DiskIo { + unsafe fn read_at(&mut self, block: u64, buffer: &mut [u8]) -> Result { + try_disk!(self.0.seek(SeekFrom::Start(block * BLOCK_SIZE))); + let count = try_disk!(self.0.read(buffer)); + Ok(count) + } + + unsafe fn write_at(&mut self, block: u64, buffer: &[u8]) -> Result { + try_disk!(self.0.seek(SeekFrom::Start(block * BLOCK_SIZE))); + let count = try_disk!(self.0.write(buffer)); + Ok(count) + } + + fn size(&mut self) -> Result { + let size = try_disk!(self.0.seek(SeekFrom::End(0))); + Ok(size) + } +} diff --git a/src/disk/mod.rs b/src/disk/mod.rs index e0db25ec65..547355d205 100644 --- a/src/disk/mod.rs +++ b/src/disk/mod.rs @@ -5,6 +5,8 @@ pub use self::cache::DiskCache; #[cfg(feature = "std")] pub use self::file::DiskFile; #[cfg(feature = "std")] +pub use self::io::DiskIo; +#[cfg(feature = "std")] pub use self::sparse::DiskSparse; #[cfg(feature = "std")] @@ -12,6 +14,8 @@ mod cache; #[cfg(feature = "std")] mod file; #[cfg(feature = "std")] +mod io; +#[cfg(feature = "std")] mod sparse; /// A disk