From 5bc1312a91eed09ceee76df7cc98a02d75a16c4a Mon Sep 17 00:00:00 2001 From: LI Qing Date: Mon, 27 Nov 2023 15:44:29 +0800 Subject: [PATCH] Add support for the sync and fsync syscall --- .../libs/aster-std/src/fs/utils/dentry.rs | 5 ++++ services/libs/aster-std/src/fs/utils/mount.rs | 12 +++++++++ services/libs/aster-std/src/syscall/fsync.rs | 25 +++++++++++++++++++ services/libs/aster-std/src/syscall/mod.rs | 8 ++++++ services/libs/aster-std/src/syscall/sync.rs | 12 +++++++++ 5 files changed, 62 insertions(+) create mode 100644 services/libs/aster-std/src/syscall/fsync.rs create mode 100644 services/libs/aster-std/src/syscall/sync.rs diff --git a/services/libs/aster-std/src/fs/utils/dentry.rs b/services/libs/aster-std/src/fs/utils/dentry.rs index 4e0093d24..a4c3d8c6e 100644 --- a/services/libs/aster-std/src/fs/utils/dentry.rs +++ b/services/libs/aster-std/src/fs/utils/dentry.rs @@ -383,6 +383,11 @@ impl Dentry { self.inode.fs() } + /// Flushes all changes made to data and metadata to the device. + pub fn sync(&self) -> Result<()> { + self.inode.sync() + } + /// Get the inode metadata pub fn inode_metadata(&self) -> Metadata { self.inode.metadata() diff --git a/services/libs/aster-std/src/fs/utils/mount.rs b/services/libs/aster-std/src/fs/utils/mount.rs index 1c598eedb..044a6bfdf 100644 --- a/services/libs/aster-std/src/fs/utils/mount.rs +++ b/services/libs/aster-std/src/fs/utils/mount.rs @@ -101,6 +101,18 @@ impl MountNode { self.mountpoint_dentry.as_ref() } + /// Flushes all pending filesystem metadata and cached file data to the device. + pub fn sync(&self) -> Result<()> { + let children = self.children.lock(); + for child in children.values() { + child.sync()?; + } + drop(children); + + self.fs.sync()?; + Ok(()) + } + /// Try to get the parent mount node. pub fn parent(&self) -> Option> { self.mountpoint_dentry diff --git a/services/libs/aster-std/src/syscall/fsync.rs b/services/libs/aster-std/src/syscall/fsync.rs new file mode 100644 index 000000000..1e31934e7 --- /dev/null +++ b/services/libs/aster-std/src/syscall/fsync.rs @@ -0,0 +1,25 @@ +use crate::log_syscall_entry; +use crate::{ + fs::{file_table::FileDescripter, inode_handle::InodeHandle}, + prelude::*, +}; + +use super::SyscallReturn; +use super::SYS_FSYNC; + +pub fn sys_fsync(fd: FileDescripter) -> Result { + log_syscall_entry!(SYS_FSYNC); + debug!("fd = {}", fd); + + let dentry = { + let current = current!(); + let file_table = current.file_table().lock(); + let file = file_table.get_file(fd)?; + let inode_handle = file + .downcast_ref::() + .ok_or(Error::with_message(Errno::EINVAL, "not inode"))?; + inode_handle.dentry().clone() + }; + dentry.sync()?; + Ok(SyscallReturn::Return(0)) +} diff --git a/services/libs/aster-std/src/syscall/mod.rs b/services/libs/aster-std/src/syscall/mod.rs index 731b41321..fad21485b 100644 --- a/services/libs/aster-std/src/syscall/mod.rs +++ b/services/libs/aster-std/src/syscall/mod.rs @@ -17,6 +17,7 @@ use crate::syscall::exit::sys_exit; use crate::syscall::exit_group::sys_exit_group; use crate::syscall::fcntl::sys_fcntl; use crate::syscall::fork::sys_fork; +use crate::syscall::fsync::sys_fsync; use crate::syscall::futex::sys_futex; use crate::syscall::getcwd::sys_getcwd; use crate::syscall::getdents64::sys_getdents64; @@ -59,6 +60,7 @@ use crate::syscall::setpgid::sys_setpgid; use crate::syscall::stat::{sys_fstat, sys_fstatat, sys_lstat, sys_stat}; use crate::syscall::statfs::{sys_fstatfs, sys_statfs}; use crate::syscall::symlink::{sys_symlink, sys_symlinkat}; +use crate::syscall::sync::sys_sync; use crate::syscall::tgkill::sys_tgkill; use crate::syscall::time::sys_time; use crate::syscall::umask::sys_umask; @@ -123,6 +125,7 @@ mod exit; mod exit_group; mod fcntl; mod fork; +mod fsync; mod futex; mod getcwd; mod getdents64; @@ -192,6 +195,7 @@ mod socketpair; mod stat; mod statfs; mod symlink; +mod sync; mod tgkill; mod time; mod umask; @@ -283,6 +287,7 @@ define_syscall_nums!( SYS_KILL = 62, SYS_UNAME = 63, SYS_FCNTL = 72, + SYS_FSYNC = 74, SYS_GETCWD = 79, SYS_CHDIR = 80, SYS_FCHDIR = 81, @@ -323,6 +328,7 @@ define_syscall_nums!( SYS_FSTATFS = 138, SYS_PRCTL = 157, SYS_ARCH_PRCTL = 158, + SYS_SYNC = 162, SYS_GETTID = 186, SYS_TIME = 201, SYS_FUTEX = 202, @@ -459,6 +465,7 @@ pub fn syscall_dispatch( SYS_KILL => syscall_handler!(2, sys_kill, args), SYS_UNAME => syscall_handler!(1, sys_uname, args), SYS_FCNTL => syscall_handler!(3, sys_fcntl, args), + SYS_FSYNC => syscall_handler!(1, sys_fsync, args), SYS_GETCWD => syscall_handler!(2, sys_getcwd, args), SYS_CHDIR => syscall_handler!(1, sys_chdir, args), SYS_FCHDIR => syscall_handler!(1, sys_fchdir, args), @@ -499,6 +506,7 @@ pub fn syscall_dispatch( SYS_FSTATFS => syscall_handler!(2, sys_fstatfs, args), SYS_PRCTL => syscall_handler!(5, sys_prctl, args), SYS_ARCH_PRCTL => syscall_handler!(2, sys_arch_prctl, args, context), + SYS_SYNC => syscall_handler!(0, sys_sync), SYS_GETTID => syscall_handler!(0, sys_gettid), SYS_TIME => syscall_handler!(1, sys_time, args), SYS_FUTEX => syscall_handler!(6, sys_futex, args), diff --git a/services/libs/aster-std/src/syscall/sync.rs b/services/libs/aster-std/src/syscall/sync.rs new file mode 100644 index 000000000..643020113 --- /dev/null +++ b/services/libs/aster-std/src/syscall/sync.rs @@ -0,0 +1,12 @@ +use crate::log_syscall_entry; +use crate::prelude::*; + +use super::SyscallReturn; +use super::SYS_SYNC; + +pub fn sys_sync() -> Result { + log_syscall_entry!(SYS_SYNC); + + crate::fs::rootfs::root_mount().sync()?; + Ok(SyscallReturn::Return(0)) +}