Skip to content

Commit c0122b5

Browse files
authored
refactor(vfs): 重构文件系统标志体系,区分打开标志与访问模式 (#1414)
- 将 `ModeType` 重命名为 `InodeMode`,明确其为inode权限位 - 将 `FileMode` 重命名为 `FileFlags`,明确其为文件打开标志(O_RDONLY等) - 新增 `FileMode` 结构体,对应Linux内核的 `file.f_mode`,表示内核专用访问模式(FMODE_READ/FMODE_WRITE/FMODE_LSEEK等) - 新增 `InodeFlags` 结构体,支持 S_SYNC、S_APPEND、S_IMMUTABLE 等inode标志 - 修复管道 `poll` 函数中的标志判断逻辑
1 parent 8d9ea81 commit c0122b5

File tree

111 files changed

+1116
-732
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

111 files changed

+1116
-732
lines changed

kernel/src/arch/riscv64/driver/vf2/dw_mshc/mmc.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ use crate::filesystem::{
3232
devfs::{DevFS, DeviceINode},
3333
kernfs::KernFSInode,
3434
mbr::MbrDiskPartionTable,
35-
vfs::{syscall::ModeType, IndexNode, Metadata},
35+
vfs::{IndexNode, InodeMode, Metadata},
3636
};
3737
use crate::libs::{
3838
rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
@@ -116,7 +116,7 @@ impl MMC {
116116
fs: RwLock::new(Weak::default()),
117117
metadata: Metadata::new(
118118
crate::filesystem::vfs::FileType::BlockDevice,
119-
ModeType::from_bits_truncate(0o755),
119+
InodeMode::from_bits_truncate(0o755),
120120
),
121121
fifo_offset: UnsafeCell::new(0x600),
122122
_frames: UnsafeCell::new(Vec::new()),

kernel/src/bpf/map/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use super::Result;
88
use crate::bpf::map::array_map::{ArrayMap, PerCpuArrayMap, PerfEventArrayMap};
99
use crate::bpf::map::hash_map::PerCpuHashMap;
1010
use crate::bpf::map::util::{BpfMapGetNextKeyArg, BpfMapMeta, BpfMapUpdateArg};
11-
use crate::filesystem::vfs::file::{File, FileMode};
12-
use crate::filesystem::vfs::syscall::ModeType;
11+
use crate::filesystem::vfs::file::{File, FileFlags};
12+
use crate::filesystem::vfs::InodeMode;
1313
use crate::filesystem::vfs::{FilePrivateData, FileSystem, FileType, IndexNode, Metadata};
1414
use crate::include::bindings::linux_bpf::{bpf_attr, bpf_map_type};
1515
use crate::libs::casting::DowncastArc;
@@ -132,7 +132,7 @@ impl BpfMap {
132132
}
133133

134134
impl IndexNode for BpfMap {
135-
fn open(&self, _data: SpinLockGuard<FilePrivateData>, _mode: &FileMode) -> Result<()> {
135+
fn open(&self, _data: SpinLockGuard<FilePrivateData>, _flags: &FileFlags) -> Result<()> {
136136
Ok(())
137137
}
138138
fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<()> {
@@ -160,7 +160,7 @@ impl IndexNode for BpfMap {
160160

161161
fn metadata(&self) -> Result<Metadata> {
162162
let meta = Metadata {
163-
mode: ModeType::from_bits_truncate(0o755),
163+
mode: InodeMode::from_bits_truncate(0o755),
164164
file_type: FileType::File,
165165
..Default::default()
166166
};
@@ -246,7 +246,7 @@ pub fn bpf_map_create(attr: &bpf_attr) -> Result<usize> {
246246
};
247247
let bpf_map = BpfMap::new(map, map_meta);
248248
let fd_table = ProcessManager::current_pcb().fd_table();
249-
let file = File::new(Arc::new(bpf_map), FileMode::O_RDWR | FileMode::O_CLOEXEC)?;
249+
let file = File::new(Arc::new(bpf_map), FileFlags::O_RDWR | FileFlags::O_CLOEXEC)?;
250250
let fd = fd_table.write().alloc_fd(file, None).map(|x| x as usize)?;
251251
info!("create map with fd: [{}]", fd);
252252
Ok(fd)

kernel/src/bpf/prog/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ use super::Result;
55
use crate::bpf::map::BpfMap;
66
use crate::bpf::prog::util::{BpfProgMeta, BpfProgVerifierInfo};
77
use crate::bpf::prog::verifier::BpfProgVerifier;
8-
use crate::filesystem::vfs::file::{File, FileMode};
9-
use crate::filesystem::vfs::syscall::ModeType;
8+
use crate::filesystem::vfs::file::{File, FileFlags};
9+
use crate::filesystem::vfs::InodeMode;
1010
use crate::filesystem::vfs::{FilePrivateData, FileSystem, FileType, IndexNode, Metadata};
1111
use crate::include::bindings::linux_bpf::bpf_attr;
1212
use crate::libs::spinlock::SpinLockGuard;
@@ -45,7 +45,7 @@ impl BpfProg {
4545
}
4646

4747
impl IndexNode for BpfProg {
48-
fn open(&self, _data: SpinLockGuard<FilePrivateData>, _mode: &FileMode) -> Result<()> {
48+
fn open(&self, _data: SpinLockGuard<FilePrivateData>, _flags: &FileFlags) -> Result<()> {
4949
Ok(())
5050
}
5151
fn close(&self, _data: SpinLockGuard<FilePrivateData>) -> Result<()> {
@@ -73,7 +73,7 @@ impl IndexNode for BpfProg {
7373

7474
fn metadata(&self) -> Result<Metadata> {
7575
let meta = Metadata {
76-
mode: ModeType::from_bits_truncate(0o755),
76+
mode: InodeMode::from_bits_truncate(0o755),
7777
file_type: FileType::File,
7878
..Default::default()
7979
};
@@ -121,7 +121,7 @@ pub fn bpf_prog_load(attr: &bpf_attr) -> Result<usize> {
121121
let prog = BpfProg::new(args);
122122
let fd_table = ProcessManager::current_pcb().fd_table();
123123
let prog = BpfProgVerifier::new(prog, log_info.log_level, &mut []).verify(&fd_table)?;
124-
let file = File::new(Arc::new(prog), FileMode::O_RDWR)?;
124+
let file = File::new(Arc::new(prog), FileFlags::O_RDWR)?;
125125
let fd = fd_table.write().alloc_fd(file, None).map(|x| x as usize)?;
126126
Ok(fd)
127127
}

kernel/src/debug/tracing/events.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use alloc::string::ToString;
33
use crate::debug::tracing::TracingDirCallBack;
44
use crate::filesystem::kernfs::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData};
55
use crate::filesystem::kernfs::KernFSInode;
6-
use crate::filesystem::vfs::syscall::ModeType;
6+
use crate::filesystem::vfs::InodeMode;
77
use crate::filesystem::vfs::PollStatus;
88
use crate::tracepoint::*;
99
use alloc::sync::Arc;
@@ -150,38 +150,38 @@ pub fn init_events(root: Arc<KernFSInode>) -> Result<(), SystemError> {
150150
// Register the subsystem in the root inode
151151
let subsystem_inode = root.add_dir(
152152
subsystem_name,
153-
ModeType::from_bits_truncate(0o755),
153+
InodeMode::from_bits_truncate(0o755),
154154
None,
155155
Some(&TracingDirCallBack),
156156
)?;
157157
for event_name in subsystem.event_names() {
158158
let event_info = subsystem.get_event(&event_name).unwrap();
159159
let event_inode = subsystem_inode.add_dir(
160160
event_name,
161-
ModeType::from_bits_truncate(0o755),
161+
InodeMode::from_bits_truncate(0o755),
162162
None,
163163
Some(&TracingDirCallBack),
164164
)?;
165165
// add enable file for the event
166166
let _enable_inode = event_inode.add_file(
167167
"enable".to_string(),
168-
ModeType::from_bits_truncate(0o644),
168+
InodeMode::from_bits_truncate(0o644),
169169
None,
170170
Some(KernInodePrivateData::DebugFS(event_info.clone())),
171171
Some(&EnableCallBack),
172172
)?;
173173
// add format file for the event
174174
let _format_inode = event_inode.add_file(
175175
"format".to_string(),
176-
ModeType::from_bits_truncate(0o644),
176+
InodeMode::from_bits_truncate(0o644),
177177
None,
178178
Some(KernInodePrivateData::DebugFS(event_info.clone())),
179179
Some(&FormatCallBack),
180180
)?;
181181
// add id file for the event
182182
let _id_inode = event_inode.add_file(
183183
"id".to_string(),
184-
ModeType::from_bits_truncate(0o644),
184+
InodeMode::from_bits_truncate(0o644),
185185
None,
186186
Some(KernInodePrivateData::DebugFS(event_info)),
187187
Some(&IDCallBack),

kernel/src/debug/tracing/mod.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use crate::debug::sysfs::debugfs_kobj;
55
use crate::driver::base::kobject::KObject;
66
use crate::filesystem::kernfs::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData};
77
use crate::filesystem::kernfs::KernFSInode;
8-
use crate::filesystem::vfs::syscall::ModeType;
8+
use crate::filesystem::vfs::InodeMode;
99
use crate::filesystem::vfs::PollStatus;
1010
use crate::libs::spinlock::SpinLock;
1111
use crate::tracepoint::{TraceCmdLineCacheSnapshot, TracePointInfo};
@@ -107,13 +107,13 @@ pub fn init_debugfs_tracing() -> Result<(), SystemError> {
107107
let root_dir = debugfs.inode().ok_or(SystemError::ENOENT)?;
108108
let tracing_root = root_dir.add_dir(
109109
"tracing".to_string(),
110-
ModeType::from_bits_truncate(0o555),
110+
InodeMode::from_bits_truncate(0o555),
111111
None,
112112
Some(&TracingDirCallBack),
113113
)?;
114114
let events_root = tracing_root.add_dir(
115115
"events".to_string(),
116-
ModeType::from_bits_truncate(0o755),
116+
InodeMode::from_bits_truncate(0o755),
117117
None,
118118
Some(&TracingDirCallBack),
119119
)?;
@@ -122,7 +122,7 @@ pub fn init_debugfs_tracing() -> Result<(), SystemError> {
122122

123123
tracing_root.add_file(
124124
"trace_pipe".to_string(),
125-
ModeType::S_IRUGO,
125+
InodeMode::S_IRUGO,
126126
Some(4096),
127127
None,
128128
Some(&trace_pipe::TracePipeCallBack),
@@ -133,7 +133,7 @@ pub fn init_debugfs_tracing() -> Result<(), SystemError> {
133133
)?;
134134
tracing_root.add_file(
135135
"saved_cmdlines_size".to_string(),
136-
ModeType::S_IRUGO,
136+
InodeMode::S_IRUGO,
137137
None,
138138
None,
139139
Some(&trace_pipe::SavedCmdlinesSizeCallBack),

kernel/src/debug/tracing/trace_pipe.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::filesystem::kernfs::callback::{KernCallbackData, KernFSCallback, KernInodePrivateData};
22
use crate::filesystem::kernfs::{KernFSInodeArgs, KernInodeType};
3-
use crate::filesystem::vfs::syscall::ModeType;
3+
use crate::filesystem::vfs::InodeMode;
44
use crate::filesystem::vfs::PollStatus;
55
use crate::libs::wait_queue::WaitQueue;
66
use crate::process::{ProcessFlags, ProcessManager};
@@ -91,7 +91,7 @@ impl KernFSCallback for TraceCallBack {
9191

9292
pub fn kernel_inode_provider_trace() -> KernFSInodeArgs {
9393
KernFSInodeArgs {
94-
mode: ModeType::S_IRUGO,
94+
mode: InodeMode::S_IRUGO,
9595
callback: Some(&TraceCallBack),
9696
inode_type: KernInodeType::File,
9797
size: Some(4096),
@@ -205,7 +205,7 @@ impl KernFSCallback for SavedCmdlinesSizeCallBack {
205205

206206
pub fn kernel_inode_provider_saved_cmdlines() -> KernFSInodeArgs {
207207
KernFSInodeArgs {
208-
mode: ModeType::S_IRUGO,
208+
mode: InodeMode::S_IRUGO,
209209
callback: Some(&SavedCmdlinesSnapshotCallBack),
210210
inode_type: KernInodeType::File,
211211
size: Some(4096),

kernel/src/driver/acpi/sysfs.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
file::sysfs_emit_str, sysfs_instance, Attribute, BinAttribute, SysFSOpsSupport,
99
SYSFS_ATTR_MODE_RO,
1010
},
11-
vfs::syscall::ModeType,
11+
vfs::InodeMode,
1212
},
1313
libs::rwlock::RwLock,
1414
};
@@ -179,7 +179,7 @@ impl Attribute for AttrForceRemove {
179179
"force_remove"
180180
}
181181

182-
fn mode(&self) -> ModeType {
182+
fn mode(&self) -> InodeMode {
183183
SYSFS_ATTR_MODE_RO
184184
}
185185

@@ -516,8 +516,8 @@ impl Attribute for AttrAcpiTable {
516516
return &self.filename;
517517
}
518518

519-
fn mode(&self) -> ModeType {
520-
return ModeType::from_bits_truncate(0o400);
519+
fn mode(&self) -> InodeMode {
520+
return InodeMode::from_bits_truncate(0o400);
521521
}
522522

523523
fn support(&self) -> SysFSOpsSupport {

kernel/src/driver/base/block/gendisk/mod.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
driver::base::device::device_number::DeviceNumber,
1515
filesystem::{
1616
devfs::{DevFS, DeviceINode, LockedDevFSInode},
17-
vfs::{syscall::ModeType, utils::DName, IndexNode, Metadata},
17+
vfs::{utils::DName, IndexNode, InodeMode, Metadata},
1818
},
1919
libs::{rwlock::RwLock, spinlock::SpinLockGuard},
2020
};
@@ -74,7 +74,7 @@ impl GenDisk {
7474
fs: RwLock::new(Weak::default()),
7575
metadata: Metadata::new(
7676
crate::filesystem::vfs::FileType::BlockDevice,
77-
ModeType::from_bits_truncate(0o755),
77+
InodeMode::from_bits_truncate(0o755),
7878
),
7979
name: dev_name,
8080
});
@@ -269,7 +269,7 @@ impl IndexNode for GenDisk {
269269
fn open(
270270
&self,
271271
_data: SpinLockGuard<crate::filesystem::vfs::FilePrivateData>,
272-
_mode: &crate::filesystem::vfs::file::FileMode,
272+
_mode: &crate::filesystem::vfs::file::FileFlags,
273273
) -> Result<(), SystemError> {
274274
Ok(())
275275
}

kernel/src/driver/base/cpu.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ use super::{
2424
};
2525
use crate::filesystem::sysfs::file::sysfs_emit_str;
2626
use crate::filesystem::sysfs::{Attribute, AttributeGroup, SysFSOpsSupport};
27-
use crate::filesystem::vfs::syscall::ModeType;
27+
use crate::filesystem::vfs::InodeMode;
2828
use crate::libs::lazy_init::Lazy;
2929
use system_error::SystemError;
3030

@@ -273,7 +273,7 @@ impl AttributeGroup for AttrGroupCpu {
273273
&self,
274274
_kobj: Arc<dyn KObject>,
275275
_attr: &'static dyn Attribute,
276-
) -> Option<ModeType> {
276+
) -> Option<InodeMode> {
277277
None
278278
}
279279
}
@@ -286,8 +286,8 @@ impl Attribute for AttrCpuPossible {
286286
"possible"
287287
}
288288

289-
fn mode(&self) -> ModeType {
290-
ModeType::S_IRUGO
289+
fn mode(&self) -> InodeMode {
290+
InodeMode::S_IRUGO
291291
}
292292

293293
fn support(&self) -> SysFSOpsSupport {
@@ -310,8 +310,8 @@ impl Attribute for AttrCpuOnline {
310310
"online"
311311
}
312312

313-
fn mode(&self) -> ModeType {
314-
ModeType::S_IRUGO
313+
fn mode(&self) -> InodeMode {
314+
InodeMode::S_IRUGO
315315
}
316316

317317
fn support(&self) -> SysFSOpsSupport {

kernel/src/driver/base/device/bus.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::{
1414
file::sysfs_emit_str, sysfs_instance, Attribute, AttributeGroup, SysFSOps,
1515
SysFSOpsSupport, SYSFS_ATTR_MODE_RW, SYSFS_ATTR_MODE_WO,
1616
},
17-
vfs::syscall::ModeType,
17+
vfs::InodeMode,
1818
},
1919
libs::rwlock::RwLock,
2020
};
@@ -588,8 +588,8 @@ pub fn bus_probe_device(dev: &Arc<dyn Device>) {
588588
struct BusAttrDriversProbe;
589589

590590
impl Attribute for BusAttrDriversProbe {
591-
fn mode(&self) -> ModeType {
592-
return ModeType::S_IWUSR;
591+
fn mode(&self) -> InodeMode {
592+
return InodeMode::S_IWUSR;
593593
}
594594

595595
fn name(&self) -> &str {
@@ -626,7 +626,7 @@ impl Attribute for BusAttrDriversProbe {
626626
struct BusAttrDriversAutoprobe;
627627

628628
impl Attribute for BusAttrDriversAutoprobe {
629-
fn mode(&self) -> ModeType {
629+
fn mode(&self) -> InodeMode {
630630
SYSFS_ATTR_MODE_RW
631631
}
632632

@@ -736,7 +736,7 @@ impl SysFSOps for BusDriverSysFSOps {
736736
struct DriverAttrUnbind;
737737

738738
impl Attribute for DriverAttrUnbind {
739-
fn mode(&self) -> ModeType {
739+
fn mode(&self) -> InodeMode {
740740
SYSFS_ATTR_MODE_WO
741741
}
742742

@@ -784,7 +784,7 @@ impl Attribute for DriverAttrBind {
784784
"bind"
785785
}
786786

787-
fn mode(&self) -> ModeType {
787+
fn mode(&self) -> InodeMode {
788788
SYSFS_ATTR_MODE_WO
789789
}
790790

0 commit comments

Comments
 (0)