aboutsummaryrefslogtreecommitdiff
path: root/kernel/src/filesystem/vfs.cpp
diff options
context:
space:
mode:
authorLukas Oesch <lukasoesch20@gmail.com>2026-03-24 23:54:28 +0100
committerLukas Oesch <lukasoesch20@gmail.com>2026-03-26 21:19:30 +0100
commit84d4476650b31dbfc52becf2ff65ddce9d31c9ec (patch)
treeeb4e69e2148690d654303dc145c3f71d94ea9bd9 /kernel/src/filesystem/vfs.cpp
parent76de81de1e12694bf6bec1edd3e3409092a92d09 (diff)
downloadteachos-84d4476650b31dbfc52becf2ff65ddce9d31c9ec.tar.xz
teachos-84d4476650b31dbfc52becf2ff65ddce9d31c9ec.zip
implement a rootfs to handle / mounts correctly
Diffstat (limited to 'kernel/src/filesystem/vfs.cpp')
-rw-r--r--kernel/src/filesystem/vfs.cpp43
1 files changed, 29 insertions, 14 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index c8e5bc5..1c4dd8b 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -10,6 +10,7 @@
#include "kernel/filesystem/filesystem.hpp"
#include "kernel/filesystem/mount.hpp"
#include "kernel/filesystem/open_file_description.hpp"
+#include "kernel/filesystem/rootfs/rootfs_filesystem.hpp"
#include <kstd/memory>
@@ -38,16 +39,20 @@ namespace filesystem
auto vfs::init_internal() -> void
{
+ auto virtual_fs = kstd::make_shared<rootfs::rootfs_filesystem>();
+ virtual_fs->mount(nullptr);
+
+ auto virtual_root_dentry = kstd::make_shared<dentry>(nullptr, virtual_fs->root_inode(), "/");
+ m_mount_table.add_mount(kstd::make_shared<mount>(nullptr, virtual_root_dentry, virtual_fs));
+
auto storage_mgmt = devices::storage::storage_management::get();
if (auto boot_device = storage_mgmt.determine_boot_device())
{
- auto root_fs = kstd::make_shared<ext2::ext2_filesystem>();
- root_fs->mount(boot_device);
+ // TODO BA-FS26 detect fs type from boot device and load corresponding fs, for now just assume ext2
+ auto boot_root_fs = kstd::make_shared<ext2::ext2_filesystem>();
+ boot_root_fs->mount(boot_device);
- auto root_dentry = kstd::make_shared<dentry>(nullptr, root_fs->root_inode(), "/");
- root_fs->set_root_dentry(root_dentry);
-
- m_mount_table.add_mount(kstd::make_shared<mount>(nullptr, root_fs));
+ do_mount("/", boot_root_fs);
// TODO BA-FS26 use do_mount when tempdevfs is implemented -> just call /dev/ with all devices in devtempfs
std::ranges::for_each(storage_mgmt.all_controllers(), [&](auto controller) {
@@ -102,10 +107,10 @@ namespace filesystem
{
// TODO BA-FS26 check if mount point is already mounted and handle it (unmount old fs, fail, etc.)
+ auto new_fs_root = kstd::make_shared<dentry>(mount_dentry, filesystem->root_inode());
+ auto new_mount = kstd::make_shared<mount>(mount_dentry, new_fs_root, filesystem);
+ m_mount_table.add_mount(new_mount);
mount_dentry->set_flag(dentry::dentry_flags::dcache_mounted);
- m_mount_table.add_mount(kstd::make_shared<mount>(mount_dentry, filesystem));
-
- filesystem->set_root_dentry(kstd::make_shared<dentry>(mount_dentry->get_parent(), filesystem->root_inode()));
return 0;
}
@@ -153,20 +158,30 @@ namespace filesystem
kapi::system::panic("[FILESYSTEM] no root mount found.");
}
- auto current_dentry = root_mount->get_dentry();
+ auto current_dentry = root_mount->root_dentry();
auto current_fs = root_mount->get_filesystem();
+ while (current_dentry->has_flag(dentry::dentry_flags::dcache_mounted))
+ {
+ auto mnt = m_mount_table.find_mount_by_dentry(current_dentry);
+ if (!mnt)
+ kapi::system::panic("[FILESYSTEM] dcache_mounted set but no covering mount found.");
+ current_dentry = mnt->root_dentry();
+ current_fs = mnt->get_filesystem();
+ }
+
auto path_parts =
std::views::split(path, '/') | std::views::filter([](auto const & part) { return !part.empty(); });
for (auto const & part : path_parts)
{
- auto next_dentry = current_dentry->find_child(std::string_view{part});
+ std::string_view part_view{part};
+ auto next_dentry = current_dentry->find_child(part_view);
if (!next_dentry)
{
- if (auto found_inode = current_fs->lookup(current_dentry->get_inode(), std::string_view{part}))
+ if (auto found_inode = current_fs->lookup(current_dentry->get_inode(), part_view))
{
- next_dentry = kstd::make_shared<dentry>(current_dentry, found_inode, std::string_view{part});
+ next_dentry = kstd::make_shared<dentry>(current_dentry, found_inode, part_view);
current_dentry->add_child(next_dentry);
}
else
@@ -179,7 +194,7 @@ namespace filesystem
{
auto found_mount = m_mount_table.find_mount_by_dentry(next_dentry);
current_fs = found_mount->get_filesystem();
- current_dentry = current_fs->root_dentry();
+ current_dentry = found_mount->root_dentry();
}
else
{