From 1e77c0a938d0312e6198bc95bc0862000b9f152b Mon Sep 17 00:00:00 2001 From: Wang Siyuan Date: Sat, 27 Dec 2025 03:23:15 +0000 Subject: [PATCH] Cleanup: Use `AtomicStatusFlags::new(flags)` instead of `AtomicU32::new(flags.bits())` --- kernel/src/fs/inode_handle.rs | 19 +++++++------------ kernel/src/fs/utils/mod.rs | 2 +- kernel/src/fs/utils/status_flags.rs | 21 +++++++++++++++++++++ 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/kernel/src/fs/inode_handle.rs b/kernel/src/fs/inode_handle.rs index d11572476..81b6ec5a3 100644 --- a/kernel/src/fs/inode_handle.rs +++ b/kernel/src/fs/inode_handle.rs @@ -2,10 +2,7 @@ //! Opened Inode-backed File Handle -use core::{ - fmt::Display, - sync::atomic::{AtomicU32, Ordering}, -}; +use core::{fmt::Display, sync::atomic::Ordering}; use aster_rights::Rights; @@ -18,8 +15,8 @@ use crate::{ path::Path, pipe::PipeHandle, utils::{ - AccessMode, CreationFlags, DirentVisitor, FallocMode, FileRange, FlockItem, InodeType, - OFFSET_MAX, RangeLockItem, RangeLockType, SeekFrom, StatusFlags, + AccessMode, AtomicStatusFlags, CreationFlags, DirentVisitor, FallocMode, FileRange, + FlockItem, InodeType, OFFSET_MAX, RangeLockItem, RangeLockType, SeekFrom, StatusFlags, }, }, prelude::*, @@ -34,7 +31,7 @@ pub struct InodeHandle { /// be provided by `file_io`, instead of `path`. file_io: Option>, offset: Mutex, - status_flags: AtomicU32, + status_flags: AtomicStatusFlags, rights: Rights, } @@ -71,7 +68,7 @@ impl InodeHandle { path, file_io, offset: Mutex::new(0), - status_flags: AtomicU32::new(status_flags.bits()), + status_flags: AtomicStatusFlags::new(status_flags), rights, }) } @@ -360,8 +357,7 @@ impl FileLike for InodeHandle { } fn status_flags(&self) -> StatusFlags { - let bits = self.status_flags.load(Ordering::Relaxed); - StatusFlags::from_bits(bits).unwrap() + self.status_flags.load(Ordering::Relaxed) } fn set_status_flags(&self, new_status_flags: StatusFlags) -> Result<()> { @@ -377,8 +373,7 @@ impl FileLike for InodeHandle { crate::fs::pipe::check_status_flags(new_status_flags)?; } - self.status_flags - .store(new_status_flags.bits(), Ordering::Relaxed); + self.status_flags.store(new_status_flags, Ordering::Relaxed); Ok(()) } diff --git a/kernel/src/fs/utils/mod.rs b/kernel/src/fs/utils/mod.rs index d0f9e0987..7beb77599 100644 --- a/kernel/src/fs/utils/mod.rs +++ b/kernel/src/fs/utils/mod.rs @@ -23,7 +23,7 @@ pub use page_cache::{CachePage, PageCache, PageCacheBackend}; #[cfg(ktest)] pub use random_test::{generate_random_operation, new_fs_in_memory}; pub use range_lock::{FileRange, OFFSET_MAX, RangeLockItem, RangeLockList, RangeLockType}; -pub use status_flags::StatusFlags; +pub use status_flags::{AtomicStatusFlags, StatusFlags}; pub use xattr::{ XATTR_LIST_MAX_LEN, XATTR_NAME_MAX_LEN, XATTR_VALUE_MAX_LEN, XattrName, XattrNamespace, XattrSetFlags, diff --git a/kernel/src/fs/utils/status_flags.rs b/kernel/src/fs/utils/status_flags.rs index f2d124b94..3949ce32f 100644 --- a/kernel/src/fs/utils/status_flags.rs +++ b/kernel/src/fs/utils/status_flags.rs @@ -1,5 +1,8 @@ // SPDX-License-Identifier: MPL-2.0 +use core::sync::atomic::AtomicU32; + +use atomic_integer_wrapper::define_atomic_version_of_integer_like_type; use bitflags::bitflags; bitflags! { @@ -23,3 +26,21 @@ bitflags! { const O_PATH = 1 << 21; } } + +impl From for StatusFlags { + fn from(value: u32) -> Self { + Self::from_bits_truncate(value) + } +} + +impl From for u32 { + fn from(value: StatusFlags) -> Self { + value.bits() + } +} + +define_atomic_version_of_integer_like_type!(StatusFlags, { + /// An atomic version of `StatusFlags`. + #[derive(Debug)] + pub struct AtomicStatusFlags(AtomicU32); +});