[libos] Change ROOT_INODE to ROOT_FS
Filesystem should be the owner of its root inode
This commit is contained in:
		
							parent
							
								
									6353817af8
								
							
						
					
					
						commit
						b40408cb91
					
				
							
								
								
									
										2
									
								
								deps/sefs
									
									
									
									
										vendored
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										2
									
								
								deps/sefs
									
									
									
									
										vendored
									
									
								
							| @ -1 +1 @@ | ||||
| Subproject commit d26132ca7b5a3338046e4b644cb75953981f0feb | ||||
| Subproject commit d20c9e40853b59162baff3bc82070a8fa5f28537 | ||||
| @ -301,7 +301,7 @@ fn do_exec_thread(libos_tid: pid_t, host_tid: pid_t) -> Result<i32> { | ||||
|     // 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.
 | ||||
|  | ||||
| @ -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(()) | ||||
| } | ||||
| 
 | ||||
|  | ||||
| @ -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(()) | ||||
| } | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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}; | ||||
|  | ||||
| @ -15,29 +15,26 @@ use rcore_fs_unionfs::UnionFS; | ||||
| 
 | ||||
| lazy_static! { | ||||
|     /// The root of file system
 | ||||
|     pub static ref ROOT_INODE: RwLock<Arc<dyn INode>> = { | ||||
|         fn init_root_inode() -> Result<Arc<dyn INode>> { | ||||
|     pub static ref ROOT_FS: RwLock<Arc<dyn FileSystem>> = { | ||||
|         fn init_root_fs() -> Result<Arc<dyn FileSystem>> { | ||||
|             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<ConfigMount>, | ||||
|     user_key: &Option<sgx_key_128bit_t>, | ||||
| ) -> Result<Arc<MountFS>> { | ||||
| ) -> Result<Arc<dyn FileSystem>> { | ||||
|     let root_mount_config = mount_configs | ||||
|         .iter() | ||||
|         .find(|m| m.target == Path::new("/") && m.type_ == ConfigMountFsType::TYPE_UNIONFS) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user