aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/vfs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/filesystem/vfs.cpp')
-rw-r--r--kernel/src/filesystem/vfs.cpp299
1 files changed, 0 insertions, 299 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
deleted file mode 100644
index e5dff8c4..00000000
--- a/kernel/src/filesystem/vfs.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-#include <kernel/filesystem/vfs.hpp>
-
-#include <kernel/filesystem/constants.hpp>
-#include <kernel/filesystem/dentry.hpp>
-#include <kernel/filesystem/devfs/filesystem.hpp>
-#include <kernel/filesystem/filesystem.hpp>
-#include <kernel/filesystem/mount.hpp>
-#include <kernel/filesystem/mount_table.hpp>
-#include <kernel/filesystem/path.hpp>
-#include <kernel/filesystem/rootfs/filesystem.hpp>
-
-#include <kapi/system.hpp>
-
-#include <kstd/memory>
-#include <kstd/vector>
-
-#include <algorithm>
-#include <cstdint>
-#include <optional>
-#include <ranges>
-#include <string_view>
-#include <utility>
-
-namespace
-{
- constinit auto static active_vfs = std::optional<kernel::filesystem::vfs>{};
-} // namespace
-
-namespace kernel::filesystem
-{
- auto vfs::init() -> void
- {
- if (active_vfs)
- {
- kapi::system::panic("[FILESYSTEM] vfs has already been initialized.");
- }
-
- active_vfs.emplace();
- }
-
- vfs::vfs()
- {
- // mount rootfs at /
- auto root_fs = kstd::make_shared<rootfs::filesystem>();
- root_fs->mount(nullptr);
-
- auto root_fs_root_dentry = kstd::make_shared<dentry>(nullptr, root_fs->root_inode(), "/");
- auto root_mount = kstd::make_shared<mount>(nullptr, root_fs_root_dentry, root_fs, nullptr, nullptr);
- m_mount_table.add_mount(root_mount);
-
- // mount devfs at /dev (inside rootfs, temporary, will be shadowed)
- auto device_fs = kstd::make_shared<devfs::filesystem>();
- device_fs->mount(nullptr);
- graft_persistent_device_fs(device_fs);
-
- // mount boot fs at / (shadows rootfs), re-graft devfs
- auto [boot_device_dentry, boot_device_mount_context] = resolve_path_internal("/dev/ram0");
- if (boot_device_dentry && boot_device_mount_context)
- {
- if (auto boot_root_fs = kernel::filesystem::filesystem::probe_and_mount(boot_device_dentry->get_inode()))
- {
- if (auto root_dentry = resolve_path("/"))
- {
- do_mount_internal(root_dentry, root_mount, boot_root_fs, boot_device_mount_context);
- graft_persistent_device_fs(device_fs);
- }
- }
- }
- }
-
- auto vfs::get() -> vfs &
- {
- if (!active_vfs)
- {
- kapi::system::panic("[FILESYSTEM] vfs has not been initialized.");
- }
-
- return *active_vfs;
- }
-
- auto vfs::open(std::string_view path) -> kstd::shared_ptr<dentry>
- {
- auto [dentry, mount] = resolve_path_internal(path);
- if (!dentry || !mount)
- {
- return nullptr;
- }
- mount->increment_ref_count();
- return dentry;
- }
-
- auto vfs::close(std::string_view path) -> operation_result
- {
- if (auto mount = find_mount(path))
- {
- mount->decrement_ref_count();
- return operation_result::success;
- }
- return operation_result::invalid_path;
- }
-
- auto vfs::do_mount(std::string_view source, std::string_view target) -> operation_result
- {
- if (!path::is_valid_path(source) || !path::is_valid_path(target))
- {
- return operation_result::invalid_path;
- }
-
- auto [mount_point_dentry, mount_context] = resolve_path_internal(target);
- if (mount_point_dentry && mount_context)
- {
- auto [source_dentry, source_mount_context] = resolve_path_internal(source);
- if (source_dentry && source_mount_context)
- {
- if (auto fs = kernel::filesystem::filesystem::probe_and_mount(source_dentry->get_inode()))
- {
- do_mount_internal(mount_point_dentry, mount_context, fs, source_mount_context);
- return operation_result::success;
- }
- return operation_result::invalid_filesystem;
- }
- return operation_result::non_existent_path;
- }
- return operation_result::mount_point_not_found;
- }
-
- auto vfs::unmount(std::string_view path) -> operation_result
- {
- if (!path::is_valid_path(path))
- {
- return operation_result::invalid_path;
- }
-
- auto remove_result = m_mount_table.remove_mount(path);
- if (remove_result == mount_table::operation_result::removed)
- {
- return operation_result::success;
- }
- else if (remove_result == mount_table::operation_result::mount_not_found)
- {
- return operation_result::mount_point_not_found;
- }
-
- return operation_result::unmount_failed;
- }
-
- auto vfs::do_mount_internal(kstd::shared_ptr<dentry> const & mount_point_dentry,
- kstd::shared_ptr<mount> const & parent_mount, kstd::shared_ptr<filesystem> const & fs,
- kstd::shared_ptr<mount> const & source_mount) -> void
- {
- auto new_fs_root =
- kstd::make_shared<dentry>(mount_point_dentry->parent(), fs->root_inode(), mount_point_dentry->name());
- auto new_mount = kstd::make_shared<mount>(mount_point_dentry, new_fs_root, fs, parent_mount, source_mount);
- m_mount_table.add_mount(new_mount);
- }
-
- auto vfs::graft_persistent_device_fs(kstd::shared_ptr<devfs::filesystem> const & device_fs) -> void
- {
- auto [root_mount_point_dentry, root_mount] = resolve_path_internal("/");
- if (root_mount_point_dentry && root_mount)
- {
- auto dev_dentry = root_mount_point_dentry->find_child("dev");
- if (!dev_dentry)
- {
- dev_dentry = kstd::make_shared<dentry>(root_mount_point_dentry, device_fs->root_inode(), "dev");
- root_mount_point_dentry->add_child(dev_dentry);
- }
-
- do_mount_internal(dev_dentry, root_mount, device_fs);
- }
- }
-
- auto vfs::resolve_path_internal(std::string_view path) const
- -> std::pair<kstd::shared_ptr<dentry>, kstd::shared_ptr<mount>>
- {
- if (!path::is_valid_absolute_path(path))
- {
- return {nullptr, nullptr};
- }
-
- auto current_mount = m_mount_table.find_mount("/");
- if (!current_mount)
- {
- kapi::system::panic("[FILESYSTEM] no root mount found.");
- }
-
- auto current_dentry = current_mount->root_dentry();
-
- auto path_parts = path::split(path);
- kstd::vector path_parts_vector(path_parts.begin(), path_parts.end());
- std::ranges::reverse(path_parts_vector);
-
- auto symlink_counter = 0uz;
-
- while (!path_parts_vector.empty())
- {
- auto part = path_parts_vector.back();
- path_parts_vector.pop_back();
-
- if (part == ".")
- {
- continue;
- }
-
- if (part == "..")
- {
- auto parent_dentry = current_dentry->parent();
-
- if (current_dentry == current_mount->root_dentry())
- {
- if (current_mount->mount_path() == "/")
- {
- continue;
- }
-
- if (auto parent_mount = current_mount->parent_mount())
- {
- current_mount = parent_mount;
- current_dentry = parent_dentry;
- }
- }
-
- current_dentry = parent_dentry;
- continue;
- }
-
- auto next_dentry = current_dentry->find_child(part);
- if (!next_dentry)
- {
- auto current_fs = current_mount->get_filesystem();
- auto found_inode = current_fs->lookup(current_dentry->get_inode(), part);
- if (!found_inode)
- {
- return {nullptr, nullptr};
- }
-
- next_dentry = kstd::make_shared<dentry>(current_dentry, found_inode, part);
- current_dentry->add_child(next_dentry);
- }
- else if (next_dentry->has_flag(dentry::dentry_flags::is_mount_point))
- {
- current_mount = m_mount_table.find_mount(next_dentry->absolute_path());
- if (!current_mount)
- {
- kapi::system::panic("[FILESYSTEM] mount for dentry with mounted flag not found.");
- }
-
- next_dentry = current_mount->root_dentry();
- }
-
- if (next_dentry->get_inode()->is_symbolic_link())
- {
- if (symlink_counter++ > constants::symloop_max)
- {
- return {nullptr, nullptr};
- }
-
- kstd::vector<uint8_t> buffer(constants::symlink_max_path_length);
- auto const bytes_read = next_dentry->get_inode()->read(buffer.data(), 0, buffer.size());
- auto const symbolic_link_path = std::string_view{reinterpret_cast<char const *>(buffer.data()), bytes_read};
-
- auto symbolic_link_parts = path::split(symbolic_link_path);
- kstd::vector symbolic_link_parts_vector(symbolic_link_parts.begin(), symbolic_link_parts.end());
- std::ranges::reverse(symbolic_link_parts_vector);
-
- path_parts_vector.insert_range(path_parts_vector.end(), symbolic_link_parts_vector);
-
- if (path::is_valid_absolute_path(symbolic_link_path))
- {
- current_mount = m_mount_table.find_mount("/");
- current_dentry = current_mount->root_dentry();
- }
- continue;
- }
-
- current_dentry = next_dentry;
- }
- return {current_dentry, current_mount};
- }
-
- auto vfs::resolve_path(std::string_view path) const -> kstd::shared_ptr<dentry>
- {
- return resolve_path_internal(path).first;
- }
-
- auto vfs::find_mount(std::string_view path) const -> kstd::shared_ptr<mount>
- {
- return resolve_path_internal(path).second;
- }
-
-} // namespace kernel::filesystem
-
-namespace kernel::tests::filesystem::vfs
-{
- auto deinit() -> void
- {
- active_vfs.reset();
- }
-} // namespace kernel::tests::filesystem::vfs