aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authormarcel.braun <marcel.braun@ost.ch>2026-03-24 17:22:55 +0100
committerLukas Oesch <lukasoesch20@gmail.com>2026-03-26 21:19:02 +0100
commita2ac8770937a28d0d4c674e25c9b3c77802a5c9e (patch)
tree285e5c2bba3af5821e88a24757eaaf8901d456da /kernel
parent70229b88ad195a6e945b4cc75e1248685cda0951 (diff)
downloadteachos-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.hpp3
-rw-r--r--kernel/src/filesystem/vfs.cpp53
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
{