Demote LockedFileDescription to solve borrow rules

This commit is contained in:
Wildan M
2026-03-09 12:29:24 +07:00
parent 8f270795da
commit 206f82709a
4 changed files with 30 additions and 24 deletions
+4 -4
View File
@@ -16,12 +16,12 @@ use crate::{
},
cpu_set::{LogicalCpuId, LogicalCpuSet},
cpu_stats,
ipi::{ipi, IpiKind, IpiTarget},
memory::{allocate_p2frame, deallocate_p2frame, Enomem, Frame, RaiiFrame},
ipi::{IpiKind, IpiTarget, ipi},
memory::{Enomem, Frame, RaiiFrame, allocate_p2frame, deallocate_p2frame},
paging::{RmmA, RmmArch},
percpu::PercpuBlock,
scheme::{CallerCtx, FileHandle, SchemeId},
sync::{CleanLockToken, RwLock, L1},
sync::{CleanLockToken, L1, L4, LockToken, RwLock},
syscall::usercopy::UserSliceRw,
};
@@ -824,7 +824,7 @@ impl FdTbl {
&self,
scheme_id: SchemeId,
scheme_number: usize,
token: &mut CleanLockToken,
token: &mut LockToken<L4>,
) -> Result<FileDescriptor> {
self.iter()
.flatten()
+2 -2
View File
@@ -3,13 +3,13 @@
use crate::{
event,
scheme::{self, SchemeId},
sync::{CleanLockToken, RwLock, L1},
sync::{CleanLockToken, RwLock, L5},
syscall::error::Result,
};
use alloc::sync::Arc;
use syscall::{schemev2::NewFdFlags, RwFlags, O_APPEND, O_NONBLOCK};
pub type LockedFileDescription = RwLock<L1, FileDescription>;
pub type LockedFileDescription = RwLock<L5, FileDescription>;
/// A file description
#[derive(Clone, Copy, Debug)]
+7 -5
View File
@@ -1010,11 +1010,13 @@ impl UserInner {
let (pid, desc) = {
let context_lock = context::current();
let context = context_lock.read(token.token());
let desc = context
.files
.read()
.find_by_scheme(self.scheme_id, file, token)?;
let mut context = context_lock.read(token.token());
let (context, mut lock_token) = context.token_split();
let desc =
context
.files
.read()
.find_by_scheme(self.scheme_id, file, &mut lock_token)?;
(context.pid, desc.description)
};
+17 -13
View File
@@ -333,9 +333,10 @@ fn fdwrite_inner(
let (scheme, number, descs_to_send) = {
let (scheme, number) = {
let current_lock = context::current();
let current = current_lock.read(token.token());
let mut current = current_lock.read(token.token());
let (current, mut lock_token) = current.token_split();
let file_descriptor = current.get_file(socket).ok_or(Error::new(EBADF))?;
let desc = &file_descriptor.description.read(token.token());
let desc = &file_descriptor.description.read(lock_token.token());
(desc.scheme, desc.number)
};
let scheme = scheme::get_scheme(token.token(), scheme)?;
@@ -384,9 +385,10 @@ fn call_fdread(
let (scheme, number) = {
let (scheme, number) = {
let current_lock = context::current();
let current = current_lock.read(token.token());
let mut current = current_lock.read(token.token());
let (current, mut lock_token) = current.token_split();
let file_descriptor = current.get_file(fd).ok_or(Error::new(EBADF))?;
let desc = file_descriptor.description.read(token.token());
let desc = file_descriptor.description.read(lock_token.token());
(desc.scheme, desc.number)
};
let scheme = scheme::get_scheme(token.token(), scheme)?;
@@ -422,7 +424,10 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize, token: &mut CleanLockToken)
.get_file(fd)
.ok_or(Error::new(EBADF))?;
let description = file.description.read(token.token());
let (scheme_id, number, flags) = {
let desc = file.description.write(token.token());
(desc.scheme, desc.number, desc.flags)
};
if cmd == F_DUPFD || cmd == F_DUPFD_CLOEXEC {
// Not in match because 'files' cannot be locked
@@ -439,15 +444,16 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize, token: &mut CleanLockToken)
// Communicate fcntl with scheme
if cmd != F_GETFD && cmd != F_SETFD {
let scheme = scheme::get_scheme(token.token(), description.scheme)?;
let scheme = scheme::get_scheme(token.token(), scheme_id)?;
scheme.fcntl(description.number, cmd, arg, token)?;
scheme.fcntl(number, cmd, arg, token)?;
};
// Perform kernel operation if scheme agrees
{
let context_lock = context::current();
let context = context_lock.read(token.token());
let mut context = context_lock.read(token.token());
let (context, mut lock_token) = context.token_split();
let mut files = context.files.write();
match *files.get_mut(fd.get()).ok_or(Error::new(EBADF))? {
@@ -463,12 +469,10 @@ pub fn fcntl(fd: FileHandle, cmd: usize, arg: usize, token: &mut CleanLockToken)
file.cloexec = arg & O_CLOEXEC == O_CLOEXEC;
Ok(0)
}
F_GETFL => Ok(description.flags as usize),
F_GETFL => Ok(flags as usize),
F_SETFL => {
let new_flags =
(description.flags & O_ACCMODE as u32) | (arg as u32 & !O_ACCMODE as u32);
drop(description);
file.description.write(token.token()).flags = new_flags;
let new_flags = (flags & O_ACCMODE as u32) | (arg as u32 & !O_ACCMODE as u32);
file.description.write(lock_token.token()).flags = new_flags;
Ok(0)
}
_ => Err(Error::new(EINVAL)),