diff options
| author | marcel.braun <marcel.braun@ost.ch> | 2026-03-24 17:22:55 +0100 |
|---|---|---|
| committer | Lukas Oesch <lukasoesch20@gmail.com> | 2026-03-26 21:19:02 +0100 |
| commit | a2ac8770937a28d0d4c674e25c9b3c77802a5c9e (patch) | |
| tree | 285e5c2bba3af5821e88a24757eaaf8901d456da /kernel | |
| parent | 70229b88ad195a6e945b4cc75e1248685cda0951 (diff) | |
| download | teachos-a2ac8770937a28d0d4c674e25c9b3c77802a5c9e.tar.xz teachos-a2ac8770937a28d0d4c674e25c9b3c77802a5c9e.zip | |
Refactor mounting of new filesystems and path resolving in vfs
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/include/kernel/filesystem/vfs.hpp | 3 | ||||
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 53 |
2 files changed, 32 insertions, 24 deletions
diff --git a/kernel/include/kernel/filesystem/vfs.hpp b/kernel/include/kernel/filesystem/vfs.hpp index 317f2d1..55bf6a4 100644 --- a/kernel/include/kernel/filesystem/vfs.hpp +++ b/kernel/include/kernel/filesystem/vfs.hpp @@ -6,6 +6,7 @@ #include "kernel/filesystem/filesystem.hpp" #include "kernel/filesystem/inode.hpp" #include "kernel/filesystem/mount.hpp" +#include "kernel/filesystem/mount_table.hpp" #include "kernel/filesystem/open_file_description.hpp" #include <kstd/memory> @@ -43,7 +44,7 @@ namespace filesystem kstd::shared_ptr<filesystem> m_root_fs; kstd::shared_ptr<dentry> m_root_dentry; - kstd::vector<mount> m_mount_table; + mount_table m_mount_table; }; } // namespace filesystem diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp index 0e8a76d..c77736a 100644 --- a/kernel/src/filesystem/vfs.cpp +++ b/kernel/src/filesystem/vfs.cpp @@ -82,9 +82,9 @@ namespace filesystem return nullptr; } - auto vfs::do_mount(std::string_view path, kstd::shared_ptr<filesystem> const & filesystem) -> int + auto vfs::do_mount(std::string_view path, kstd::shared_ptr<filesystem> const & new_filesystem) -> int { - if (!filesystem) + if (!new_filesystem) { return -1; // TODO BA-FS26 panic or errorcode? } @@ -100,24 +100,21 @@ namespace filesystem return -1; // TODO BA-FS26 panic or errorcode? } - // if (path == "/") - // { - // m_root_fs = filesystem; - // m_root_mount = mount{"/", filesystem}; - // return 0; - // } + auto mount_dentry = resolve_path(path); - auto existing_mount = - std::ranges::find_if(m_mount_table, [&](auto const & existing) { return existing.path() == path; }); - if (existing_mount != m_mount_table.end()) + if (!mount_dentry) { - *existing_mount = mount{path, filesystem}; - } - else - { - m_mount_table.push_back(mount{path, filesystem}); + return -1; // mount point path doesn't exist } + // TODO BA-FS26 check if mount point is already mounted and handle it (unmount old fs, fail, etc.) + + mount_dentry->set_flag(dentry::dentry_flags::dcache_mounted); + m_mount_table.add_mount(kstd::make_shared<mount>(mount_dentry, new_filesystem)); + + new_filesystem->set_root_dentry( + kstd::make_shared<dentry>(mount_dentry->get_parent(), new_filesystem->root_inode())); + return 0; } @@ -157,19 +154,29 @@ namespace filesystem { auto path_parts = std::views::split(path, '/') | std::views::filter([](auto const & part) { return !part.empty(); }); - auto parent = m_root_dentry; + auto current_parent = m_root_dentry; + auto current_fs = m_root_fs; for (auto const & part : path_parts) { - if (auto child = parent->find_child(std::string_view{part})) + if (auto child = current_parent->find_child(std::string_view{part})) { - parent = child; + if (child->has_flag(dentry::dentry_flags::dcache_mounted)) // found dentry is a mounted fs + { + auto found_mount = m_mount_table.find_mount_by_dentry(child); + current_fs = found_mount->get_filesystem(); + current_parent = current_fs->root_dentry(); + } + else + { // found dentry is NOT a mounted fs -> continue path resolution in current fs + current_parent = child; + } } - else if (auto found_inode = m_root_fs->lookup(parent->get_inode(), std::string_view{part})) + else if (auto found_inode = m_root_fs->lookup(current_parent->get_inode(), std::string_view{part})) { - auto next_dentry = kstd::make_shared<dentry>(parent, found_inode, std::string_view{part}); - parent->add_child(next_dentry); - parent = next_dentry; + auto next_dentry = kstd::make_shared<dentry>(current_parent, found_inode, std::string_view{part}); + current_parent->add_child(next_dentry); + current_parent = next_dentry; } else { |
