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.cpp50
1 files changed, 14 insertions, 36 deletions
diff --git a/kernel/src/filesystem/vfs.cpp b/kernel/src/filesystem/vfs.cpp
index 483bae5..368d994 100644
--- a/kernel/src/filesystem/vfs.cpp
+++ b/kernel/src/filesystem/vfs.cpp
@@ -2,10 +2,9 @@
#include "kapi/system.hpp"
-#include "kernel/devices/device.hpp"
#include "kernel/devices/storage/storage_management.hpp"
#include "kernel/filesystem/dentry.hpp"
-#include "kernel/filesystem/device_inode.hpp"
+#include "kernel/filesystem/devfs/devfs_filesystem.hpp"
#include "kernel/filesystem/ext2/ext2_filesystem.hpp"
#include "kernel/filesystem/filesystem.hpp"
#include "kernel/filesystem/mount.hpp"
@@ -14,7 +13,6 @@
#include <kstd/memory>
-#include <algorithm>
#include <optional>
#include <ranges>
#include <string_view>
@@ -52,12 +50,18 @@ namespace filesystem
auto boot_root_fs = kstd::make_shared<ext2::ext2_filesystem>();
boot_root_fs->mount(boot_device);
- do_mount("/", boot_root_fs);
+ if (do_mount("/", boot_root_fs) != 0)
+ {
+ kapi::system::panic("[FILESYSTEM] failed to mount root filesystem.");
+ }
+
+ auto device_fs = kstd::make_shared<devfs::devfs_filesystem>();
+ device_fs->mount(nullptr);
- // TODO BA-FS26 use do_mount when tempdevfs is implemented -> just call /dev/ with all devices in devtempfs
- std::ranges::for_each(storage_mgmt.all_controllers(), [&](auto controller) {
- std::ranges::for_each(controller->all_devices(), [&](auto device) { make_device_node(device); });
- });
+ if (do_mount("/dev", device_fs) != 0)
+ {
+ kapi::system::panic("[FILESYSTEM] failed to mount devfs at /dev.");
+ }
}
else
{
@@ -118,39 +122,13 @@ namespace filesystem
return -1;
}
- auto vfs::make_device_node(kstd::shared_ptr<devices::device> const & device) -> void
- {
- if (!device)
- {
- kapi::system::panic("[FILESYSTEM] make_device_node called with null device.");
- }
-
- m_device_nodes.push_back(device_node_entry{device->name().view(), kstd::make_shared<device_inode>(device)});
- }
-
auto vfs::resolve_path(std::string_view path) -> kstd::shared_ptr<dentry>
{
- // TODO BA-FS26 implement real path resolution with mounts and directories etc.
- // For now, just support device nodes at /dev/<device_name>.
+ // TODO BA-FS26 implement full path resolution semantics.
// TODO BA-FS26 better path validation
// TODO BA-FS26 implement a path parser (maybe in libs?) and use it here and in do_mount
- constexpr auto device_prefix = std::string_view{"/dev/"};
- if (path.starts_with(device_prefix))
- {
- auto const device_name = path.substr(device_prefix.size());
- auto entry = std::ranges::find_if(m_device_nodes, [&](auto const & device_entry) {
- return device_entry.has_value() && device_entry->name == device_name;
- });
-
- if (entry != m_device_nodes.end())
- {
- return kstd::make_shared<dentry>(nullptr, entry->value().node);
- }
-
- return nullptr;
- }
- else if (!path.empty() && path.front() == '/')
+ if (!path.empty() && path.front() == '/')
{
auto root_mount = m_mount_table.get_root_mount();
if (!root_mount)