diff --git a/src/services/libs/jinux-std/src/fs/file_handle/file.rs b/src/services/libs/jinux-std/src/fs/file_handle/file.rs index 85a6ac82e..5e59233fb 100644 --- a/src/services/libs/jinux-std/src/fs/file_handle/file.rs +++ b/src/services/libs/jinux-std/src/fs/file_handle/file.rs @@ -28,4 +28,8 @@ pub trait File: Send + Sync + Any { fn poll(&self) -> IoEvents { IoEvents::empty() } + + fn flush(&self) -> Result<()> { + Ok(()) + } } diff --git a/src/services/libs/jinux-std/src/fs/file_handle/mod.rs b/src/services/libs/jinux-std/src/fs/file_handle/mod.rs index d6d2f0922..08e386882 100644 --- a/src/services/libs/jinux-std/src/fs/file_handle/mod.rs +++ b/src/services/libs/jinux-std/src/fs/file_handle/mod.rs @@ -6,6 +6,7 @@ mod inode_handle; use crate::prelude::*; use crate::rights::{ReadOp, WriteOp}; use alloc::sync::Arc; +use core::ops::Range; pub use self::file::File; pub use self::inode_handle::InodeHandle; @@ -65,4 +66,20 @@ impl FileHandle { } } } + + pub fn clean_for_close(&self) -> Result<()> { + match &self.inner { + Inner::Inode(inode_handle) => { + let dentry = inode_handle.dentry(); + let ref_count = Arc::strong_count(dentry); + // The dentry is held by dentry cache and self + if ref_count == 2 { + let page_cache_size = dentry.vnode().pages().size(); + dentry.vnode().pages().decommit(0..page_cache_size)?; + } + } + Inner::File(file) => file.flush()?, + } + Ok(()) + } } diff --git a/src/services/libs/jinux-std/src/fs/file_table.rs b/src/services/libs/jinux-std/src/fs/file_table.rs index 6b3dfd7c8..9b2a0c85f 100644 --- a/src/services/libs/jinux-std/src/fs/file_table.rs +++ b/src/services/libs/jinux-std/src/fs/file_table.rs @@ -58,8 +58,8 @@ impl FileTable { fd } - pub fn close_file(&mut self, fd: FileDescripter) { - self.table.remove(&fd); + pub fn close_file(&mut self, fd: FileDescripter) -> Option { + self.table.remove(&fd) } pub fn get_file(&self, fd: FileDescripter) -> Result<&FileHandle> { diff --git a/src/services/libs/jinux-std/src/syscall/close.rs b/src/services/libs/jinux-std/src/syscall/close.rs index 3e3ca7562..3061664ad 100644 --- a/src/services/libs/jinux-std/src/syscall/close.rs +++ b/src/services/libs/jinux-std/src/syscall/close.rs @@ -9,6 +9,7 @@ pub fn sys_close(fd: FileDescripter) -> Result { let current = current!(); let mut file_table = current.file_table().lock(); let _ = file_table.get_file(fd)?; - file_table.close_file(fd); + let file = file_table.close_file(fd).unwrap(); + file.clean_for_close()?; Ok(SyscallReturn::Return(0)) }