From b40408cb91ac5b44ce963587a3f65fb08ad4b463 Mon Sep 17 00:00:00 2001 From: LI Qing Date: Fri, 14 Jan 2022 10:01:55 +0800 Subject: [PATCH] [libos] Change ROOT_INODE to ROOT_FS Filesystem should be the owner of its root inode --- deps/sefs | 2 +- src/libos/src/entry.rs | 2 +- src/libos/src/fs/fs_ops/mount.rs | 30 ++++++++++++++++-------------- src/libos/src/fs/fs_ops/sync.rs | 2 +- src/libos/src/fs/fs_view.rs | 6 ++++-- src/libos/src/fs/mod.rs | 2 +- src/libos/src/fs/rootfs.rs | 21 +++++++++------------ 7 files changed, 33 insertions(+), 32 deletions(-) diff --git a/deps/sefs b/deps/sefs index d26132ca..d20c9e40 160000 --- a/deps/sefs +++ b/deps/sefs @@ -1 +1 @@ -Subproject commit d26132ca7b5a3338046e4b644cb75953981f0feb +Subproject commit d20c9e40853b59162baff3bc82070a8fa5f28537 diff --git a/src/libos/src/entry.rs b/src/libos/src/entry.rs index 8a5ed4b0..e37c8ace 100644 --- a/src/libos/src/entry.rs +++ b/src/libos/src/entry.rs @@ -301,7 +301,7 @@ fn do_exec_thread(libos_tid: pid_t, host_tid: pid_t) -> Result { // sync file system // TODO: only sync when all processes exit use rcore_fs::vfs::FileSystem; - crate::fs::ROOT_INODE.read().unwrap().fs().sync()?; + crate::fs::ROOT_FS.read().unwrap().sync()?; // Not to be confused with the return value of a main function. // The exact meaning of status is described in wait(2) man page. diff --git a/src/libos/src/fs/fs_ops/mount.rs b/src/libos/src/fs/fs_ops/mount.rs index 00cc03cc..b70f1321 100644 --- a/src/libos/src/fs/fs_ops/mount.rs +++ b/src/libos/src/fs/fs_ops/mount.rs @@ -22,15 +22,12 @@ pub fn do_mount_rootfs( if MOUNT_ONCE.is_completed() { return_errno!(EPERM, "rootfs cannot be mounted more than once"); } - let new_root_inode = { - let rootfs = open_root_fs_according_to(&user_config.mount, user_key)?; - rootfs.root_inode() - }; - mount_nonroot_fs_according_to(&new_root_inode, &user_config.mount, user_key, true)?; + let new_rootfs = open_root_fs_according_to(&user_config.mount, user_key)?; + mount_nonroot_fs_according_to(&new_rootfs.root_inode(), &user_config.mount, user_key, true)?; MOUNT_ONCE.call_once(|| { - let mut root_inode = ROOT_INODE.write().unwrap(); - root_inode.fs().sync().expect("failed to sync old rootfs"); - *root_inode = new_root_inode; + let mut rootfs = ROOT_FS.write().unwrap(); + rootfs.sync().expect("failed to sync old rootfs"); + *rootfs = new_rootfs; *ENTRY_POINTS.write().unwrap() = user_config.entry_points.to_owned(); }); // Write resolv.conf file into mounted file system @@ -132,11 +129,16 @@ pub fn do_mount( } }; - let mut root_inode = ROOT_INODE.write().unwrap(); + let mut rootfs = ROOT_FS.write().unwrap(); // Should we sync the fs before mount? - root_inode.fs().sync()?; + rootfs.sync()?; let follow_symlink = !flags.contains(MountFlags::MS_NOSYMFOLLOW); - mount_nonroot_fs_according_to(&*root_inode, &mount_configs, &user_key, follow_symlink)?; + mount_nonroot_fs_according_to( + &rootfs.root_inode(), + &mount_configs, + &user_key, + follow_symlink, + )?; Ok(()) } @@ -153,11 +155,11 @@ pub fn do_umount(target: &str, flags: UmountFlags) -> Result<()> { fs.convert_to_abs_path(target) }; - let mut root_inode = ROOT_INODE.write().unwrap(); + let mut rootfs = ROOT_FS.write().unwrap(); // Should we sync the fs before umount? - root_inode.fs().sync()?; + rootfs.sync()?; let follow_symlink = !flags.contains(UmountFlags::UMOUNT_NOFOLLOW); - umount_nonroot_fs(&*root_inode, &target, follow_symlink)?; + umount_nonroot_fs(&rootfs.root_inode(), &target, follow_symlink)?; Ok(()) } diff --git a/src/libos/src/fs/fs_ops/sync.rs b/src/libos/src/fs/fs_ops/sync.rs index bfe7b48a..a8dd06c9 100644 --- a/src/libos/src/fs/fs_ops/sync.rs +++ b/src/libos/src/fs/fs_ops/sync.rs @@ -2,6 +2,6 @@ use super::*; pub fn do_sync() -> Result<()> { debug!("sync:"); - ROOT_INODE.read().unwrap().fs().sync()?; + ROOT_FS.read().unwrap().sync()?; Ok(()) } diff --git a/src/libos/src/fs/fs_view.rs b/src/libos/src/fs/fs_view.rs index 539ffc13..c28a1a2e 100644 --- a/src/libos/src/fs/fs_view.rs +++ b/src/libos/src/fs/fs_view.rs @@ -165,17 +165,19 @@ impl FsView { if path.len() > 0 && path.as_bytes()[0] == b'/' { // absolute path let abs_path = path.trim_start_matches('/'); - let inode = ROOT_INODE + let inode = ROOT_FS .read() .unwrap() + .root_inode() .lookup_follow(abs_path, MAX_SYMLINKS)?; Ok(inode) } else { // relative path let cwd = self.cwd().trim_start_matches('/'); - let inode = ROOT_INODE + let inode = ROOT_FS .read() .unwrap() + .root_inode() .lookup_follow(cwd, MAX_SYMLINKS)? .lookup_follow(path, MAX_SYMLINKS)?; Ok(inode) diff --git a/src/libos/src/fs/mod.rs b/src/libos/src/fs/mod.rs index 8fdf9c78..4ff2f74e 100644 --- a/src/libos/src/fs/mod.rs +++ b/src/libos/src/fs/mod.rs @@ -31,7 +31,7 @@ pub use self::fs_view::FsView; pub use self::host_fd::HostFd; pub use self::inode_file::{AsINodeFile, INodeExt, INodeFile}; pub use self::pipe::PipeType; -pub use self::rootfs::ROOT_INODE; +pub use self::rootfs::ROOT_FS; pub use self::stdio::{HostStdioFds, StdinFile, StdoutFile}; pub use self::syscalls::*; pub use self::timer_file::{AsTimer, TimerCreationFlags, TimerFile}; diff --git a/src/libos/src/fs/rootfs.rs b/src/libos/src/fs/rootfs.rs index b4443e7f..e6793e1b 100644 --- a/src/libos/src/fs/rootfs.rs +++ b/src/libos/src/fs/rootfs.rs @@ -15,29 +15,26 @@ use rcore_fs_unionfs::UnionFS; lazy_static! { /// The root of file system - pub static ref ROOT_INODE: RwLock> = { - fn init_root_inode() -> Result> { + pub static ref ROOT_FS: RwLock> = { + fn init_root_fs() -> Result> { let mount_config = &config::LIBOS_CONFIG.mount; - let root_inode = { - let rootfs = open_root_fs_according_to(mount_config, &None)?; - rootfs.root_inode() - }; - mount_nonroot_fs_according_to(&root_inode, mount_config, &None, true)?; - Ok(root_inode) + let rootfs = open_root_fs_according_to(mount_config, &None)?; + mount_nonroot_fs_according_to(&rootfs.root_inode(), mount_config, &None, true)?; + Ok(rootfs) } - let root_inode = init_root_inode().unwrap_or_else(|e| { - error!("failed to init root inode: {}", e.backtrace()); + let rootfs = init_root_fs().unwrap_or_else(|e| { + error!("failed to init root fs: {}", e.backtrace()); panic!(); }); - RwLock::new(root_inode) + RwLock::new(rootfs) }; } pub fn open_root_fs_according_to( mount_configs: &Vec, user_key: &Option, -) -> Result> { +) -> Result> { let root_mount_config = mount_configs .iter() .find(|m| m.target == Path::new("/") && m.type_ == ConfigMountFsType::TYPE_UNIONFS)