From 104c8dfddedf0b587f69031e0853e697188630b6 Mon Sep 17 00:00:00 2001 From: Shaowei Song Date: Thu, 19 Dec 2024 14:42:32 +0000 Subject: [PATCH] Optimize the `DirEntry` lookup in ext2 --- kernel/src/fs/ext2/dir.rs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/kernel/src/fs/ext2/dir.rs b/kernel/src/fs/ext2/dir.rs index a3be01d0e..c22d89e96 100644 --- a/kernel/src/fs/ext2/dir.rs +++ b/kernel/src/fs/ext2/dir.rs @@ -156,6 +156,7 @@ impl From for InodeType { /// A reader for reading `DirEntry` from the page cache. pub struct DirEntryReader<'a> { page_cache: &'a PageCache, + name_buf: [u8; MAX_FNAME_LEN], offset: usize, } @@ -164,6 +165,7 @@ impl<'a> DirEntryReader<'a> { pub(super) fn new(page_cache: &'a PageCache, from_offset: usize) -> Self { Self { page_cache, + name_buf: [0u8; MAX_FNAME_LEN], offset: from_offset, } } @@ -178,13 +180,14 @@ impl<'a> DirEntryReader<'a> { return_errno!(Errno::ENOENT); } - let mut name = vec![0u8; header.name_len as _]; - self.page_cache - .pages() - .read_bytes(self.offset + DirEntry::header_len(), &mut name)?; + let name_len = header.name_len as usize; + self.page_cache.pages().read_bytes( + self.offset + DirEntry::header_len(), + &mut self.name_buf[..name_len], + )?; let entry = DirEntry { header, - name: CStr256::from(name.as_slice()), + name: CStr256::from(&self.name_buf[..name_len]), }; self.offset += entry.record_len(); @@ -214,6 +217,7 @@ pub struct DirEntryWriter<'a> { offset: usize, } +// TODO: Improve the efficiency of the writer operations. impl<'a> DirEntryWriter<'a> { /// Constructs a writer with the given page cache and offset. pub(super) fn new(page_cache: &'a PageCache, from_offset: usize) -> Self {