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
+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)),
}
}
}