diff options
Diffstat (limited to 'kernel/src/filesystem/vfs.cpp')
| -rw-r--r-- | kernel/src/filesystem/vfs.cpp | 25 |
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; } |
