#include "fs/tmpfs/FileSystem.h" #include "fs/devices/DeviceRegistry.h" #include "fs/tmpfs/Inode.h" #include "thread/Clock.h" #include #include #include namespace TmpFS { Result> FileSystem::create() { SharedPtr fs = TRY(adopt_shared_if_nonnull(new (std::nothrow) FileSystem())); SharedPtr root = TRY(fs->create_dir_inode({}, 0755)); fs->set_root(root); return (SharedPtr)fs; } Result FileSystem::allocate_inode_number() { return m_next_inode_number++; } Result> FileSystem::create_file_inode(mode_t mode) { SharedPtr inode = TRY(make_shared()); inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); inode->m_metadata.mode = mode; inode->m_metadata.initialize_times(); return (SharedPtr)inode; } Result> FileSystem::create_symlink_inode(StringView link) { SharedPtr inode = TRY(make_shared()); inode->set_fs(*this, {}); TRY(inode->set_link(link, {})); inode->set_inode_number(m_next_inode_number++, {}); inode->m_metadata.initialize_times(); return (SharedPtr)inode; } Result> FileSystem::create_dir_inode(SharedPtr parent, mode_t mode) { SharedPtr inode = TRY(make_shared()); TRY(inode->add_entry(inode, ".")); TRY(inode->add_entry(parent ? parent : (SharedPtr)inode, "..")); inode->set_self(inode, {}); inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); inode->m_metadata.mode = mode; inode->m_metadata.initialize_times(); return (SharedPtr)inode; } Result> FileSystem::create_device_inode(u32 major, u32 minor, mode_t mode) { SharedPtr device = TRY(DeviceRegistry::fetch_special_device(major, minor)); SharedPtr inode = TRY(make_shared()); inode->set_fs(*this, {}); inode->set_inode_number(m_next_inode_number++, {}); inode->set_device(device, {}); // FIXME: This should be queried from Device directly, but Device doesn't have an API to store and retrieve its // device ID atm. inode->set_device_id(luna_dev_makedev(major, minor), {}); inode->m_metadata.mode = mode; inode->m_metadata.initialize_times(); inode->m_metadata.size = device->size(); return (SharedPtr)inode; } FileSystem::FileSystem() { m_host_device_id = DeviceRegistry::next_null_device_id(); } Result FileSystem::set_mount_dir(SharedPtr parent) { return m_root_inode->replace_entry(parent, ".."); } Result FileSystem::reset_mount_dir() { return m_root_inode->replace_entry(m_root_inode, ".."); } void FileSystem::set_root(SharedPtr root) { m_root_inode = root; } }