feat: Implment std_fs_call kfstatvfs handling to memory scheme

This commit is contained in:
Ibuki Omatsu
2026-02-28 15:06:47 +00:00
committed by Jeremy Soller
parent 507d899587
commit 4faa1bad45
3 changed files with 33 additions and 5 deletions
Generated
+2 -2
View File
@@ -201,9 +201,9 @@ checksum = "64072665120942deff5fd5425d6c1811b854f4939e7f1c01ce755f64432bbea7"
[[package]]
name = "redox_syscall"
version = "0.7.2"
version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d94dd2f7cd932d4dc02cc8b2b50dfd38bd079a4e5d79198b99743d7fcf9a4b4"
checksum = "6ce70a74e890531977d37e532c34d45e9055d2409ed08ddba14529471ed0be16"
dependencies = [
"bitflags 2.10.0",
]
+1 -1
View File
@@ -15,7 +15,7 @@ bitflags = "2"
hashbrown = { version = "0.14.3", default-features = false, features = ["ahash", "inline-more"] }
linked_list_allocator = "0.9.0"
redox-path = "0.2.0"
redox_syscall = { version = "0.7.2", default-features = false }
redox_syscall = { version = "0.7.3", default-features = false }
rmm = { path = "rmm", default-features = false }
slab = { version = "0.4", default-features = false }
spin = { version = "0.9.8" }
+30 -2
View File
@@ -5,7 +5,7 @@ use rmm::PhysicalAddress;
use crate::{
context::{
file::InternalFlags,
file::{FileDescription, InternalFlags},
memory::{handle_notify_files, AddrSpace, AddrSpaceWrapper, Grant, PageSpan},
},
memory::{free_frames, used_frames, Frame, PAGE_SIZE},
@@ -19,7 +19,7 @@ use crate::paging::entry::EntryFlags;
use crate::syscall::{
data::{Map, StatVfs},
error::*,
flag::MapFlags,
flag::{CallFlags, MapFlags},
usercopy::UserSliceWo,
};
@@ -335,4 +335,32 @@ impl KernelScheme for MemoryScheme {
Ok(())
}
fn kstdfscall(
&self,
id: usize,
_desc: Arc<spin::RwLock<FileDescription>>,
payload: UserSliceRw,
_flags: CallFlags,
metadata: &[u64],
token: &mut CleanLockToken,
) -> Result<usize> {
use syscall::flag::StdFsCallKind::{self, *};
let Some(raw_kind) = metadata.first().map(|v| *v as u8) else {
return Err(Error::new(EOPNOTSUPP));
};
let Some(kind) = StdFsCallKind::try_from_raw(raw_kind) else {
return Err(Error::new(EOPNOTSUPP));
};
match kind {
Fstatvfs => {
if payload.len() != core::mem::size_of::<StatVfs>() {
return Err(Error::new(EINVAL));
}
self.kfstatvfs(id, UserSliceWo::new(payload.addr(), payload.len())?, token)
.map(|_| 0)
}
_ => Err(Error::new(EOPNOTSUPP)),
}
}
}