From de97644b4ca2843392c6a21a7cb68aa868d18757 Mon Sep 17 00:00:00 2001 From: jiangjianfeng Date: Mon, 4 Aug 2025 09:31:53 +0000 Subject: [PATCH] Move `ThreadFsInfo` from `PosixThread` to `ThreadLocal` --- kernel/src/device/pty/master.rs | 10 ++++++---- kernel/src/fs/overlayfs/fs.rs | 3 ++- kernel/src/net/socket/unix/ns/path.rs | 15 +++++++------- kernel/src/process/clone.rs | 4 ++-- kernel/src/process/posix_thread/builder.rs | 2 +- kernel/src/process/posix_thread/mod.rs | 8 +------- .../src/process/posix_thread/thread_local.rs | 20 ++++++++++++++++++- kernel/src/syscall/access.rs | 3 ++- kernel/src/syscall/chdir.rs | 6 ++++-- kernel/src/syscall/chmod.rs | 6 +++++- kernel/src/syscall/chown.rs | 3 ++- kernel/src/syscall/chroot.rs | 3 ++- kernel/src/syscall/execve.rs | 10 ++++++---- kernel/src/syscall/getcwd.rs | 6 +++--- kernel/src/syscall/link.rs | 3 ++- kernel/src/syscall/mkdir.rs | 7 +++---- kernel/src/syscall/mknod.rs | 7 +++---- kernel/src/syscall/mount.rs | 18 ++++++++++++++--- kernel/src/syscall/open.rs | 7 +++---- kernel/src/syscall/readlink.rs | 4 ++-- kernel/src/syscall/rename.rs | 3 ++- kernel/src/syscall/rmdir.rs | 4 ++-- kernel/src/syscall/setxattr.rs | 3 ++- kernel/src/syscall/stat.rs | 3 ++- kernel/src/syscall/statfs.rs | 6 +++++- kernel/src/syscall/statx.rs | 3 ++- kernel/src/syscall/symlink.rs | 4 ++-- kernel/src/syscall/truncate.rs | 6 +++++- kernel/src/syscall/umask.rs | 2 +- kernel/src/syscall/umount.rs | 10 +++++++--- kernel/src/syscall/unlink.rs | 4 ++-- kernel/src/syscall/utimens.rs | 3 ++- 32 files changed, 125 insertions(+), 71 deletions(-) diff --git a/kernel/src/device/pty/master.rs b/kernel/src/device/pty/master.rs index 6cfb17c0b..729d538a2 100644 --- a/kernel/src/device/pty/master.rs +++ b/kernel/src/device/pty/master.rs @@ -17,7 +17,7 @@ use crate::{ }, prelude::*, process::{ - posix_thread::{AsPosixThread, AsThreadLocal}, + posix_thread::AsThreadLocal, signal::{PollHandle, Pollable}, Terminal, }, @@ -115,7 +115,6 @@ impl FileIo for PtyMaster { } IoctlCmd::TIOCGPTPEER => { let current_task = Task::current().unwrap(); - let posix_thread = current_task.as_posix_thread().unwrap(); let thread_local = current_task.as_thread_local().unwrap(); // TODO: Deal with `open()` flags. @@ -128,10 +127,13 @@ impl FileIo for PtyMaster { let fs_path = FsPath::try_from(slave_name.as_str())?; let inode_handle = { - let fs = posix_thread.fs().resolver().read(); let flags = AccessMode::O_RDWR as u32; let mode = (InodeMode::S_IRUSR | InodeMode::S_IWUSR).bits(); - fs.open(&fs_path, flags, mode)? + thread_local + .borrow_fs() + .resolver() + .read() + .open(&fs_path, flags, mode)? }; Arc::new(inode_handle) }; diff --git a/kernel/src/fs/overlayfs/fs.rs b/kernel/src/fs/overlayfs/fs.rs index a1e68b539..127e5cd2a 100644 --- a/kernel/src/fs/overlayfs/fs.rs +++ b/kernel/src/fs/overlayfs/fs.rs @@ -1155,7 +1155,8 @@ impl FsType for OverlayFsType { } } - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); let upper = fs.lookup(&FsPath::new(AT_FDCWD, upper)?)?; let lower = lower diff --git a/kernel/src/net/socket/unix/ns/path.rs b/kernel/src/net/socket/unix/ns/path.rs index 2bb7ab917..c7f0c9f7b 100644 --- a/kernel/src/net/socket/unix/ns/path.rs +++ b/kernel/src/net/socket/unix/ns/path.rs @@ -1,5 +1,7 @@ // SPDX-License-Identifier: MPL-2.0 +use ostd::task::Task; + use crate::{ fs::{ fs_resolver::{split_path, FsPath}, @@ -7,14 +9,13 @@ use crate::{ utils::{InodeMode, InodeType, Permission}, }, prelude::*, - process::posix_thread::AsPosixThread, }; pub fn lookup_socket_file(path: &str) -> Result { let dentry = { - let current = current_thread!(); - let current = current.as_posix_thread().unwrap(); - let fs = current.fs().resolver().read(); + let current = Task::current().unwrap(); + let fs_ref = current.as_thread_local().unwrap().borrow_fs(); + let fs = fs_ref.resolver().read(); let fs_path = FsPath::try_from(path)?; fs.lookup(&fs_path)? }; @@ -41,9 +42,9 @@ pub fn create_socket_file(path: &str) -> Result { let (parent_pathname, file_name) = split_path(path); let parent = { - let current = current_thread!(); - let current = current.as_posix_thread().unwrap(); - let fs = current.fs().resolver().read(); + let current = Task::current().unwrap(); + let fs_ref = current.as_thread_local().unwrap().borrow_fs(); + let fs = fs_ref.resolver().read(); let parent_path = FsPath::try_from(parent_pathname)?; fs.lookup(&parent_path)? }; diff --git a/kernel/src/process/clone.rs b/kernel/src/process/clone.rs index eb52d1ba6..81e037b76 100644 --- a/kernel/src/process/clone.rs +++ b/kernel/src/process/clone.rs @@ -255,7 +255,7 @@ fn clone_child_task( let child_file_table = clone_files(thread_local.borrow_file_table().unwrap(), clone_flags); // Clone fs - let child_fs = clone_fs(posix_thread.fs(), clone_flags); + let child_fs = clone_fs(&thread_local.borrow_fs(), clone_flags); // Clone FPU context let child_fpu_context = thread_local.fpu().clone_context(); @@ -339,7 +339,7 @@ fn clone_child_process( let child_file_table = clone_files(thread_local.borrow_file_table().unwrap(), clone_flags); // Clone the filesystem information - let child_fs = clone_fs(posix_thread.fs(), clone_flags); + let child_fs = clone_fs(&thread_local.borrow_fs(), clone_flags); // Clone signal dispositions let child_sig_dispositions = clone_sighand(process.sig_dispositions(), clone_flags); diff --git a/kernel/src/process/posix_thread/builder.rs b/kernel/src/process/posix_thread/builder.rs index ff24c52d9..5267e9dad 100644 --- a/kernel/src/process/posix_thread/builder.rs +++ b/kernel/src/process/posix_thread/builder.rs @@ -145,7 +145,6 @@ impl PosixThreadBuilder { name: Mutex::new(thread_name), credentials, file_table: Mutex::new(Some(file_table.clone_ro())), - fs, sig_mask, sig_queues, signalled_waker: SpinLock::new(None), @@ -169,6 +168,7 @@ impl PosixThreadBuilder { clear_child_tid, root_vmar, file_table, + fs, fpu_context, ); diff --git a/kernel/src/process/posix_thread/mod.rs b/kernel/src/process/posix_thread/mod.rs index 5e0fd2848..45b127995 100644 --- a/kernel/src/process/posix_thread/mod.rs +++ b/kernel/src/process/posix_thread/mod.rs @@ -19,7 +19,7 @@ use super::{ }; use crate::{ events::Observer, - fs::{file_table::FileTable, thread_info::ThreadFsInfo}, + fs::file_table::FileTable, prelude::*, process::signal::constants::SIGCONT, thread::{Thread, Tid}, @@ -56,8 +56,6 @@ pub struct PosixThread { // Files /// File table file_table: Mutex>>, - /// File system - fs: Arc, // Signal /// Blocked signals @@ -103,10 +101,6 @@ impl PosixThread { &self.file_table } - pub fn fs(&self) -> &Arc { - &self.fs - } - /// Get the reference to the signal mask of the thread. /// /// Note that while this function offers mutable access to the signal mask, diff --git a/kernel/src/process/posix_thread/thread_local.rs b/kernel/src/process/posix_thread/thread_local.rs index 5c4205b96..611f0846f 100644 --- a/kernel/src/process/posix_thread/thread_local.rs +++ b/kernel/src/process/posix_thread/thread_local.rs @@ -6,7 +6,12 @@ use aster_rights::Full; use ostd::{cpu::context::FpuContext, mm::Vaddr, sync::RwArc, task::CurrentTask}; use super::RobustListHead; -use crate::{fs::file_table::FileTable, process::signal::SigStack, vm::vmar::Vmar}; +use crate::{ + fs::{file_table::FileTable, thread_info::ThreadFsInfo}, + prelude::*, + process::signal::SigStack, + vm::vmar::Vmar, +}; /// Local data for a POSIX thread. pub struct ThreadLocal { @@ -23,7 +28,10 @@ pub struct ThreadLocal { robust_list: RefCell>, // Files. + /// File table. file_table: RefCell>>, + /// File system. + fs: RefCell>, // User FPU context. fpu_context: RefCell, @@ -44,6 +52,7 @@ impl ThreadLocal { clear_child_tid: Vaddr, root_vmar: Vmar, file_table: RwArc, + fs: Arc, fpu_context: FpuContext, ) -> Self { Self { @@ -52,6 +61,7 @@ impl ThreadLocal { root_vmar: RefCell::new(Some(root_vmar)), robust_list: RefCell::new(None), file_table: RefCell::new(Some(file_table)), + fs: RefCell::new(fs), sig_context: Cell::new(None), sig_stack: RefCell::new(None), fpu_context: RefCell::new(fpu_context), @@ -83,6 +93,14 @@ impl ThreadLocal { FileTableRefMut(self.file_table.borrow_mut()) } + pub fn borrow_fs(&self) -> Ref<'_, Arc> { + self.fs.borrow() + } + + pub fn borrow_fs_mut(&self) -> RefMut<'_, Arc> { + self.fs.borrow_mut() + } + pub fn sig_context(&self) -> &Cell> { &self.sig_context } diff --git a/kernel/src/syscall/access.rs b/kernel/src/syscall/access.rs index ac5631a19..888a0d038 100644 --- a/kernel/src/syscall/access.rs +++ b/kernel/src/syscall/access.rs @@ -88,7 +88,8 @@ pub fn do_faccessat( let dentry = { let path = path.to_string_lossy(); let fs_path = FsPath::new(dirfd, path.as_ref())?; - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); if flags.contains(FaccessatFlags::AT_SYMLINK_NOFOLLOW) { fs.lookup_no_follow(&fs_path)? } else { diff --git a/kernel/src/syscall/chdir.rs b/kernel/src/syscall/chdir.rs index 7b1a95755..48bc7e895 100644 --- a/kernel/src/syscall/chdir.rs +++ b/kernel/src/syscall/chdir.rs @@ -15,7 +15,8 @@ pub fn sys_chdir(path_ptr: Vaddr, ctx: &Context) -> Result { let path = ctx.user_space().read_cstring(path_ptr, MAX_FILENAME_LEN)?; debug!("path = {:?}", path); - let mut fs = ctx.posix_thread.fs().resolver().write(); + let fs_ref = ctx.thread_local.borrow_fs(); + let mut fs = fs_ref.resolver().write(); let dentry = { let path = path.to_string_lossy(); if path.is_empty() { @@ -42,6 +43,7 @@ pub fn sys_fchdir(fd: FileDesc, ctx: &Context) -> Result { if dentry.type_() != InodeType::Dir { return_errno_with_message!(Errno::ENOTDIR, "must be directory"); } - ctx.posix_thread.fs().resolver().write().set_cwd(dentry); + let fs_ref = ctx.thread_local.borrow_fs(); + fs_ref.resolver().write().set_cwd(dentry); Ok(SyscallReturn::Return(0)) } diff --git a/kernel/src/syscall/chmod.rs b/kernel/src/syscall/chmod.rs index 32378711f..da17e26e4 100644 --- a/kernel/src/syscall/chmod.rs +++ b/kernel/src/syscall/chmod.rs @@ -40,7 +40,11 @@ pub fn sys_fchmodat( return_errno_with_message!(Errno::ENOENT, "path is empty"); } let fs_path = FsPath::new(dirfd, path.as_ref())?; - ctx.posix_thread.fs().resolver().read().lookup(&fs_path)? + ctx.thread_local + .borrow_fs() + .resolver() + .read() + .lookup(&fs_path)? }; dentry.set_mode(InodeMode::from_bits_truncate(mode))?; Ok(SyscallReturn::Return(0)) diff --git a/kernel/src/syscall/chown.rs b/kernel/src/syscall/chown.rs index 2fcd40eb7..9fc7dc6e0 100644 --- a/kernel/src/syscall/chown.rs +++ b/kernel/src/syscall/chown.rs @@ -78,7 +78,8 @@ pub fn sys_fchownat( let dentry = { let path = path.to_string_lossy(); let fs_path = FsPath::new(dirfd, path.as_ref())?; - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); if flags.contains(ChownFlags::AT_SYMLINK_NOFOLLOW) { fs.lookup_no_follow(&fs_path)? } else { diff --git a/kernel/src/syscall/chroot.rs b/kernel/src/syscall/chroot.rs index a141f778e..94d3028cb 100644 --- a/kernel/src/syscall/chroot.rs +++ b/kernel/src/syscall/chroot.rs @@ -11,7 +11,8 @@ pub fn sys_chroot(path_ptr: Vaddr, ctx: &Context) -> Result { let path = ctx.user_space().read_cstring(path_ptr, MAX_FILENAME_LEN)?; debug!("path = {:?}", path); - let mut fs = ctx.posix_thread.fs().resolver().write(); + let fs_ref = ctx.thread_local.borrow_fs(); + let mut fs = fs_ref.resolver().write(); let dentry = { let path = path.to_string_lossy(); if path.is_empty() { diff --git a/kernel/src/syscall/execve.rs b/kernel/src/syscall/execve.rs index 8ab5b6296..d5c2cb939 100644 --- a/kernel/src/syscall/execve.rs +++ b/kernel/src/syscall/execve.rs @@ -66,7 +66,8 @@ fn lookup_executable_file( let file = get_file_fast!(&mut file_table, dfd); file.as_inode_or_err()?.dentry().clone() } else { - let fs_resolver = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs_resolver = fs_ref.resolver().read(); let fs_path = FsPath::new(dfd, &filename)?; if flags.contains(OpenFlags::AT_SYMLINK_NOFOLLOW) { fs_resolver.lookup_no_follow(&fs_path)? @@ -123,9 +124,10 @@ fn do_execve( drop(closed_files); debug!("load program to root vmar"); - let fs_resolver = &*posix_thread.fs().resolver().read(); + let fs_ref = thread_local.borrow_fs(); + let fs_resolver = fs_ref.resolver().read(); let program_to_load = - ProgramToLoad::build_from_file(elf_file.clone(), fs_resolver, argv, envp, 1)?; + ProgramToLoad::build_from_file(elf_file.clone(), &fs_resolver, argv, envp, 1)?; renew_vm_and_map(ctx); @@ -137,7 +139,7 @@ fn do_execve( } let (new_executable_path, elf_load_info) = - program_to_load.load_to_vm(process.vm(), fs_resolver)?; + program_to_load.load_to_vm(process.vm(), &fs_resolver)?; // After the program has been successfully loaded, the virtual memory of the current process // is initialized. Hence, it is necessary to clear the previously recorded robust list. diff --git a/kernel/src/syscall/getcwd.rs b/kernel/src/syscall/getcwd.rs index 76cdc2f24..09a12f9c6 100644 --- a/kernel/src/syscall/getcwd.rs +++ b/kernel/src/syscall/getcwd.rs @@ -7,9 +7,9 @@ use crate::{ }; pub fn sys_getcwd(buf: Vaddr, len: usize, ctx: &Context) -> Result { - let current = ctx.posix_thread; - let dirent = current - .fs() + let dirent = ctx + .thread_local + .borrow_fs() .resolver() .read() .lookup(&FsPath::new(AT_FDCWD, "").unwrap()) diff --git a/kernel/src/syscall/link.rs b/kernel/src/syscall/link.rs index 0e33cf02c..845e002ea 100644 --- a/kernel/src/syscall/link.rs +++ b/kernel/src/syscall/link.rs @@ -44,7 +44,8 @@ pub fn sys_linkat( let old_fs_path = FsPath::new(old_dirfd, old_path.as_ref())?; let new_fs_path = FsPath::new(new_dirfd, new_path.as_ref())?; - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); let old_dentry = if flags.contains(LinkFlags::AT_SYMLINK_FOLLOW) { fs.lookup(&old_fs_path)? } else { diff --git a/kernel/src/syscall/mkdir.rs b/kernel/src/syscall/mkdir.rs index 8242b1050..8f995c1c0 100644 --- a/kernel/src/syscall/mkdir.rs +++ b/kernel/src/syscall/mkdir.rs @@ -20,22 +20,21 @@ pub fn sys_mkdirat( let path = ctx.user_space().read_cstring(path_addr, MAX_FILENAME_LEN)?; debug!("dirfd = {}, path = {:?}, mode = {}", dirfd, path, mode); - let current = ctx.posix_thread; + let fs_ref = ctx.thread_local.borrow_fs(); let (dir_dentry, name) = { let path = path.to_string_lossy(); if path.is_empty() { return_errno_with_message!(Errno::ENOENT, "path is empty"); } let fs_path = FsPath::new(dirfd, path.as_ref())?; - current - .fs() + fs_ref .resolver() .read() .lookup_dir_and_new_basename(&fs_path, true)? }; let inode_mode = { - let mask_mode = mode & !current.fs().umask().read().get(); + let mask_mode = mode & !fs_ref.umask().read().get(); InodeMode::from_bits_truncate(mask_mode) }; let _ = dir_dentry.new_fs_child(name.trim_end_matches('/'), InodeType::Dir, inode_mode)?; diff --git a/kernel/src/syscall/mknod.rs b/kernel/src/syscall/mknod.rs index efbbc7822..77f48552a 100644 --- a/kernel/src/syscall/mknod.rs +++ b/kernel/src/syscall/mknod.rs @@ -21,9 +21,9 @@ pub fn sys_mknodat( ctx: &Context, ) -> Result { let path = ctx.user_space().read_cstring(path_addr, MAX_FILENAME_LEN)?; - let current = ctx.posix_thread; + let fs_ref = ctx.thread_local.borrow_fs(); let inode_mode = { - let mask_mode = mode & !current.fs().umask().read().get(); + let mask_mode = mode & !fs_ref.umask().read().get(); InodeMode::from_bits_truncate(mask_mode) }; let inode_type = InodeType::from_raw_mode(mode)?; @@ -38,8 +38,7 @@ pub fn sys_mknodat( return_errno_with_message!(Errno::ENOENT, "path is empty"); } let fs_path = FsPath::new(dirfd, path.as_ref())?; - current - .fs() + fs_ref .resolver() .read() .lookup_dir_and_new_basename(&fs_path, false)? diff --git a/kernel/src/syscall/mount.rs b/kernel/src/syscall/mount.rs index eaa6b0a10..abef4fed9 100644 --- a/kernel/src/syscall/mount.rs +++ b/kernel/src/syscall/mount.rs @@ -39,7 +39,11 @@ pub fn sys_mount( return_errno_with_message!(Errno::ENOENT, "dirname is empty"); } let fs_path = FsPath::new(AT_FDCWD, dirname.as_ref())?; - ctx.posix_thread.fs().resolver().read().lookup(&fs_path)? + ctx.thread_local + .borrow_fs() + .resolver() + .read() + .lookup(&fs_path)? }; if mount_flags.contains(MountFlags::MS_REMOUNT) && mount_flags.contains(MountFlags::MS_BIND) { @@ -92,7 +96,11 @@ fn do_bind_mount( return_errno_with_message!(Errno::ENOENT, "src_name is empty"); } let fs_path = FsPath::new(AT_FDCWD, src_name.as_ref())?; - ctx.posix_thread.fs().resolver().read().lookup(&fs_path)? + ctx.thread_local + .borrow_fs() + .resolver() + .read() + .lookup(&fs_path)? }; if src_dentry.type_() != InodeType::Dir { @@ -115,7 +123,11 @@ fn do_move_mount_old(src_name: CString, dst_dentry: Dentry, ctx: &Context) -> Re return_errno_with_message!(Errno::ENOENT, "src_name is empty"); } let fs_path = FsPath::new(AT_FDCWD, src_name.as_ref())?; - ctx.posix_thread.fs().resolver().read().lookup(&fs_path)? + ctx.thread_local + .borrow_fs() + .resolver() + .read() + .lookup(&fs_path)? }; if !src_dentry.is_root_of_mount() { diff --git a/kernel/src/syscall/open.rs b/kernel/src/syscall/open.rs index 5ca9b16f9..2210d8cf7 100644 --- a/kernel/src/syscall/open.rs +++ b/kernel/src/syscall/open.rs @@ -24,13 +24,12 @@ pub fn sys_openat( dirfd, path, flags, mode ); - let current = ctx.posix_thread; let file_handle = { let path = path.to_string_lossy(); let fs_path = FsPath::new(dirfd, path.as_ref())?; - let mask_mode = mode & !current.fs().umask().read().get(); - let inode_handle = current - .fs() + let fs_ref = ctx.thread_local.borrow_fs(); + let mask_mode = mode & !fs_ref.umask().read().get(); + let inode_handle = fs_ref .resolver() .read() .open(&fs_path, flags, mask_mode) diff --git a/kernel/src/syscall/readlink.rs b/kernel/src/syscall/readlink.rs index 45d8729c7..27c9ddeab 100644 --- a/kernel/src/syscall/readlink.rs +++ b/kernel/src/syscall/readlink.rs @@ -30,8 +30,8 @@ pub fn sys_readlinkat( return_errno_with_message!(Errno::ENOENT, "path is empty"); } let fs_path = FsPath::new(dirfd, path.as_ref())?; - ctx.posix_thread - .fs() + ctx.thread_local + .borrow_fs() .resolver() .read() .lookup_no_follow(&fs_path)? diff --git a/kernel/src/syscall/rename.rs b/kernel/src/syscall/rename.rs index ba754263a..964e22804 100644 --- a/kernel/src/syscall/rename.rs +++ b/kernel/src/syscall/rename.rs @@ -26,7 +26,8 @@ pub fn sys_renameat( old_dirfd, old_path, new_dirfd, new_path ); - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); let (old_dir_dentry, old_name) = { let old_path = old_path.to_string_lossy(); diff --git a/kernel/src/syscall/rmdir.rs b/kernel/src/syscall/rmdir.rs index 52c2a73b8..f8edac616 100644 --- a/kernel/src/syscall/rmdir.rs +++ b/kernel/src/syscall/rmdir.rs @@ -31,8 +31,8 @@ pub(super) fn sys_rmdirat( return_errno_with_message!(Errno::EBUSY, "is root directory"); } let fs_path = FsPath::new(dirfd, path.as_ref())?; - ctx.posix_thread - .fs() + ctx.thread_local + .borrow_fs() .resolver() .read() .lookup_dir_and_base_name(&fs_path)? diff --git a/kernel/src/syscall/setxattr.rs b/kernel/src/syscall/setxattr.rs index fd953c583..cb73e325c 100644 --- a/kernel/src/syscall/setxattr.rs +++ b/kernel/src/syscall/setxattr.rs @@ -132,7 +132,8 @@ pub(super) fn lookup_dentry_for_xattr<'a>( |path: &CString, ctx: &Context, symlink_no_follow: bool| -> Result> { let path = path.to_string_lossy(); let fs_path = FsPath::new(AT_FDCWD, path.as_ref())?; - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); let dentry = if symlink_no_follow { fs.lookup_no_follow(&fs_path)? } else { diff --git a/kernel/src/syscall/stat.rs b/kernel/src/syscall/stat.rs index 54e299251..c25a19391 100644 --- a/kernel/src/syscall/stat.rs +++ b/kernel/src/syscall/stat.rs @@ -67,7 +67,8 @@ pub fn sys_fstatat( let dentry = { let filename = filename.to_string_lossy(); let fs_path = FsPath::new(dirfd, filename.as_ref())?; - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); if flags.contains(StatFlags::AT_SYMLINK_NOFOLLOW) { fs.lookup_no_follow(&fs_path)? } else { diff --git a/kernel/src/syscall/statfs.rs b/kernel/src/syscall/statfs.rs index 01d816bff..0748492f2 100644 --- a/kernel/src/syscall/statfs.rs +++ b/kernel/src/syscall/statfs.rs @@ -18,7 +18,11 @@ pub fn sys_statfs(path_ptr: Vaddr, statfs_buf_ptr: Vaddr, ctx: &Context) -> Resu let dentry = { let path = path.to_string_lossy(); let fs_path = FsPath::try_from(path.as_ref())?; - ctx.posix_thread.fs().resolver().read().lookup(&fs_path)? + ctx.thread_local + .borrow_fs() + .resolver() + .read() + .lookup(&fs_path)? }; let statfs = Statfs::from(dentry.fs().sb()); user_space.write_val(statfs_buf_ptr, &statfs)?; diff --git a/kernel/src/syscall/statx.rs b/kernel/src/syscall/statx.rs index d53aadef7..7da81cd8a 100644 --- a/kernel/src/syscall/statx.rs +++ b/kernel/src/syscall/statx.rs @@ -49,7 +49,8 @@ pub fn sys_statx( let dentry = { let filename = filename.to_string_lossy(); let fs_path = FsPath::new(dirfd, filename.as_ref())?; - let fs = ctx.posix_thread.fs().resolver().read(); + let fs_ref = ctx.thread_local.borrow_fs(); + let fs = fs_ref.resolver().read(); if flags.contains(StatxFlags::AT_SYMLINK_NOFOLLOW) { fs.lookup_no_follow(&fs_path)? } else { diff --git a/kernel/src/syscall/symlink.rs b/kernel/src/syscall/symlink.rs index 0e9864453..c9c18899d 100644 --- a/kernel/src/syscall/symlink.rs +++ b/kernel/src/syscall/symlink.rs @@ -35,8 +35,8 @@ pub fn sys_symlinkat( return_errno_with_message!(Errno::ENOENT, "linkpath is empty"); } let fs_path = FsPath::new(dirfd, linkpath.as_ref())?; - ctx.posix_thread - .fs() + ctx.thread_local + .borrow_fs() .resolver() .read() .lookup_dir_and_new_basename(&fs_path, false)? diff --git a/kernel/src/syscall/truncate.rs b/kernel/src/syscall/truncate.rs index c12a316c3..416139c5a 100644 --- a/kernel/src/syscall/truncate.rs +++ b/kernel/src/syscall/truncate.rs @@ -34,7 +34,11 @@ pub fn sys_truncate(path_ptr: Vaddr, len: isize, ctx: &Context) -> Result Result { debug!("mask = 0o{:o}", mask); - let old_mask = ctx.posix_thread.fs().umask().write().set(mask); + let old_mask = ctx.thread_local.borrow_fs().umask().write().set(mask); Ok(SyscallReturn::Return(old_mask as _)) } diff --git a/kernel/src/syscall/umount.rs b/kernel/src/syscall/umount.rs index f64ab1695..e975d8d9f 100644 --- a/kernel/src/syscall/umount.rs +++ b/kernel/src/syscall/umount.rs @@ -21,13 +21,17 @@ pub fn sys_umount(path_addr: Vaddr, flags: u64, ctx: &Context) -> Result