1004e86ffSlogin use core::{ 2004e86ffSlogin hint::spin_loop, 3004e86ffSlogin ptr::null_mut, 4004e86ffSlogin sync::atomic::{AtomicUsize, Ordering}, 5004e86ffSlogin }; 6004e86ffSlogin 7004e86ffSlogin use alloc::{boxed::Box, format, string::ToString, sync::Arc}; 8004e86ffSlogin 9004e86ffSlogin use crate::{ 10b087521eSChiichen driver::{ 11b087521eSChiichen base::block::disk_info::Partition, 12b087521eSChiichen disk::ahci::{self}, 13b087521eSChiichen }, 14004e86ffSlogin filesystem::{ 15b087521eSChiichen devfs::devfs_init, 16004e86ffSlogin fat::fs::FATFileSystem, 17b087521eSChiichen procfs::procfs_init, 18004e86ffSlogin ramfs::RamFS, 19b087521eSChiichen sysfs::sysfs_init, 20ab5c8ca4Slogin vfs::{mount::MountFS, FileSystem, FileType}, 21004e86ffSlogin }, 222b771e32SGou Ngai include::bindings::bindings::PAGE_4K_SIZE, 23b087521eSChiichen kdebug, kerror, kinfo, 242b771e32SGou Ngai syscall::SystemError, 25004e86ffSlogin }; 26004e86ffSlogin 27004e86ffSlogin use super::{file::FileMode, utils::rsplit_path, IndexNode, InodeId}; 28004e86ffSlogin 29004e86ffSlogin /// @brief 原子地生成新的Inode号。 30004e86ffSlogin /// 请注意,所有的inode号都需要通过该函数来生成.全局的inode号,除了以下两个特殊的以外,都是唯一的 31004e86ffSlogin /// 特殊的两个inode号: 32004e86ffSlogin /// [0]: 对应'.'目录项 33004e86ffSlogin /// [1]: 对应'..'目录项 34004e86ffSlogin pub fn generate_inode_id() -> InodeId { 35004e86ffSlogin static INO: AtomicUsize = AtomicUsize::new(1); 36004e86ffSlogin return INO.fetch_add(1, Ordering::SeqCst); 37004e86ffSlogin } 38004e86ffSlogin 39004e86ffSlogin static mut __ROOT_INODE: *mut Arc<dyn IndexNode> = null_mut(); 40004e86ffSlogin 41004e86ffSlogin /// @brief 获取全局的根节点 42004e86ffSlogin #[inline(always)] 43004e86ffSlogin #[allow(non_snake_case)] 44004e86ffSlogin pub fn ROOT_INODE() -> Arc<dyn IndexNode> { 45004e86ffSlogin unsafe { 46004e86ffSlogin return __ROOT_INODE.as_ref().unwrap().clone(); 47004e86ffSlogin } 48004e86ffSlogin } 49004e86ffSlogin 50004e86ffSlogin #[no_mangle] 51004e86ffSlogin pub extern "C" fn vfs_init() -> i32 { 52004e86ffSlogin // 使用Ramfs作为默认的根文件系统 53004e86ffSlogin let ramfs = RamFS::new(); 54004e86ffSlogin let mount_fs = MountFS::new(ramfs, None); 55004e86ffSlogin let root_inode = Box::leak(Box::new(mount_fs.root_inode())); 56004e86ffSlogin 57004e86ffSlogin unsafe { 58004e86ffSlogin __ROOT_INODE = root_inode; 59004e86ffSlogin } 60004e86ffSlogin 61004e86ffSlogin // 创建文件夹 62004e86ffSlogin root_inode 63004e86ffSlogin .create("proc", FileType::Dir, 0o777) 64004e86ffSlogin .expect("Failed to create /proc"); 65004e86ffSlogin root_inode 66004e86ffSlogin .create("dev", FileType::Dir, 0o777) 67004e86ffSlogin .expect("Failed to create /dev"); 68dd9f1fc1STingHuang root_inode 69dd9f1fc1STingHuang .create("sys", FileType::Dir, 0o777) 70dd9f1fc1STingHuang .expect("Failed to create /sys"); 71b087521eSChiichen kdebug!("dir in root:{:?}", root_inode.list()); 72004e86ffSlogin 73b087521eSChiichen procfs_init().expect("Failed to initialize procfs"); 74004e86ffSlogin 75b087521eSChiichen devfs_init().expect("Failed to initialize devfs"); 76004e86ffSlogin 77b087521eSChiichen sysfs_init().expect("Failed to initialize sysfs"); 78dd9f1fc1STingHuang 79004e86ffSlogin let root_inode = ROOT_INODE().list().expect("VFS init failed"); 80004e86ffSlogin if root_inode.len() > 0 { 81004e86ffSlogin kinfo!("Successfully initialized VFS!"); 82004e86ffSlogin } 83004e86ffSlogin return 0; 84004e86ffSlogin } 85004e86ffSlogin 86004e86ffSlogin /// @brief 真正执行伪文件系统迁移的过程 87004e86ffSlogin /// 88004e86ffSlogin /// @param mountpoint_name 在根目录下的挂载点的名称 89004e86ffSlogin /// @param inode 原本的挂载点的inode 90004e86ffSlogin fn do_migrate( 91004e86ffSlogin new_root_inode: Arc<dyn IndexNode>, 92004e86ffSlogin mountpoint_name: &str, 93004e86ffSlogin fs: &MountFS, 94676b8ef6SMork ) -> Result<(), SystemError> { 95004e86ffSlogin let r = new_root_inode.find(mountpoint_name); 96004e86ffSlogin let mountpoint = if r.is_err() { 97004e86ffSlogin new_root_inode 98004e86ffSlogin .create(mountpoint_name, FileType::Dir, 0o777) 99b087521eSChiichen .expect(format!("Failed to create '/{mountpoint_name}' in migrating").as_str()) 100004e86ffSlogin } else { 101004e86ffSlogin r.unwrap() 102004e86ffSlogin }; 103004e86ffSlogin // 迁移挂载点 104004e86ffSlogin mountpoint 105004e86ffSlogin .mount(fs.inner_filesystem()) 106004e86ffSlogin .expect(format!("Failed to migrate {mountpoint_name} ").as_str()); 107004e86ffSlogin return Ok(()); 108004e86ffSlogin } 109004e86ffSlogin 110004e86ffSlogin /// @brief 迁移伪文件系统的inode 111004e86ffSlogin /// 请注意,为了避免删掉了伪文件系统内的信息,因此没有在原root inode那里调用unlink. 112676b8ef6SMork fn migrate_virtual_filesystem(new_fs: Arc<dyn FileSystem>) -> Result<(), SystemError> { 113004e86ffSlogin kinfo!("VFS: Migrating filesystems..."); 114004e86ffSlogin 115004e86ffSlogin // ==== 在这里获取要被迁移的文件系统的inode === 116004e86ffSlogin let binding = ROOT_INODE().find("proc").expect("ProcFS not mounted!").fs(); 117004e86ffSlogin let proc: &MountFS = binding.as_any_ref().downcast_ref::<MountFS>().unwrap(); 118004e86ffSlogin let binding = ROOT_INODE().find("dev").expect("DevFS not mounted!").fs(); 119004e86ffSlogin let dev: &MountFS = binding.as_any_ref().downcast_ref::<MountFS>().unwrap(); 120dd9f1fc1STingHuang let binding = ROOT_INODE().find("sys").expect("SysFs not mounted!").fs(); 121dd9f1fc1STingHuang let sys: &MountFS = binding.as_any_ref().downcast_ref::<MountFS>().unwrap(); 122004e86ffSlogin 123004e86ffSlogin let new_fs = MountFS::new(new_fs, None); 124004e86ffSlogin // 获取新的根文件系统的根节点的引用 125004e86ffSlogin let new_root_inode = Box::leak(Box::new(new_fs.root_inode())); 126004e86ffSlogin 127004e86ffSlogin // 把上述文件系统,迁移到新的文件系统下 128004e86ffSlogin do_migrate(new_root_inode.clone(), "proc", proc)?; 129004e86ffSlogin do_migrate(new_root_inode.clone(), "dev", dev)?; 130dd9f1fc1STingHuang do_migrate(new_root_inode.clone(), "sys", sys)?; 131004e86ffSlogin 132004e86ffSlogin unsafe { 133004e86ffSlogin // drop旧的Root inode 134004e86ffSlogin let old_root_inode: Box<Arc<dyn IndexNode>> = Box::from_raw(__ROOT_INODE); 135004e86ffSlogin __ROOT_INODE = null_mut(); 136004e86ffSlogin drop(old_root_inode); 137004e86ffSlogin 138004e86ffSlogin // 设置全局的新的ROOT Inode 139004e86ffSlogin __ROOT_INODE = new_root_inode; 140004e86ffSlogin } 141004e86ffSlogin 142004e86ffSlogin kinfo!("VFS: Migrate filesystems done!"); 143004e86ffSlogin 144004e86ffSlogin return Ok(()); 145004e86ffSlogin } 146004e86ffSlogin 147*1496ba7bSLoGin pub fn mount_root_fs() -> Result<(), SystemError> { 148004e86ffSlogin kinfo!("Try to mount FAT32 as root fs..."); 149b087521eSChiichen let partiton: Arc<Partition> = ahci::get_disks_by_name("ahci_disk_0".to_string()) 150004e86ffSlogin .unwrap() 151004e86ffSlogin .0 152004e86ffSlogin .lock() 153004e86ffSlogin .partitions[0] 154004e86ffSlogin .clone(); 155004e86ffSlogin 156676b8ef6SMork let fatfs: Result<Arc<FATFileSystem>, SystemError> = FATFileSystem::new(partiton); 157004e86ffSlogin if fatfs.is_err() { 158004e86ffSlogin kerror!( 159004e86ffSlogin "Failed to initialize fatfs, code={:?}", 160004e86ffSlogin fatfs.as_ref().err() 161004e86ffSlogin ); 162004e86ffSlogin loop { 163004e86ffSlogin spin_loop(); 164004e86ffSlogin } 165004e86ffSlogin } 166004e86ffSlogin let fatfs: Arc<FATFileSystem> = fatfs.unwrap(); 167004e86ffSlogin let r = migrate_virtual_filesystem(fatfs); 168004e86ffSlogin if r.is_err() { 169004e86ffSlogin kerror!("Failed to migrate virtual filesystem to FAT32!"); 170004e86ffSlogin loop { 171004e86ffSlogin spin_loop(); 172004e86ffSlogin } 173004e86ffSlogin } 174004e86ffSlogin kinfo!("Successfully migrate rootfs to FAT32!"); 175004e86ffSlogin 176*1496ba7bSLoGin return Ok(()); 177004e86ffSlogin } 178004e86ffSlogin 179004e86ffSlogin /// @brief 创建文件/文件夹 180676b8ef6SMork pub fn do_mkdir(path: &str, _mode: FileMode) -> Result<u64, SystemError> { 181004e86ffSlogin // 文件名过长 182004e86ffSlogin if path.len() > PAGE_4K_SIZE as usize { 183676b8ef6SMork return Err(SystemError::ENAMETOOLONG); 184004e86ffSlogin } 185004e86ffSlogin 186676b8ef6SMork let inode: Result<Arc<dyn IndexNode>, SystemError> = ROOT_INODE().lookup(path); 187004e86ffSlogin 188004e86ffSlogin if inode.is_err() { 189004e86ffSlogin let errno = inode.unwrap_err(); 190004e86ffSlogin // 文件不存在,且需要创建 191676b8ef6SMork if errno == SystemError::ENOENT { 192004e86ffSlogin let (filename, parent_path) = rsplit_path(path); 193004e86ffSlogin // 查找父目录 194004e86ffSlogin let parent_inode: Arc<dyn IndexNode> = 195004e86ffSlogin ROOT_INODE().lookup(parent_path.unwrap_or("/"))?; 196004e86ffSlogin // 创建文件夹 197004e86ffSlogin let _create_inode: Arc<dyn IndexNode> = 198004e86ffSlogin parent_inode.create(filename, FileType::Dir, 0o777)?; 199004e86ffSlogin } else { 200004e86ffSlogin // 不需要创建文件,因此返回错误码 201004e86ffSlogin return Err(errno); 202004e86ffSlogin } 203004e86ffSlogin } 204004e86ffSlogin 205004e86ffSlogin return Ok(0); 206004e86ffSlogin } 207004e86ffSlogin 208821bb9a2SXshine /// @brief 删除文件夹 209676b8ef6SMork pub fn do_remove_dir(path: &str) -> Result<u64, SystemError> { 210004e86ffSlogin // 文件名过长 211004e86ffSlogin if path.len() > PAGE_4K_SIZE as usize { 212676b8ef6SMork return Err(SystemError::ENAMETOOLONG); 213004e86ffSlogin } 214004e86ffSlogin 215676b8ef6SMork let inode: Result<Arc<dyn IndexNode>, SystemError> = ROOT_INODE().lookup(path); 216004e86ffSlogin 217004e86ffSlogin if inode.is_err() { 218004e86ffSlogin let errno = inode.unwrap_err(); 219004e86ffSlogin // 文件不存在 220676b8ef6SMork if errno == SystemError::ENOENT { 221676b8ef6SMork return Err(SystemError::ENOENT); 222004e86ffSlogin } 223004e86ffSlogin } 224004e86ffSlogin 225004e86ffSlogin let (filename, parent_path) = rsplit_path(path); 226004e86ffSlogin // 查找父目录 227004e86ffSlogin let parent_inode: Arc<dyn IndexNode> = ROOT_INODE().lookup(parent_path.unwrap_or("/"))?; 228004e86ffSlogin 229004e86ffSlogin if parent_inode.metadata()?.file_type != FileType::Dir { 230676b8ef6SMork return Err(SystemError::ENOTDIR); 231004e86ffSlogin } 232004e86ffSlogin 233004e86ffSlogin let target_inode: Arc<dyn IndexNode> = parent_inode.find(filename)?; 234004e86ffSlogin if target_inode.metadata()?.file_type != FileType::Dir { 235676b8ef6SMork return Err(SystemError::ENOTDIR); 236004e86ffSlogin } 237004e86ffSlogin 238004e86ffSlogin // 删除文件夹 239004e86ffSlogin parent_inode.rmdir(filename)?; 240004e86ffSlogin 241004e86ffSlogin return Ok(0); 242004e86ffSlogin } 243004e86ffSlogin 244004e86ffSlogin /// @brief 删除文件 245676b8ef6SMork pub fn do_unlink_at(path: &str, _mode: FileMode) -> Result<u64, SystemError> { 246004e86ffSlogin // 文件名过长 247004e86ffSlogin if path.len() > PAGE_4K_SIZE as usize { 248676b8ef6SMork return Err(SystemError::ENAMETOOLONG); 249004e86ffSlogin } 250004e86ffSlogin 251676b8ef6SMork let inode: Result<Arc<dyn IndexNode>, SystemError> = ROOT_INODE().lookup(path); 252004e86ffSlogin 253004e86ffSlogin if inode.is_err() { 254004e86ffSlogin let errno = inode.clone().unwrap_err(); 255004e86ffSlogin // 文件不存在,且需要创建 256676b8ef6SMork if errno == SystemError::ENOENT { 257676b8ef6SMork return Err(SystemError::ENOENT); 258004e86ffSlogin } 259004e86ffSlogin } 260004e86ffSlogin // 禁止在目录上unlink 261004e86ffSlogin if inode.unwrap().metadata()?.file_type == FileType::Dir { 262676b8ef6SMork return Err(SystemError::EPERM); 263004e86ffSlogin } 264004e86ffSlogin 265004e86ffSlogin let (filename, parent_path) = rsplit_path(path); 266004e86ffSlogin // 查找父目录 267004e86ffSlogin let parent_inode: Arc<dyn IndexNode> = ROOT_INODE().lookup(parent_path.unwrap_or("/"))?; 268004e86ffSlogin 269004e86ffSlogin if parent_inode.metadata()?.file_type != FileType::Dir { 270676b8ef6SMork return Err(SystemError::ENOTDIR); 271004e86ffSlogin } 272004e86ffSlogin 273004e86ffSlogin // 删除文件 274004e86ffSlogin parent_inode.unlink(filename)?; 275004e86ffSlogin 276004e86ffSlogin return Ok(0); 277004e86ffSlogin } 278