Forráskód Böngészése

优化PageCache的创建

MemoryShore 8 hónapja
szülő
commit
b5aea85b8f

+ 8 - 15
kernel/src/filesystem/fat/fs.rs

@@ -123,7 +123,7 @@ pub struct FATInode {
     dname: DName,
 
     /// 页缓存
-    page_cache: Arc<PageCache>,
+    page_cache: Option<Arc<PageCache>>,
 }
 
 impl FATInode {
@@ -193,8 +193,6 @@ impl LockedFATInode {
             FileType::File
         };
 
-        let mut page_cache = PageCache::default();
-
         let inode: Arc<LockedFATInode> = Arc::new(LockedFATInode(SpinLock::new(FATInode {
             parent,
             self_ref: Weak::default(),
@@ -223,23 +221,18 @@ impl LockedFATInode {
             },
             special_node: None,
             dname,
-            page_cache: Arc::new(PageCache::default()),
+            page_cache: None,
         })));
 
-        page_cache.inode = Some(Arc::downgrade(&inode) as Weak<dyn IndexNode>);
-
-        inode.0.lock().page_cache = Arc::new(page_cache);
+        if !inode.0.lock().inode_type.is_dir() {
+            let page_cache = PageCache::new(Some(Arc::downgrade(&inode) as Weak<dyn IndexNode>));
+            inode.0.lock().page_cache = Some(page_cache);
+        }
 
         inode.0.lock().self_ref = Arc::downgrade(&inode);
 
         inode.0.lock().update_metadata();
 
-        // inode
-        //     .0
-        //     .lock()
-        //     .page_cache
-        //     .set_inode(Arc::downgrade(&inode) as Weak<dyn IndexNode>);
-
         return inode;
     }
 }
@@ -380,7 +373,7 @@ impl FATFileSystem {
             },
             special_node: None,
             dname: DName::default(),
-            page_cache: Arc::new(PageCache::default()),
+            page_cache: None,
         })));
 
         let result: Arc<FATFileSystem> = Arc::new(FATFileSystem {
@@ -1877,7 +1870,7 @@ impl IndexNode for LockedFATInode {
     }
 
     fn page_cache(&self) -> Option<Arc<PageCache>> {
-        Some(self.0.lock().page_cache.clone())
+        self.0.lock().page_cache.clone()
     }
 }
 

+ 9 - 10
kernel/src/filesystem/vfs/file.rs

@@ -125,7 +125,7 @@ impl FileMode {
 /// 页面缓存
 pub struct PageCache {
     xarray: SpinLock<XArray<Arc<Page>>>,
-    pub inode: Option<Weak<dyn IndexNode>>,
+    inode: Option<Weak<dyn IndexNode>>,
 }
 
 impl core::fmt::Debug for PageCache {
@@ -145,11 +145,16 @@ impl core::fmt::Debug for PageCache {
 }
 
 impl PageCache {
-    pub fn new(inode: Option<Weak<dyn IndexNode>>) -> PageCache {
-        Self {
+    pub fn new(inode: Option<Weak<dyn IndexNode>>) -> Arc<PageCache> {
+        let page_cache = Self {
             xarray: SpinLock::new(XArray::new()),
             inode,
-        }
+        };
+        Arc::new(page_cache)
+    }
+
+    pub fn inode(&self) -> Option<Weak<dyn IndexNode>> {
+        self.inode.clone()
     }
 
     pub fn add_page(&self, offset: usize, page: &Arc<Page>) {
@@ -176,12 +181,6 @@ impl PageCache {
     }
 }
 
-impl Default for PageCache {
-    fn default() -> Self {
-        Self::new(None)
-    }
-}
-
 /// @brief 抽象文件结构体
 #[derive(Debug)]
 pub struct File {

+ 1 - 1
kernel/src/mm/page.rs

@@ -250,7 +250,7 @@ impl PageReclaimer {
             .page_cache
             .clone()
             .unwrap()
-            .inode
+            .inode()
             .clone()
             .unwrap()
             .upgrade()