aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/include/kernel/filesystem/vfs.hpp4
-rw-r--r--kernel/src/filesystem/vfs.cpp29
2 files changed, 17 insertions, 16 deletions
diff --git a/kernel/include/kernel/filesystem/vfs.hpp b/kernel/include/kernel/filesystem/vfs.hpp
index 881f458..7e66fb7 100644
--- a/kernel/include/kernel/filesystem/vfs.hpp
+++ b/kernel/include/kernel/filesystem/vfs.hpp
@@ -77,8 +77,8 @@ namespace kernel::filesystem
auto init_internal() -> void;
[[nodiscard]] auto resolve_path(std::string_view path) -> kstd::shared_ptr<dentry>;
- auto do_mount_internal(std::string_view path, kstd::shared_ptr<dentry> const & mount_point_dentry,
- kstd::shared_ptr<filesystem> const & fs) -> void;
+ auto do_mount_internal(kstd::shared_ptr<dentry> const & mount_point_dentry, kstd::shared_ptr<filesystem> const & fs)
+ -> void;
mount_table m_mount_table;
};
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index e6d9241..4defc81 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -56,14 +56,14 @@ namespace kernel::filesystem
{
kapi::system::panic("[FILESYSTEM] failed to resolve /dev for initial devfs mount.");
}
- do_mount_internal("/dev", dev_mount_point_dentry, device_fs);
+ do_mount_internal(dev_mount_point_dentry, device_fs);
// Mount boot filesystem at / (will shadow rootfs)
if (auto boot_device_dentry = resolve_path("/dev/ram0"))
{
if (auto boot_root_fs = kernel::filesystem::filesystem::probe_and_mount(boot_device_dentry->get_inode()))
{
- do_mount_internal("/", root_fs_root_dentry, boot_root_fs);
+ do_mount_internal(root_fs_root_dentry, boot_root_fs);
// Resolve / to get the boot root dentry
if (auto boot_root_dentry = resolve_path("/"))
@@ -71,7 +71,7 @@ namespace kernel::filesystem
auto dev_dentry = kstd::make_shared<dentry>(boot_root_dentry, device_fs->root_inode(), "dev");
boot_root_dentry->add_child(dev_dentry);
- do_mount_internal("/dev", dev_dentry, device_fs);
+ do_mount_internal(dev_dentry, device_fs);
}
}
}
@@ -105,7 +105,7 @@ namespace kernel::filesystem
{
if (auto fs = kernel::filesystem::filesystem::probe_and_mount(source_dentry->get_inode()))
{
- do_mount_internal(target, mount_point_dentry, fs);
+ do_mount_internal(mount_point_dentry, fs);
return operation_result::success;
}
return operation_result::invalid_filesystem;
@@ -136,13 +136,15 @@ namespace kernel::filesystem
return operation_result::mount_point_not_found;
}
- auto vfs::do_mount_internal(std::string_view path, kstd::shared_ptr<dentry> const & mount_point_dentry,
+ auto vfs::do_mount_internal(kstd::shared_ptr<dentry> const & mount_point_dentry,
kstd::shared_ptr<filesystem> const & fs) -> void
{
- auto parent_mount = m_mount_table.find_longest_prefix_mount(path);
+ auto mount_path = mount_point_dentry->get_full_path();
+
+ auto parent_mount = m_mount_table.find_longest_prefix_mount(mount_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, path, parent_mount);
+ auto new_mount = kstd::make_shared<mount>(mount_point_dentry, new_fs_root, fs, mount_path.view(), parent_mount);
m_mount_table.add_mount(new_mount);
}
@@ -188,16 +190,15 @@ namespace kernel::filesystem
if (auto parent_mount = current_mount->get_parent_mount())
{
current_mount = parent_mount;
- current_dentry = current_dentry->get_parent();
+ current_dentry = parent_dentry;
+ }
- if (!parent_dentry)
- {
- parent_dentry = current_mount->root_dentry();
- }
+ if (!parent_dentry)
+ {
+ parent_dentry = current_mount->root_dentry();
}
}
-
- if (!parent_dentry)
+ else if (!parent_dentry)
{
return nullptr;
}