Quellcode durchsuchen

trait FileSystem增加统一接口

MemoryShore vor 10 Monaten
Ursprung
Commit
98c9be54a1
3 geänderte Dateien mit 46 neuen und 15 gelöschten Zeilen
  1. 17 0
      kernel/src/filesystem/fat/fs.rs
  2. 16 0
      kernel/src/filesystem/vfs/mod.rs
  3. 13 15
      kernel/src/mm/fault.rs

+ 17 - 0
kernel/src/filesystem/fat/fs.rs

@@ -12,11 +12,14 @@ use alloc::{
     vec::Vec,
 };
 
+use crate::arch::mm::PageMapper;
 use crate::driver::base::device::device_number::DeviceNumber;
 use crate::filesystem::vfs::file::PageCache;
 use crate::filesystem::vfs::utils::DName;
 use crate::filesystem::vfs::{Magic, SpecialNodeData, SuperBlock};
 use crate::ipc::pipe::LockedPipeInode;
+use crate::mm::fault::{PageFaultHandler, PageFaultMessage};
+use crate::mm::VmFaultReason;
 use crate::{
     driver::base::block::{block_device::LBA_SIZE, disk_info::Partition, SeekFrom},
     filesystem::vfs::{
@@ -275,6 +278,20 @@ impl FileSystem for FATFileSystem {
             FAT_MAX_NAMELEN,
         )
     }
+
+    unsafe fn fault(&self, pfm: &mut PageFaultMessage, mapper: &mut PageMapper) -> VmFaultReason {
+        PageFaultHandler::filemap_fault(pfm, mapper)
+    }
+
+    unsafe fn map_pages(
+        &self,
+        pfm: &mut PageFaultMessage,
+        mapper: &mut PageMapper,
+        start_pgoff: usize,
+        end_pgoff: usize,
+    ) -> VmFaultReason {
+        PageFaultHandler::filemap_map_pages(pfm, mapper, start_pgoff, end_pgoff)
+    }
 }
 
 impl FATFileSystem {

+ 16 - 0
kernel/src/filesystem/vfs/mod.rs

@@ -12,6 +12,7 @@ use intertrait::CastFromSync;
 use system_error::SystemError;
 
 use crate::{
+    arch::mm::PageMapper,
     driver::base::{
         block::block_device::BlockDevice, char::CharDevice, device::device_number::DeviceNumber,
     },
@@ -20,6 +21,7 @@ use crate::{
         casting::DowncastArc,
         spinlock::{SpinLock, SpinLockGuard},
     },
+    mm::{fault::PageFaultMessage, VmFaultReason},
     time::PosixTimeSpec,
 };
 
@@ -814,6 +816,20 @@ pub trait FileSystem: Any + Sync + Send + Debug {
     fn name(&self) -> &str;
 
     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")
+    }
+
+    unsafe fn map_pages(
+        &self,
+        _pfm: &mut PageFaultMessage,
+        _mapper: &mut PageMapper,
+        _start_pgoff: usize,
+        _end_pgoff: usize,
+    ) -> VmFaultReason {
+        panic!("map_pages() has not yet been implemented for this filesystem")
+    }
 }
 
 impl DowncastArc for dyn FileSystem {

+ 13 - 15
kernel/src/mm/fault.rs

@@ -317,6 +317,7 @@ impl PageFaultHandler {
         //     crate::process::ProcessManager::current_pid().data()
         // );
         // TODO https://code.dragonos.org.cn/xref/linux-6.6.21/mm/memory.c#do_cow_fault
+        let file = pfm.vma().lock().vm_file().unwrap();
 
         let mut ret = Self::filemap_fault(pfm, mapper);
 
@@ -338,21 +339,14 @@ impl PageFaultHandler {
         pfm: &mut PageFaultMessage,
         mapper: &mut PageMapper,
     ) -> VmFaultReason {
-        // panic!(
-        //     "do_read_fault has not yet been implemented,
-        // fault message: {:?},
-        // pid: {}\n",
-        //     pfm,
-        //     crate::process::ProcessManager::current_pid().data()
-        // );
-
-        // TODO https://code.dragonos.org.cn/xref/linux-6.6.21/mm/memory.c#do_read_fault
+        let fs = pfm.vma().lock().vm_file().unwrap().inode().fs();
 
-        let mut ret = Self::do_fault_around(pfm.clone(), mapper);
+        let mut ret = Self::do_fault_around(pfm, mapper);
         if !ret.is_empty() {
             return ret;
         }
-        ret = Self::filemap_fault(pfm, mapper);
+
+        ret = fs.fault(pfm, mapper);
 
         ret = ret.union(Self::finish_fault(pfm, mapper));
 
@@ -484,7 +478,10 @@ impl PageFaultHandler {
     ///
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
-    pub unsafe fn do_fault_around(pfm: PageFaultMessage, mapper: &mut PageMapper) -> VmFaultReason {
+    pub unsafe fn do_fault_around(
+        pfm: &mut PageFaultMessage,
+        mapper: &mut PageMapper,
+    ) -> VmFaultReason {
         if mapper.get_table(*pfm.address(), 0).is_none() {
             mapper
                 .allocate_table(*pfm.address(), 0)
@@ -534,9 +531,10 @@ impl PageFaultHandler {
             return VmFaultReason::VM_FAULT_OOM;
         }
 
+        let fs = pfm.vma().lock().vm_file().unwrap().inode().fs();
         // from_pte - pte_pgoff得出预读起始pte相对缺失页的偏移,加上pfm.file_pgoff(缺失页在文件中的偏移)得出起始页在文件中的偏移,结束pte同理
-        Self::filemap_map_pages(
-            pfm.clone(),
+        fs.map_pages(
+            pfm,
             mapper,
             file_pgoff + (from_pte - pte_pgoff),
             file_pgoff + (to_pte - pte_pgoff),
@@ -554,7 +552,7 @@ impl PageFaultHandler {
     /// ## 返回值
     /// - VmFaultReason: 页面错误处理信息标志
     pub unsafe fn filemap_map_pages(
-        pfm: PageFaultMessage,
+        pfm: &mut PageFaultMessage,
         mapper: &mut PageMapper,
         start_pgoff: usize,
         end_pgoff: usize,