Skip to content

Commit 3000bdc

Browse files
fcntl: fix F_{GET, SET}FD
Signed-off-by: Andy-Python-Programmer <[email protected]>
1 parent 50b9e44 commit 3000bdc

File tree

2 files changed

+29
-14
lines changed

2 files changed

+29
-14
lines changed

src/aero_kernel/src/fs/file_table.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,13 +19,12 @@
1919

2020
use core::sync::atomic::{AtomicUsize, Ordering};
2121

22-
use aero_syscall::prelude::FdFlags;
2322
use aero_syscall::{OpenFlags, SysDirEntry};
2423

2524
use alloc::sync::Arc;
2625
use alloc::vec::Vec;
2726

28-
use spin::{Mutex, RwLock};
27+
use spin::RwLock;
2928

3029
use crate::fs::cache::DirCacheImpl;
3130

@@ -46,7 +45,6 @@ pub struct FileHandle {
4645
// is duplicated, the `offset` needs to be in sync with the parent.
4746
pub offset: Arc<AtomicUsize>,
4847
pub flags: RwLock<OpenFlags>,
49-
pub fd_flags: Mutex<FdFlags>,
5048
}
5149

5250
impl FileHandle {
@@ -57,7 +55,6 @@ impl FileHandle {
5755
inode: inode.clone(),
5856
offset: Arc::new(AtomicUsize::new(0)),
5957
flags: RwLock::new(flags),
60-
fd_flags: Mutex::new(FdFlags::empty()),
6158
}
6259
}
6360

@@ -129,7 +126,6 @@ impl FileHandle {
129126
inode: self.inode.clone(),
130127
offset: self.offset.clone(),
131128
flags: RwLock::new(flags),
132-
fd_flags: Mutex::new(self.fd_flags.lock().clone()),
133129
});
134130

135131
new.inode.inode().open(flags, new.clone())?;
@@ -228,9 +224,7 @@ impl FileTable {
228224
if let Some(handle) = file {
229225
let flags = *handle.flags.read();
230226

231-
if flags.contains(OpenFlags::O_CLOEXEC)
232-
|| handle.fd_flags.lock().contains(FdFlags::CLOEXEC)
233-
{
227+
if flags.contains(OpenFlags::O_CLOEXEC) {
234228
handle.inode().close(flags);
235229
*file = None;
236230
}

src/aero_kernel/src/syscall/fs.rs

Lines changed: 27 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -236,7 +236,7 @@ pub fn ioctl(fd: usize, command: usize, argument: usize) -> Result<usize, Syscal
236236
// Sets the close-on-exec file descriptor flag. This is equivalent
237237
// to `fcntl(fd, F_SETFD, FD_CLOEXEC)`
238238
FIOCLEX => {
239-
handle.fd_flags.lock().insert(FdFlags::CLOEXEC);
239+
handle.flags.write().insert(OpenFlags::O_CLOEXEC);
240240
Ok(0)
241241
}
242242

@@ -327,6 +327,14 @@ pub fn access(fd: usize, path: &Path, _mode: usize, _flags: usize) -> Result<usi
327327
}
328328
}
329329

330+
const SETFL_MASK: OpenFlags = OpenFlags::from_bits_truncate(
331+
OpenFlags::O_APPEND.bits()
332+
| OpenFlags::O_NONBLOCK.bits()
333+
// | OpenFlags::O_NDELAY.bits()
334+
| OpenFlags::O_DIRECT.bits()
335+
| OpenFlags::O_NOATIME.bits(),
336+
);
337+
330338
#[syscall]
331339
pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result<usize, SyscallError> {
332340
let handle = scheduler::get_scheduler()
@@ -361,14 +369,26 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result<usize, SyscallErro
361369

362370
// Get the value of file descriptor flags.
363371
aero_syscall::prelude::F_GETFD => {
364-
let flags = handle.fd_flags.lock().bits();
365-
Ok(flags)
372+
let flags = handle.flags.read();
373+
let mut result = FdFlags::empty();
374+
375+
if flags.contains(OpenFlags::O_CLOEXEC) {
376+
result.insert(FdFlags::CLOEXEC);
377+
}
378+
379+
Ok(result.bits())
366380
}
367381

368382
// Set the value of file descriptor flags:
369383
aero_syscall::prelude::F_SETFD => {
370-
let flags = FdFlags::from_bits(arg).ok_or(SyscallError::EINVAL)?;
371-
handle.fd_flags.lock().insert(flags);
384+
let mut flags = handle.flags.write();
385+
let fd_flags = FdFlags::from_bits_truncate(arg);
386+
387+
if fd_flags.contains(FdFlags::CLOEXEC) {
388+
flags.insert(OpenFlags::O_CLOEXEC);
389+
} else {
390+
flags.remove(OpenFlags::O_CLOEXEC);
391+
}
372392

373393
Ok(0)
374394
}
@@ -381,7 +401,8 @@ pub fn fcntl(fd: usize, command: usize, arg: usize) -> Result<usize, SyscallErro
381401

382402
aero_syscall::prelude::F_SETFL => {
383403
let flags = OpenFlags::from_bits_truncate(arg);
384-
*handle.flags.write() = flags;
404+
let old_flags = *handle.flags.read();
405+
*handle.flags.write() = (flags & SETFL_MASK) | (old_flags & !SETFL_MASK);
385406

386407
Ok(0)
387408
}

0 commit comments

Comments
 (0)