aboutsummaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
authorFelix Morgner <felix.morgner@ost.ch>2026-08-24 10:32:22 +0200
committerFelix Morgner <felix.morgner@ost.ch>2026-08-26 11:16:17 +0200
commit3bf74c2494148f4de14ad0e59e4b2cd473bb650a (patch)
treeef153f825b3c8497c8ecaa9a851227fbd91055a7 /kernel
parent6ddd19c70a127098766807638dbf3bf63fc91f89 (diff)
downloadkernel-3bf74c2494148f4de14ad0e59e4b2cd473bb650a.tar.xz
kernel-3bf74c2494148f4de14ad0e59e4b2cd473bb650a.zip
kernel/fs: devfs: simplify directory listing
Diffstat (limited to 'kernel')
-rw-r--r--kernel/kernel/filesystem/devfs/inode.cpp25
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