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.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index 1410b2a..ee7c262 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>();
@@ -138,13 +138,16 @@ namespace kernel::filesystem
auto vfs::do_mount_internal(kstd::shared_ptr<dentry> const & mount_point_dentry,
kstd::shared_ptr<filesystem> const & fs) -> void
{
- auto mount_path = mount_point_dentry->get_absolute_path();
- // 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->find_mount_root_dentry();
+ kstd::shared_ptr<mount> parent_mount = nullptr;
+ if (parent_mount_dentry)
+ {
+ parent_mount = m_mount_table.find_exact_mount(parent_mount_dentry->get_absolute_path().view());
+ }
+
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);
}
@@ -161,7 +164,7 @@ namespace kernel::filesystem
kapi::system::panic("[FILESYSTEM] no root mount found.");
}
- auto current_dentry = current_mount->root_dentry();
+ auto current_dentry = current_mount->get_root_dentry();
auto path_parts = path::split(path);
kstd::vector path_parts_vector(path_parts.begin(), path_parts.end());
@@ -183,7 +186,7 @@ namespace kernel::filesystem
{
auto parent_dentry = current_dentry->get_parent();
- if (current_dentry == current_mount->root_dentry())
+ if (current_dentry == current_mount->get_root_dentry())
{
if (current_mount->get_mount_path() == "/")
{
@@ -214,7 +217,7 @@ namespace kernel::filesystem
next_dentry = kstd::make_shared<dentry>(current_dentry, found_inode, part.view());
current_dentry->add_child(next_dentry);
}
- else if (next_dentry->has_flag(dentry::dentry_flags::mounted))
+ else if (next_dentry->has_flag(dentry::dentry_flags::is_mount_point))
{
current_mount = m_mount_table.find_exact_mount(next_dentry->get_absolute_path().view());
if (!current_mount)
@@ -222,7 +225,7 @@ namespace kernel::filesystem
kapi::system::panic("[FILESYSTEM] mount for dentry with mounted flag not found.");
}
- next_dentry = current_mount->root_dentry();
+ next_dentry = current_mount->get_root_dentry();
}
if (next_dentry->get_inode()->is_symbolic_link())
@@ -245,7 +248,7 @@ namespace kernel::filesystem
if (path::is_valid_absolute_path(symbolic_link_path))
{
current_mount = m_mount_table.find_exact_mount("/");
- current_dentry = current_mount->root_dentry();
+ current_dentry = current_mount->get_root_dentry();
}
continue;
}