From f4ea23b72ccb22c471402e9d332015483380affb Mon Sep 17 00:00:00 2001 From: LI Qing Date: Thu, 16 May 2024 15:04:42 +0800 Subject: [PATCH] Revise the pages() method in the page cache to only return a reference --- kernel/aster-nix/src/fs/exfat/inode.rs | 14 ++++++-------- kernel/aster-nix/src/fs/ext2/inode.rs | 2 +- kernel/aster-nix/src/fs/ramfs/fs.rs | 2 +- kernel/aster-nix/src/fs/utils/page_cache.rs | 4 ++-- 4 files changed, 10 insertions(+), 12 deletions(-) diff --git a/kernel/aster-nix/src/fs/exfat/inode.rs b/kernel/aster-nix/src/fs/exfat/inode.rs index d45dc6b33..f75c90058 100644 --- a/kernel/aster-nix/src/fs/exfat/inode.rs +++ b/kernel/aster-nix/src/fs/exfat/inode.rs @@ -235,7 +235,7 @@ impl ExfatInodeInner { return Ok((0, 0)); } - let iterator = ExfatDentryIterator::new(self.page_cache.pages(), 0, Some(self.size))?; + let iterator = ExfatDentryIterator::new(self.page_cache.pages().dup(), 0, Some(self.size))?; let mut sub_inodes = 0; let mut sub_dirs = 0; for dentry_result in iterator { @@ -301,10 +301,8 @@ impl ExfatInodeInner { // Need to read the latest dentry set from parent inode. - let mut dentry_set = ExfatDentrySet::read_from( - page_cache.dup().unwrap(), - self.dentry_entry as usize * DENTRY_SIZE, - )?; + let mut dentry_set = + ExfatDentrySet::read_from(page_cache.dup(), self.dentry_entry as usize * DENTRY_SIZE)?; let mut file_dentry = dentry_set.get_file_dentry(); let mut stream_dentry = dentry_set.get_stream_dentry(); @@ -366,7 +364,7 @@ impl ExfatInodeInner { let fs = self.fs(); let cluster_size = fs.cluster_size(); - let mut iter = ExfatDentryIterator::new(self.page_cache.pages(), offset, None)?; + let mut iter = ExfatDentryIterator::new(self.page_cache.pages().dup(), offset, None)?; let mut dir_read = 0; let mut current_off = offset; @@ -809,7 +807,7 @@ impl ExfatInode { let inner = self.inner.upread(); let dentry_iterator = - ExfatDentryIterator::new(inner.page_cache.pages(), 0, Some(inner.size))?; + ExfatDentryIterator::new(inner.page_cache.pages().dup(), 0, Some(inner.size))?; let mut contiguous_unused = 0; let mut entry_id = 0; @@ -1197,7 +1195,7 @@ impl Inode for ExfatInode { } fn page_cache(&self) -> Option> { - Some(self.inner.read().page_cache.pages()) + Some(self.inner.read().page_cache.pages().dup()) } fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result { diff --git a/kernel/aster-nix/src/fs/ext2/inode.rs b/kernel/aster-nix/src/fs/ext2/inode.rs index ae10cb721..7fcba9859 100644 --- a/kernel/aster-nix/src/fs/ext2/inode.rs +++ b/kernel/aster-nix/src/fs/ext2/inode.rs @@ -67,7 +67,7 @@ impl Inode { } pub fn page_cache(&self) -> Vmo { - self.inner.read().page_cache.pages() + self.inner.read().page_cache.pages().dup() } pub fn create( diff --git a/kernel/aster-nix/src/fs/ramfs/fs.rs b/kernel/aster-nix/src/fs/ramfs/fs.rs index e8651c72d..522a5968d 100644 --- a/kernel/aster-nix/src/fs/ramfs/fs.rs +++ b/kernel/aster-nix/src/fs/ramfs/fs.rs @@ -458,7 +458,7 @@ impl Inode for RamInode { .read() .inner .as_file() - .map(|page_cache| page_cache.pages()) + .map(|page_cache| page_cache.pages().dup()) } fn read_at(&self, offset: usize, buf: &mut [u8]) -> Result { diff --git a/kernel/aster-nix/src/fs/utils/page_cache.rs b/kernel/aster-nix/src/fs/utils/page_cache.rs index 4e8fef4c2..4352561e7 100644 --- a/kernel/aster-nix/src/fs/utils/page_cache.rs +++ b/kernel/aster-nix/src/fs/utils/page_cache.rs @@ -44,8 +44,8 @@ impl PageCache { /// Returns the Vmo object. // TODO: The capability is too high,restrict it to eliminate the possibility of misuse. // For example, the `resize` api should be forbidded. - pub fn pages(&self) -> Vmo { - self.pages.dup() + pub fn pages(&self) -> &Vmo { + &self.pages } /// Evict the data within a specified range from the page cache and persist