From fd125947c9db0b33761414e65e919f73d9bf1815 Mon Sep 17 00:00:00 2001 From: Chuyan Zhang Date: Thu, 30 Nov 2023 12:01:11 -0800 Subject: Refactor workspace --- ayafs-core/src/block_device/disk.rs | 48 ++++++++++++++++++++++++++++++ ayafs-core/src/block_device/memory_disk.rs | 33 ++++++++++++++++++++ ayafs-core/src/block_device/mod.rs | 10 +++++++ 3 files changed, 91 insertions(+) create mode 100644 ayafs-core/src/block_device/disk.rs create mode 100644 ayafs-core/src/block_device/memory_disk.rs create mode 100644 ayafs-core/src/block_device/mod.rs (limited to 'ayafs-core/src/block_device') diff --git a/ayafs-core/src/block_device/disk.rs b/ayafs-core/src/block_device/disk.rs new file mode 100644 index 0000000..d2beee9 --- /dev/null +++ b/ayafs-core/src/block_device/disk.rs @@ -0,0 +1,48 @@ +use crate::block_device::{BlockDevice, BLOCK_SIZE}; +use std::cell::RefCell; +use std::fs::File; +use std::io::{Read, Seek, SeekFrom, Write}; +use std::path::{Path, PathBuf}; + +pub struct Disk { + disk_path: PathBuf, + device: RefCell, +} + +impl Disk { + pub fn new(disk_path: PathBuf) -> Self { + + let device = File::options() + .read(true) + .write(true) + .open(disk_path.as_path()) + .unwrap(); + // let device = File::open(disk_path.as_path()).unwrap(); + Self { + disk_path, + device: RefCell::new(device), + } + } +} + +impl BlockDevice for Disk { + fn read(&self, block_id: usize, buffer: &mut [u8]) { + let mut device = self.device.borrow_mut(); + device + .seek(SeekFrom::Start((block_id * BLOCK_SIZE) as u64)) + .expect("Unable to seek!"); + device + .read_exact(buffer) + .expect("Failed to read 4096 bytes!"); + } + + fn write(&self, block_id: usize, buffer: &[u8]) { + let mut device = self.device.borrow_mut(); + device + .seek(SeekFrom::Start((block_id * BLOCK_SIZE) as u64)) + .expect("Unable to seek!"); + device + .write_all(buffer) + .expect("Unable to write 4096 bytes!"); + } +} diff --git a/ayafs-core/src/block_device/memory_disk.rs b/ayafs-core/src/block_device/memory_disk.rs new file mode 100644 index 0000000..0639d3e --- /dev/null +++ b/ayafs-core/src/block_device/memory_disk.rs @@ -0,0 +1,33 @@ +use crate::block_device::{BlockDevice, BLOCK_SIZE}; +use std::cell::RefCell; + +#[repr(C)] +pub struct MemoryDisk { + /// Emulating a block device with a segment of RAM, + /// which is 64MiB == 4KiB per block * 16384 blocks + pub arena: RefCell>, +} + +impl MemoryDisk { + pub fn new(block_number: usize) -> Self { + Self { + arena: RefCell::new(vec![0u8; BLOCK_SIZE * block_number]), + } + } +} + +impl BlockDevice for MemoryDisk { + fn read(&self, block_id: usize, buffer: &mut [u8]) { + let block_front = block_id * BLOCK_SIZE; + let block_back = block_front + BLOCK_SIZE; + let arena = self.arena.borrow(); + buffer.copy_from_slice(&arena[block_front..block_back]); + } + + fn write(&self, block_id: usize, buffer: &[u8]) { + let block_front = block_id * BLOCK_SIZE; + let block_back = block_front + BLOCK_SIZE; + let mut arena = self.arena.borrow_mut(); + arena[block_front..block_back].copy_from_slice(buffer); + } +} diff --git a/ayafs-core/src/block_device/mod.rs b/ayafs-core/src/block_device/mod.rs new file mode 100644 index 0000000..53394a9 --- /dev/null +++ b/ayafs-core/src/block_device/mod.rs @@ -0,0 +1,10 @@ +pub mod disk; +/// Abstracts for block devices. +/// Currently only a mock memory disk. +pub mod memory_disk; + +pub const BLOCK_SIZE: usize = 4096; +pub trait BlockDevice { + fn read(&self, block_id: usize, buffer: &mut [u8]); + fn write(&self, block_id: usize, buffer: &[u8]); +} -- cgit v1.2.3-70-g09d2