diff options
| author | Lukas Oesch <lukasoesch20@gmail.com> | 2026-05-10 19:08:07 +0200 |
|---|---|---|
| committer | Lukas Oesch <lukasoesch20@gmail.com> | 2026-05-11 22:34:54 +0200 |
| commit | 00aa2c8695b81944798010d81d600038e1f1ef3d (patch) | |
| tree | 94c8fcfa182a18d5ec9b70f0fb4fe507225a1ac6 /kernel | |
| parent | e05b52111d952c626c29d92a862ee0d1dce180f3 (diff) | |
| download | kernel-00aa2c8695b81944798010d81d600038e1f1ef3d.tar.xz kernel-00aa2c8695b81944798010d81d600038e1f1ef3d.zip | |
remove mount_path from mount struct (retrieve path from m_mount_dentry)
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/kernel/filesystem/mount.hpp | 8 | ||||
| -rw-r--r-- | kernel/src/filesystem/mount.cpp | 14 | ||||
| -rw-r--r-- | kernel/src/filesystem/mount.tests.cpp | 4 | ||||
| -rw-r--r-- | kernel/src/filesystem/mount_table.cpp | 7 | ||||
| -rw-r--r-- | kernel/src/filesystem/mount_table.tests.cpp | 60 | ||||
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 7 |
6 files changed, 59 insertions, 41 deletions
diff --git a/kernel/include/kernel/filesystem/mount.hpp b/kernel/include/kernel/filesystem/mount.hpp index 72855a0..102f660 100644 --- a/kernel/include/kernel/filesystem/mount.hpp +++ b/kernel/include/kernel/filesystem/mount.hpp @@ -7,8 +7,6 @@ #include <kstd/memory> #include <kstd/string> -#include <string_view> - namespace kernel::filesystem { /** @@ -27,8 +25,7 @@ namespace kernel::filesystem @param parent_mount The parent mount that this mount is attached beneath. */ mount(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<dentry> const & root_dentry, - kstd::shared_ptr<filesystem> const & fs, std::string_view mount_path, - kstd::shared_ptr<mount> const & parent_mount); + kstd::shared_ptr<filesystem> const & fs, kstd::shared_ptr<mount> const & parent_mount); /** @brief Get the dentry where the filesystem is mounted. @@ -48,7 +45,7 @@ namespace kernel::filesystem /** @brief Get the path at which the filesystem is mounted. */ - [[nodiscard]] auto get_mount_path() const -> std::string_view; + [[nodiscard]] auto get_mount_path() const -> kstd::string; /** @brief Get the parent mount that this mount was attached beneath. @@ -56,7 +53,6 @@ namespace kernel::filesystem [[nodiscard]] auto get_parent_mount() const -> kstd::shared_ptr<mount> const &; private: - kstd::string m_mount_path; kstd::shared_ptr<dentry> m_mount_dentry; kstd::shared_ptr<dentry> m_root_dentry; kstd::shared_ptr<filesystem> m_filesystem{}; diff --git a/kernel/src/filesystem/mount.cpp b/kernel/src/filesystem/mount.cpp index 67450b7..c474c8e 100644 --- a/kernel/src/filesystem/mount.cpp +++ b/kernel/src/filesystem/mount.cpp @@ -13,10 +13,8 @@ namespace kernel::filesystem { mount::mount(kstd::shared_ptr<dentry> const & mount_dentry, kstd::shared_ptr<dentry> const & root_dentry, - kstd::shared_ptr<filesystem> const & fs, std::string_view mount_path, - kstd::shared_ptr<mount> const & parent_mount) - : m_mount_path(mount_path) - , m_mount_dentry(mount_dentry) + kstd::shared_ptr<filesystem> const & fs, kstd::shared_ptr<mount> const & parent_mount) + : m_mount_dentry(mount_dentry) , m_root_dentry(root_dentry) , m_filesystem(fs) , m_parent_mount(parent_mount) @@ -42,9 +40,13 @@ namespace kernel::filesystem return m_root_dentry; } - auto mount::get_mount_path() const -> std::string_view + auto mount::get_mount_path() const -> kstd::string { - return m_mount_path.view(); + if (m_mount_dentry) + { + return m_mount_dentry->get_full_path(); + } + return "/"; } auto mount::get_parent_mount() const -> kstd::shared_ptr<mount> const & diff --git a/kernel/src/filesystem/mount.tests.cpp b/kernel/src/filesystem/mount.tests.cpp index d630464..4b44983 100644 --- a/kernel/src/filesystem/mount.tests.cpp +++ b/kernel/src/filesystem/mount.tests.cpp @@ -21,7 +21,7 @@ SCENARIO("Mount construction", "[filesystem][mount]") WHEN("constructing a mount with the filesystem and root dentry") { - auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, "/", nullptr}; + auto mount = kernel::filesystem::mount{root_dentry, root_dentry, fs, nullptr}; THEN("the mount has the correct filesystem, root dentry, mount dentry, and mount path") { @@ -41,7 +41,7 @@ SCENARIO("Mount construction", "[filesystem][mount]") { THEN("the constructor panics") { - REQUIRE_THROWS_AS((kernel::filesystem::mount{root_dentry, root_dentry, nullptr, "/", nullptr}), + REQUIRE_THROWS_AS((kernel::filesystem::mount{root_dentry, root_dentry, nullptr, nullptr}), kernel::tests::cpu::halt); } } diff --git a/kernel/src/filesystem/mount_table.cpp b/kernel/src/filesystem/mount_table.cpp index 965e83b..b67e05c 100644 --- a/kernel/src/filesystem/mount_table.cpp +++ b/kernel/src/filesystem/mount_table.cpp @@ -37,7 +37,9 @@ namespace kernel::filesystem kstd::vector<kstd::shared_ptr<mount>> const & mounts) -> bool { return std::ranges::none_of(mounts, [&](auto const & other) { - return other != candidate && is_strict_prefix(other->get_mount_path(), candidate->get_mount_path()) && + // TODO BA-FS26 really correct? + return other != candidate && + is_strict_prefix(other->get_mount_path().view(), candidate->get_mount_path().view()) && !is_descendant_of(candidate, other); }); } @@ -80,6 +82,7 @@ namespace kernel::filesystem return operation_result::removed; } + // TODO BA-FS26 remove? auto mount_table::find_longest_prefix_mount(std::string_view path) const -> kstd::shared_ptr<mount> { kstd::shared_ptr<mount> mount_with_longest_prefix = nullptr; @@ -90,7 +93,7 @@ namespace kernel::filesystem auto mp = mount->get_mount_path(); // /a/b/c should match /a/b but not /a/bb or /a/b/c/d, / should match everything - bool is_prefix = path.starts_with(mp) && (mp == "/" || path.size() == mp.size() || path[mp.size()] == '/'); + bool is_prefix = path.starts_with(mp.view()) && (mp == "/" || path.size() == mp.size() || path[mp.size()] == '/'); bool visible = is_visible_mount(mount, m_mounts); if (is_prefix && visible && mp.size() >= best_len) diff --git a/kernel/src/filesystem/mount_table.tests.cpp b/kernel/src/filesystem/mount_table.tests.cpp index efacdfe..732d32f 100644 --- a/kernel/src/filesystem/mount_table.tests.cpp +++ b/kernel/src/filesystem/mount_table.tests.cpp @@ -40,22 +40,26 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem] kernel::filesystem::mount_table table; auto fs1 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); - auto root_inode1 = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry1 = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode1, "/"); - auto mount1 = kstd::make_shared<kernel::filesystem::mount>(root_dentry1, root_dentry1, fs1, "/", nullptr); + auto root_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount1 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry1, root_dentry1, fs1, nullptr); auto fs2 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); - auto root_inode2 = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode2, "/"); - auto mount2 = kstd::make_shared<kernel::filesystem::mount>(root_dentry1, root_dentry2, fs2, "/mnt", nullptr); + auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/mnt"); + auto mount2 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry2, root_dentry2, fs2, nullptr); table.add_mount(mount1); table.add_mount(mount2); THEN("dentry flags are set correctly for mounted dentries") { - REQUIRE(root_dentry1->has_flag(kernel::filesystem::dentry::dentry_flags::mounted)); - REQUIRE_FALSE(root_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::mounted)); + REQUIRE(mount_dentry1->has_flag(kernel::filesystem::dentry::dentry_flags::mounted)); + REQUIRE(mount_dentry2->has_flag(kernel::filesystem::dentry::dentry_flags::mounted)); } THEN("finding mounts by longest prefix returns the correct mount") @@ -97,14 +101,18 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem] kernel::filesystem::mount_table table; auto fs1 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); - auto root_inode1 = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry1 = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode1, "/"); - auto mount1 = kstd::make_shared<kernel::filesystem::mount>(root_dentry1, root_dentry1, fs1, "/", nullptr); + auto root_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount1 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry1, root_dentry1, fs1, nullptr); auto fs2 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); - auto root_inode2 = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode2, "/"); - auto mount2 = kstd::make_shared<kernel::filesystem::mount>(root_dentry1, root_dentry2, fs2, "/", mount1); + auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount2 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry2, root_dentry2, fs2, nullptr); table.add_mount(mount1); table.add_mount(mount2); @@ -136,19 +144,25 @@ SCENARIO("Adding, finding and removing mounts in the mount table", "[filesystem] kernel::filesystem::mount_table table; auto fs1 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); - auto root_inode1 = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry1 = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode1, "/"); - auto mount1 = kstd::make_shared<kernel::filesystem::mount>(root_dentry1, root_dentry1, fs1, "/", nullptr); + auto root_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount_dentry1 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount1 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry1, root_dentry1, fs1, nullptr); auto fs2 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); - auto root_inode2 = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode2, "/"); - auto mount2 = kstd::make_shared<kernel::filesystem::mount>(root_dentry1, root_dentry2, fs2, "/mnt", mount1); + auto root_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount_dentry2 = kstd::make_shared<kernel::filesystem::dentry>( + mount_dentry1, kstd::make_shared<kernel::tests::filesystem::inode>(), "mnt"); + auto mount2 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry2, root_dentry2, fs2, mount1); auto fs3 = kstd::make_shared<kernel::tests::filesystem::filesystem>(); - auto root_inode3 = kstd::make_shared<kernel::tests::filesystem::inode>(); - auto root_dentry3 = kstd::make_shared<kernel::filesystem::dentry>(nullptr, root_inode3, "/"); - auto mount3 = kstd::make_shared<kernel::filesystem::mount>(root_dentry2, root_dentry3, fs3, "/mnt/submnt", mount2); + auto root_dentry3 = kstd::make_shared<kernel::filesystem::dentry>( + nullptr, kstd::make_shared<kernel::tests::filesystem::inode>(), "/"); + auto mount_dentry3 = kstd::make_shared<kernel::filesystem::dentry>( + mount_dentry2, kstd::make_shared<kernel::tests::filesystem::inode>(), "submnt"); + auto mount3 = kstd::make_shared<kernel::filesystem::mount>(mount_dentry3, root_dentry3, fs3, mount2); table.add_mount(mount1); table.add_mount(mount2); diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index 1410b2a..ea060a9 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -45,7 +45,7 @@ namespace kernel::filesystem root_fs->mount(nullptr); auto root_fs_root_dentry = kstd::make_shared<dentry>(nullptr, root_fs->root_inode(), "/"); - m_mount_table.add_mount(kstd::make_shared<mount>(nullptr, root_fs_root_dentry, root_fs, "/", nullptr)); + m_mount_table.add_mount(kstd::make_shared<mount>(nullptr, root_fs_root_dentry, root_fs, nullptr)); // Mount devfs at /dev in rootfs (temporary, will be shadowed) auto device_fs = kstd::make_shared<devfs::filesystem>(); @@ -142,9 +142,12 @@ namespace kernel::filesystem // TODO BA-FS26 refactoring, implement dentry lookup to get the parent mount... auto parent_mount = m_mount_table.find_longest_prefix_mount(mount_path.view()); + // auto parent_mount_dentry = mount_point_dentry->get_parent_mounted_dentry(); + // auto parent_mount = m_mount_table.find_exact_mount(parent_mount_dentry->get_full_path()); + auto new_fs_root = kstd::make_shared<dentry>(mount_point_dentry->get_parent(), fs->root_inode(), mount_point_dentry->get_name()); - auto new_mount = kstd::make_shared<mount>(mount_point_dentry, new_fs_root, fs, mount_path.view(), parent_mount); + auto new_mount = kstd::make_shared<mount>(mount_point_dentry, new_fs_root, fs, parent_mount); m_mount_table.add_mount(new_mount); } |
