2024-01-03 03:22:36 +00:00
|
|
|
// SPDX-License-Identifier: MPL-2.0
|
|
|
|
|
|
2022-12-30 03:22:04 +00:00
|
|
|
use super::Inode;
|
|
|
|
|
use crate::prelude::*;
|
|
|
|
|
|
|
|
|
|
#[derive(Debug, Clone)]
|
|
|
|
|
pub struct SuperBlock {
|
2023-07-03 05:29:02 +00:00
|
|
|
pub magic: u64,
|
2022-12-30 03:22:04 +00:00
|
|
|
pub bsize: usize,
|
|
|
|
|
pub blocks: usize,
|
|
|
|
|
pub bfree: usize,
|
|
|
|
|
pub bavail: usize,
|
|
|
|
|
pub files: usize,
|
|
|
|
|
pub ffree: usize,
|
2023-07-03 05:29:02 +00:00
|
|
|
pub fsid: u64,
|
2022-12-30 03:22:04 +00:00
|
|
|
pub namelen: usize,
|
|
|
|
|
pub frsize: usize,
|
2023-07-03 05:29:02 +00:00
|
|
|
pub flags: u64,
|
2022-12-30 03:22:04 +00:00
|
|
|
}
|
|
|
|
|
|
2023-01-05 08:55:58 +00:00
|
|
|
impl SuperBlock {
|
2023-07-03 05:29:02 +00:00
|
|
|
pub fn new(magic: u64, block_size: usize, name_max_len: usize) -> Self {
|
2023-01-05 08:55:58 +00:00
|
|
|
Self {
|
|
|
|
|
magic,
|
|
|
|
|
bsize: block_size,
|
|
|
|
|
blocks: 0,
|
|
|
|
|
bfree: 0,
|
|
|
|
|
bavail: 0,
|
|
|
|
|
files: 0,
|
|
|
|
|
ffree: 0,
|
|
|
|
|
fsid: 0,
|
2023-07-03 05:29:02 +00:00
|
|
|
namelen: name_max_len,
|
2023-01-05 08:55:58 +00:00
|
|
|
frsize: block_size,
|
|
|
|
|
flags: 0,
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-27 05:53:29 +00:00
|
|
|
bitflags! {
|
|
|
|
|
pub struct FsFlags: u32 {
|
|
|
|
|
/// Dentry cannot be evicted.
|
|
|
|
|
const DENTRY_UNEVICTABLE = 1 << 1;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-27 05:55:13 +00:00
|
|
|
pub trait FileSystem: Any + Sync + Send {
|
2022-12-30 03:22:04 +00:00
|
|
|
fn sync(&self) -> Result<()>;
|
|
|
|
|
|
|
|
|
|
fn root_inode(&self) -> Arc<dyn Inode>;
|
|
|
|
|
|
|
|
|
|
fn sb(&self) -> SuperBlock;
|
2023-03-27 05:53:29 +00:00
|
|
|
|
|
|
|
|
fn flags(&self) -> FsFlags;
|
2023-03-27 05:55:13 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
impl dyn FileSystem {
|
|
|
|
|
pub fn downcast_ref<T: FileSystem>(&self) -> Option<&T> {
|
2023-05-25 02:36:18 +00:00
|
|
|
(self as &dyn Any).downcast_ref::<T>()
|
2023-03-27 05:55:13 +00:00
|
|
|
}
|
2022-12-30 03:22:04 +00:00
|
|
|
}
|
2023-08-04 04:00:22 +00:00
|
|
|
|
|
|
|
|
impl Debug for dyn FileSystem {
|
|
|
|
|
fn fmt(&self, f: &mut core::fmt::Formatter) -> core::fmt::Result {
|
|
|
|
|
f.debug_struct("FileSystem")
|
|
|
|
|
.field("super_block", &self.sb())
|
|
|
|
|
.field("flags", &self.flags())
|
|
|
|
|
.finish()
|
|
|
|
|
}
|
|
|
|
|
}
|