From 0de79775bfcc8ed32726072352d4c0f95ea6b539 Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Wed, 22 Jul 2026 23:04:23 +0200 Subject: kernel/vfs: fix device node resolution --- kernel/kernel/filesystem/vfs.cpp | 46 ++++++++++++++++++++++------------------ kernel/kernel/filesystem/vfs.hpp | 1 + 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/kernel/kernel/filesystem/vfs.cpp b/kernel/kernel/filesystem/vfs.cpp index f4457dda..e1d539d8 100644 --- a/kernel/kernel/filesystem/vfs.cpp +++ b/kernel/kernel/filesystem/vfs.cpp @@ -107,6 +107,30 @@ namespace kernel::filesystem } auto [dentry, mount] = resolved_path.value(); + auto inode = dentry->get_inode(); + + if (inode->is_device()) + { + auto number = inode->raw_device(); + if (!number) + { + return kstd::failure(vfs_errc::no_such_device); + } + + auto type = inode->is_block_device() ? file_type::block : file_type::character; + auto resolved_device = device_number_registry::get().resolve(*number, type); + if (!resolved_device) + { + return kstd::failure(resolved_device.error()); + } + + auto device_dentry = kstd::make_shared( + dentry->parent(), kstd::make_shared(*resolved_device, inode), dentry->name()); + + mount->increment_ref_count(); + return device_dentry; + } + mount->increment_ref_count(); return dentry; } @@ -351,6 +375,7 @@ namespace kernel::filesystem } next_dentry = kstd::make_shared(current_dentry, *found_inode, part); + current_dentry->add_child(next_dentry); } else if (next_dentry->has_flag(dentry::dentry_flags::is_mount_point)) { @@ -393,28 +418,7 @@ namespace kernel::filesystem } continue; } - else if (next_dentry->get_inode()->is_device()) - { - auto number = (next_dentry->get_inode())->raw_device(); - if (!number) - { - return kstd::failure(vfs_errc::no_such_device); - } - - // TODO: in the future we may need to support fifos, UNIX domain socket, etc. here - auto type = next_dentry->get_inode()->is_block_device() ? file_type::block : file_type::character; - auto resolved = device_number_registry::get().resolve(*number, type); - if (!resolved) - { - return kstd::failure(resolved.error()); - } - - next_dentry = kstd::make_shared( - current_dentry, - kstd::shared_ptr(kstd::make_shared(*resolved, next_dentry->get_inode())), part); - } - current_dentry->add_child(next_dentry); current_dentry = next_dentry; } return std::pair{current_dentry, current_mount}; diff --git a/kernel/kernel/filesystem/vfs.hpp b/kernel/kernel/filesystem/vfs.hpp index 445952a0..1b8cf89a 100644 --- a/kernel/kernel/filesystem/vfs.hpp +++ b/kernel/kernel/filesystem/vfs.hpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include -- cgit v1.2.3