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.cpp39
1 files changed, 19 insertions, 20 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index 67d1af2..394e926 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -2,7 +2,6 @@
#include "kapi/system.hpp"
-#include "kernel/devices/storage/management.hpp"
#include "kernel/filesystem/dentry.hpp"
#include "kernel/filesystem/devfs/filesystem.hpp"
#include "kernel/filesystem/filesystem.hpp"
@@ -43,19 +42,17 @@ namespace kernel::filesystem
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));
- auto storage_mgmt = devices::storage::management::get();
- if (auto boot_device = storage_mgmt.determine_boot_device())
+ auto device_fs = kstd::make_shared<devfs::filesystem>();
+ device_fs->mount(nullptr);
+ do_mount_internal("/dev", root_fs_root_dentry, device_fs);
+
+ if (auto boot_device_dentry = resolve_path("/dev/ram0")) // TODO BA-FS26 better boot device detection
{
- auto boot_root_fs = kernel::filesystem::filesystem::probe_and_mount(boot_device);
- if (boot_root_fs)
+ 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);
}
}
-
- auto device_fs = kstd::make_shared<devfs::filesystem>();
- device_fs->mount(nullptr);
- do_mount_internal("/dev", root_fs_root_dentry, device_fs);
}
auto vfs::get() -> vfs &
@@ -78,24 +75,26 @@ namespace kernel::filesystem
return nullptr;
}
- auto vfs::do_mount(std::string_view path, kstd::shared_ptr<filesystem> const & filesystem) -> operation_result
+ auto vfs::do_mount(std::string_view source, std::string_view target) -> operation_result
{
- if (!filesystem)
- {
- return operation_result::filesystem_null;
- }
-
- if (path.empty() || path.front() != '/' || (path.size() > 1 && path.back() == '/'))
+ if (target.empty() || target.front() != '/' || (target.size() > 1 && target.back() == '/'))
{
return operation_result::invalid_path;
}
- if (auto mount_point_dentry = resolve_path(path))
+ if (auto mount_point_dentry = resolve_path(target))
{
- do_mount_internal(path, mount_point_dentry, filesystem);
- return operation_result::success;
+ if (auto source_dentry = resolve_path(source))
+ {
+ if (auto fs = kernel::filesystem::filesystem::probe_and_mount(source_dentry->get_inode()))
+ {
+ do_mount_internal(target, mount_point_dentry, fs);
+ return operation_result::success;
+ }
+ return operation_result::invalid_filesystem;
+ }
+ return operation_result::non_existent_path;
}
-
return operation_result::mount_point_not_found;
}