From 3b1248ba7cfa3d70fbe59f48585acfeb63ca5b54 Mon Sep 17 00:00:00 2001 From: Chen Chengjun Date: Fri, 6 Jun 2025 06:13:16 +0000 Subject: [PATCH] Fix some potential bugs of sysfs --- kernel/src/fs/sysfs/inode.rs | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/kernel/src/fs/sysfs/inode.rs b/kernel/src/fs/sysfs/inode.rs index c17bcdeed..08e09f904 100644 --- a/kernel/src/fs/sysfs/inode.rs +++ b/kernel/src/fs/sysfs/inode.rs @@ -308,7 +308,10 @@ impl Inode for SysFsInode { } fn metadata(&self) -> Metadata { - self.metadata + let mut metadata = self.metadata; + metadata.mode = *self.mode.read(); + + metadata } fn ino(&self) -> u64 { @@ -481,12 +484,14 @@ impl Inode for SysFsInode { let mut count = 0; let mut last_ino = start_ino; - let iter = self.new_dentry_iter(start_ino + 1); + let dentries = { + let mut dentries: Vec<_> = self.new_dentry_iter(start_ino).collect(); + dentries.sort_by_key(|d| d.ino); + dentries + }; - for dentry in iter { - // The offset reported back to the caller should be the absolute position - let next_offset = (dentry.ino + 1) as usize; - let res = visitor.visit(&dentry.name, dentry.ino, dentry.type_, next_offset); + for dentry in dentries { + let res = visitor.visit(&dentry.name, dentry.ino, dentry.type_, dentry.ino as usize); if res.is_err() { if count == 0 { @@ -500,11 +505,11 @@ impl Inode for SysFsInode { } if count == 0 { - Ok(0) - } else { - // Return absolute offset instead of an increment - Ok((last_ino + 1) as usize) + return Ok(0); } + + let next_ino = last_ino + 1; + Ok((next_ino - start_ino) as usize) } fn read_link(&self) -> Result {