#pragma once #include #include #include #include namespace Kernel { class VirtualFileSystem : public FileSystem { public: static BAN::ErrorOr initialize(BAN::StringView); static VirtualFileSystem& get(); virtual ~VirtualFileSystem() {}; virtual BAN::RefPtr root_inode() override { return m_root_fs->root_inode(); } BAN::ErrorOr mount(BAN::StringView, BAN::StringView); BAN::ErrorOr mount(FileSystem*, BAN::StringView); struct File { BAN::RefPtr inode; BAN::String canonical_path; }; BAN::ErrorOr file_from_absolute_path(BAN::StringView); private: VirtualFileSystem() = default; struct MountPoint { File host; FileSystem* target; }; MountPoint* mount_from_host_inode(BAN::RefPtr); MountPoint* mount_from_root_inode(BAN::RefPtr); private: SpinLock m_lock; FileSystem* m_root_fs = nullptr; BAN::Vector m_mount_points; }; }