feat: 实现并测试 newfstatat 系统调用 (#1153)

* feat: 实现并测试 newfstatat 系统调用

新增了 newfstatat 系统调用的实现,并添加了相应的测试应用。

Signed-off-by: longjin <longjin@DragonOS.org>

* feat(loongarch64/riscv64): 添加文件系统模块并实现GenericPosixStat结构

为loongarch64和riscv64架构添加filesystem模块,包含stat子模块,并实现GenericPosixStat结构用于处理文件状态信息。

Signed-off-by: longjin <longjin@DragonOS.org>

---------

Signed-off-by: longjin <longjin@DragonOS.org>
This commit is contained in:
LoGin
2025-05-09 23:04:58 +08:00
committed by GitHub
parent 5422256d63
commit cd3289e4b4
18 changed files with 397 additions and 14 deletions

View File

@ -0,0 +1 @@
pub mod stat;

View File

@ -0,0 +1 @@
pub use crate::filesystem::vfs::stat::GenericPosixStat as PosixStat;

View File

@ -1,6 +1,7 @@
pub mod asm;
pub mod cpu;
pub mod elf;
pub mod filesystem;
pub mod init;
pub mod interrupt;
pub mod ipc;

View File

@ -0,0 +1 @@
pub mod stat;

View File

@ -0,0 +1 @@
pub use crate::filesystem::vfs::stat::GenericPosixStat as PosixStat;

View File

@ -2,6 +2,7 @@ pub mod asm;
pub mod cpu;
pub mod driver;
pub mod elf;
pub mod filesystem;
pub mod init;
pub mod interrupt;
pub mod ipc;

View File

@ -0,0 +1 @@
pub mod stat;

View File

@ -0,0 +1,72 @@
use system_error::SystemError;
use crate::filesystem::vfs::stat::KStat;
#[repr(C)]
#[derive(Default, Clone, Copy)]
pub struct PosixStat {
pub st_dev: usize,
pub st_ino: usize,
pub st_nlink: usize,
pub st_mode: u32,
pub st_uid: u32,
pub st_gid: u32,
pub __pad0: u32,
pub st_rdev: usize,
pub st_size: isize,
pub st_blksize: isize,
/// number of 512B blocks allocated
pub st_blocks: isize,
pub st_atime: usize,
pub st_atime_nsec: usize,
pub st_mtime: usize,
pub st_mtime_nsec: usize,
pub st_ctime: usize,
pub st_ctime_nsec: usize,
pub __unused: [isize; 3],
}
/// 转换的代码参考 https://code.dragonos.org.cn/xref/linux-6.6.21/fs/stat.c#393
impl TryFrom<KStat> for PosixStat {
type Error = SystemError;
fn try_from(kstat: KStat) -> Result<Self, Self::Error> {
let mut tmp = PosixStat::default();
if core::mem::size_of_val(&tmp.st_dev) < 4 && !kstat.dev.old_valid_dev() {
return Err(SystemError::EOVERFLOW);
}
if core::mem::size_of_val(&tmp.st_rdev) < 4 && !kstat.rdev.old_valid_dev() {
return Err(SystemError::EOVERFLOW);
}
tmp.st_dev = kstat.dev.new_encode_dev() as usize;
tmp.st_ino = kstat.ino as usize;
if core::mem::size_of_val(&tmp.st_ino) < core::mem::size_of_val(&kstat.ino)
&& tmp.st_ino != kstat.ino as usize
{
return Err(SystemError::EOVERFLOW);
}
tmp.st_mode = kstat.mode.bits();
tmp.st_nlink = kstat.nlink.try_into().map_err(|_| SystemError::EOVERFLOW)?;
// todo: 处理user namespace (https://code.dragonos.org.cn/xref/linux-6.6.21/fs/stat.c#415)
tmp.st_uid = kstat.uid;
tmp.st_gid = kstat.gid;
tmp.st_rdev = kstat.rdev.data() as usize;
tmp.st_size = kstat.size as isize;
tmp.st_atime = kstat.atime.tv_sec as usize;
tmp.st_mtime = kstat.mtime.tv_sec as usize;
tmp.st_ctime = kstat.ctime.tv_sec as usize;
tmp.st_atime_nsec = kstat.atime.tv_nsec as usize;
tmp.st_mtime_nsec = kstat.mtime.tv_nsec as usize;
tmp.st_ctime_nsec = kstat.ctime.tv_nsec as usize;
tmp.st_blocks = kstat.blocks as isize;
tmp.st_blksize = kstat.blksize as isize;
Ok(tmp)
}
}

View File

@ -4,6 +4,7 @@ mod acpi;
pub mod cpu;
pub mod driver;
pub mod elf;
pub mod filesystem;
pub mod fpu;
pub mod init;
pub mod interrupt;