diff --git a/kernel/Cargo.lock b/kernel/Cargo.lock index c1dd7a0..e7232ad 100644 --- a/kernel/Cargo.lock +++ b/kernel/Cargo.lock @@ -396,12 +396,15 @@ dependencies = [ [[package]] name = "rcore-fs" version = "0.1.0" -source = "git+https://github.com/rcore-os/rcore-fs#6f282baf2fe928d2c9774e526e63125684855221" +source = "git+https://github.com/rcore-os/rcore-fs#41ccb1675cbea1df079f39fdc1bcd50c609df707" +dependencies = [ + "spin 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "rcore-fs-sfs" version = "0.1.0" -source = "git+https://github.com/rcore-os/rcore-fs#6f282baf2fe928d2c9774e526e63125684855221" +source = "git+https://github.com/rcore-os/rcore-fs#41ccb1675cbea1df079f39fdc1bcd50c609df707" dependencies = [ "bitvec 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/kernel/src/drivers/block/ahci.rs b/kernel/src/drivers/block/ahci.rs index 189c6e4..f86b909 100644 --- a/kernel/src/drivers/block/ahci.rs +++ b/kernel/src/drivers/block/ahci.rs @@ -48,8 +48,6 @@ pub fn init(_irq: Option, header: usize, size: usize) -> Arc { let ahci = AHCI::new(header, size); let driver = Arc::new(AHCIDriver(Mutex::new(ahci))); DRIVERS.write().push(driver.clone()); - BLK_DRIVERS - .write() - .push(Arc::new(BlockDriver(driver.clone()))); + BLK_DRIVERS.write().push(driver.clone()); driver } diff --git a/kernel/src/drivers/block/virtio_blk.rs b/kernel/src/drivers/block/virtio_blk.rs index fd38b64..3a561f4 100644 --- a/kernel/src/drivers/block/virtio_blk.rs +++ b/kernel/src/drivers/block/virtio_blk.rs @@ -222,5 +222,5 @@ pub fn virtio_blk_init(node: &Node) { let driver = Arc::new(driver); DRIVERS.write().push(driver.clone()); - BLK_DRIVERS.write().push(Arc::new(BlockDriver(driver))); + BLK_DRIVERS.write().push(driver); } diff --git a/kernel/src/drivers/mod.rs b/kernel/src/drivers/mod.rs index de559ce..bc9bba8 100644 --- a/kernel/src/drivers/mod.rs +++ b/kernel/src/drivers/mod.rs @@ -7,7 +7,7 @@ use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr, Ipv4Address}; use spin::RwLock; use crate::sync::Condvar; -use rcore_fs::dev::BlockDevice; +use rcore_fs::dev::{self, BlockDevice, DevError}; #[allow(dead_code)] pub mod block; @@ -95,19 +95,29 @@ lazy_static! { // NOTE: RwLock only write when initializing drivers pub static ref DRIVERS: RwLock>> = RwLock::new(Vec::new()); pub static ref NET_DRIVERS: RwLock>> = RwLock::new(Vec::new()); - pub static ref BLK_DRIVERS: RwLock>> = RwLock::new(Vec::new()); + pub static ref BLK_DRIVERS: RwLock>> = RwLock::new(Vec::new()); } -pub struct BlockDriver(Arc); +pub struct BlockDriver(pub Arc); impl BlockDevice for BlockDriver { const BLOCK_SIZE_LOG2: u8 = 9; // 512 - fn read_at(&self, block_id: usize, buf: &mut [u8]) -> bool { - self.0.read_block(block_id, buf) + fn read_at(&self, block_id: usize, buf: &mut [u8]) -> dev::Result<()> { + match self.0.read_block(block_id, buf) { + true => Ok(()), + false => Err(DevError), + } } - fn write_at(&self, block_id: usize, buf: &[u8]) -> bool { - self.0.write_block(block_id, buf) + fn write_at(&self, block_id: usize, buf: &[u8]) -> dev::Result<()> { + match self.0.write_block(block_id, buf) { + true => Ok(()), + false => Err(DevError), + } + } + + fn sync(&self) -> dev::Result<()> { + Ok(()) } } diff --git a/kernel/src/fs/device.rs b/kernel/src/fs/device.rs index dc33ed8..dfe2cc4 100644 --- a/kernel/src/fs/device.rs +++ b/kernel/src/fs/device.rs @@ -19,34 +19,42 @@ impl MemBuf { } impl Device for MemBuf { - fn read_at(&self, offset: usize, buf: &mut [u8]) -> Option { + fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result { let slice = self.0.read(); let len = buf.len().min(slice.len() - offset); buf[..len].copy_from_slice(&slice[offset..offset + len]); - Some(len) + Ok(len) } - fn write_at(&self, offset: usize, buf: &[u8]) -> Option { + fn write_at(&self, offset: usize, buf: &[u8]) -> Result { let mut slice = self.0.write(); let len = buf.len().min(slice.len() - offset); slice[offset..offset + len].copy_from_slice(&buf[..len]); - Some(len) + Ok(len) + } + fn sync(&self) -> Result<()> { + Ok(()) } } #[cfg(target_arch = "x86_64")] impl BlockDevice for ide::IDE { const BLOCK_SIZE_LOG2: u8 = 9; - fn read_at(&self, block_id: usize, buf: &mut [u8]) -> bool { + fn read_at(&self, block_id: usize, buf: &mut [u8]) -> Result<()> { use core::slice; assert!(buf.len() >= ide::BLOCK_SIZE); let buf = unsafe { slice::from_raw_parts_mut(buf.as_ptr() as *mut u32, ide::BLOCK_SIZE / 4) }; - self.read(block_id as u64, 1, buf).is_ok() + self.read(block_id as u64, 1, buf).map_err(|_| DevError)?; + Ok(()) } - fn write_at(&self, block_id: usize, buf: &[u8]) -> bool { + fn write_at(&self, block_id: usize, buf: &[u8]) -> Result<()> { use core::slice; assert!(buf.len() >= ide::BLOCK_SIZE); let buf = unsafe { slice::from_raw_parts(buf.as_ptr() as *mut u32, ide::BLOCK_SIZE / 4) }; - self.write(block_id as u64, 1, buf).is_ok() + self.write(block_id as u64, 1, buf).map_err(|_| DevError)?; + Ok(()) + } + fn sync(&self) -> Result<()> { + Ok(()) } } diff --git a/kernel/src/fs/mod.rs b/kernel/src/fs/mod.rs index 7217ae3..4a378ad 100644 --- a/kernel/src/fs/mod.rs +++ b/kernel/src/fs/mod.rs @@ -1,8 +1,11 @@ use alloc::{sync::Arc, vec::Vec}; use rcore_fs::vfs::*; +use rcore_fs::dev::block_cache::BlockCache; use rcore_fs_sfs::SimpleFileSystem; +use crate::drivers::BlockDriver; + pub use self::file::*; pub use self::file_like::*; pub use self::pipe::Pipe; @@ -38,9 +41,15 @@ lazy_static! { let device = { #[cfg(any(target_arch = "riscv32", target_arch = "riscv64", target_arch = "x86_64"))] { - crate::drivers::BLK_DRIVERS.read().iter() - .next().expect("Block device not found") - .clone() + let driver = BlockDriver( + crate::drivers::BLK_DRIVERS + .read().iter() + .next().expect("Block device not found") + .clone() + ); + // enable block cache + // Arc::new(BlockCache::new(driver, 0x100)) + Arc::new(driver) } #[cfg(target_arch = "aarch64")] { diff --git a/user b/user index aec8667..b6a3477 160000 --- a/user +++ b/user @@ -1 +1 @@ -Subproject commit aec8667eb056cb564e301d6c0937da1e4500a4d3 +Subproject commit b6a347750531be125583107b6d0fc307366fdcc9