From 3bf74c2494148f4de14ad0e59e4b2cd473bb650a Mon Sep 17 00:00:00 2001 From: Felix Morgner Date: Mon, 24 Aug 2026 10:32:22 +0200 Subject: kernel/fs: devfs: simplify directory listing --- kernel/kernel/filesystem/devfs/inode.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/kernel/kernel/filesystem/devfs/inode.cpp b/kernel/kernel/filesystem/devfs/inode.cpp index b1ac17c2..67f03768 100644 --- a/kernel/kernel/filesystem/devfs/inode.cpp +++ b/kernel/kernel/filesystem/devfs/inode.cpp @@ -47,12 +47,17 @@ namespace kernel::filesystem::devfs auto inode::read_directory(directory_listing_cursor position, std::span entries) const -> kstd::result> { - auto requested = entries.size(); + auto const requested = entries.size(); if (requested == 0) { return kstd::failure(vfs_errc::invalid_argument); } + if (position == sentinel) + { + return std::pair{0, sentinel}; + } + auto devices = kernel::filesystem::device_number_registry::get().all(); if (devices.empty()) { @@ -61,11 +66,12 @@ namespace kernel::filesystem::devfs std::ranges::stable_sort(devices, std::ranges::less{}, &kernel::filesystem::device_number_registry::entry::number); - auto device_number = std::bit_cast(static_cast(position.value)); - auto begin = std::ranges::lower_bound(devices, device_number, std::ranges::less{}, - &kernel::filesystem::device_number_registry::entry::number); - auto end = std::ranges::end(devices); - auto to_read = std::min(requested, static_cast(std::ranges::distance(begin, end))); + auto const device_number = kapi::filesystem::device_number{static_cast(position.value >> 8), + static_cast(position.value & 0xff)}; + auto const begin = std::ranges::lower_bound(devices, device_number, std::ranges::less{}, + &kernel::filesystem::device_number_registry::entry::number); + auto const end = std::ranges::end(devices); + auto const to_read = std::min(requested, static_cast(std::ranges::distance(begin, end))); if (to_read == 0) { @@ -78,14 +84,15 @@ namespace kernel::filesystem::devfs .inode_number = std::bit_cast(entry.number)}; }); - auto last_copied = begin + to_read; + auto const last_copied = begin + to_read; if (last_copied == end) { return std::pair{to_read, sentinel}; } - auto new_cursor = - directory_listing_cursor{static_cast(std::bit_cast(last_copied->number))}; + auto const new_device_number = last_copied->number; + auto const new_cursor = directory_listing_cursor{static_cast(new_device_number.minor) | + (static_cast(new_device_number.major) << 8)}; return std::pair{to_read, new_cursor}; } } // namespace kernel::filesystem::devfs \ No newline at end of file -- cgit v1.2.3