Demote LockedFileDescription to solve borrow rules
This commit is contained in:
@@ -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
@@ -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
@@ -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
@@ -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)),
|
||||
|
||||
Reference in New Issue
Block a user