Răsfoiți Sursa

MountFS实现文件映射相关接口

MemoryShore 10 luni în urmă
părinte
comite
d5b5718375

+ 8 - 2
kernel/src/filesystem/vfs/mod.rs

@@ -818,7 +818,10 @@ pub trait FileSystem: Any + Sync + Send + Debug {
     fn super_block(&self) -> SuperBlock;
 
     unsafe fn fault(&self, _pfm: &mut PageFaultMessage, _mapper: &mut PageMapper) -> VmFaultReason {
-        panic!("fault() has not yet been implemented for this filesystem")
+        panic!(
+            "fault() has not yet been implemented for filesystem: {}",
+            crate::libs::name::get_type_name(&self)
+        )
     }
 
     unsafe fn map_pages(
@@ -828,7 +831,10 @@ pub trait FileSystem: Any + Sync + Send + Debug {
         _start_pgoff: usize,
         _end_pgoff: usize,
     ) -> VmFaultReason {
-        panic!("map_pages() has not yet been implemented for this filesystem")
+        panic!(
+            "map_pages() has not yet been implemented for filesystem: {}",
+            crate::libs::name::get_type_name(&self)
+        )
     }
 }
 

+ 17 - 0
kernel/src/filesystem/vfs/mount.rs

@@ -12,6 +12,7 @@ use alloc::{
 use system_error::SystemError;
 
 use crate::{
+    arch::mm::PageMapper,
     driver::base::device::device_number::DeviceNumber,
     filesystem::vfs::ROOT_INODE,
     libs::{
@@ -19,6 +20,7 @@ use crate::{
         rwlock::RwLock,
         spinlock::{SpinLock, SpinLockGuard},
     },
+    mm::{fault::PageFaultMessage, VmFaultReason},
 };
 
 use super::{
@@ -553,6 +555,21 @@ impl FileSystem for MountFS {
     fn super_block(&self) -> SuperBlock {
         SuperBlock::new(Magic::MOUNT_MAGIC, MOUNTFS_BLOCK_SIZE, MOUNTFS_MAX_NAMELEN)
     }
+
+    unsafe fn fault(&self, pfm: &mut PageFaultMessage, mapper: &mut PageMapper) -> VmFaultReason {
+        self.inner_filesystem.fault(pfm, mapper)
+    }
+
+    unsafe fn map_pages(
+        &self,
+        pfm: &mut PageFaultMessage,
+        mapper: &mut PageMapper,
+        start_pgoff: usize,
+        end_pgoff: usize,
+    ) -> VmFaultReason {
+        self.inner_filesystem
+            .map_pages(pfm, mapper, start_pgoff, end_pgoff)
+    }
 }
 
 /// MountList

+ 1 - 0
kernel/src/libs/mod.rs

@@ -27,3 +27,4 @@ pub mod rand;
 pub mod wait_queue;
 
 pub mod font;
+pub mod name;

+ 13 - 0
kernel/src/libs/name.rs

@@ -0,0 +1,13 @@
+use core::any::type_name;
+
+use alloc::string::{String, ToString};
+
+#[allow(dead_code)]
+pub fn get_full_type_name<T>(_: &T) -> String {
+    type_name::<T>().to_string()
+}
+
+pub fn get_type_name<T>(_: &T) -> String {
+    let full_name = type_name::<T>();
+    full_name[(full_name.rfind("::").unwrap_or(0) + 2)..].to_string()
+}