diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-08-24 10:32:22 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-08-26 11:16:17 +0200 |
| commit | 3bf74c2494148f4de14ad0e59e4b2cd473bb650a (patch) | |
| tree | ef153f825b3c8497c8ecaa9a851227fbd91055a7 | |
| parent | 6ddd19c70a127098766807638dbf3bf63fc91f89 (diff) | |
| download | kernel-3bf74c2494148f4de14ad0e59e4b2cd473bb650a.tar.xz kernel-3bf74c2494148f4de14ad0e59e4b2cd473bb650a.zip | |
kernel/fs: devfs: simplify directory listing
| -rw-r--r-- | kernel/kernel/filesystem/devfs/inode.cpp | 25 |
1 files 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<directory_listing_entry> entries) const -> kstd::result<std::pair<std::size_t, directory_listing_cursor>> { - 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<kapi::filesystem::device_number>(static_cast<std::uint16_t>(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::size_t>(std::ranges::distance(begin, end))); + auto const device_number = kapi::filesystem::device_number{static_cast<std::uint8_t>(position.value >> 8), + static_cast<std::uint8_t>(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::size_t>(std::ranges::distance(begin, end))); if (to_read == 0) { @@ -78,14 +84,15 @@ namespace kernel::filesystem::devfs .inode_number = std::bit_cast<std::uint16_t>(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::uint64_t>(std::bit_cast<std::uint16_t>(last_copied->number))}; + auto const new_device_number = last_copied->number; + auto const new_cursor = directory_listing_cursor{static_cast<std::uint64_t>(new_device_number.minor) | + (static_cast<std::uint64_t>(new_device_number.major) << 8)}; return std::pair{to_read, new_cursor}; } } // namespace kernel::filesystem::devfs
\ No newline at end of file |
