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.cpp53
1 files changed, 30 insertions, 23 deletions
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
{