diff options
| author | Felix Morgner <felix.morgner@ost.ch> | 2026-07-29 21:48:02 +0200 |
|---|---|---|
| committer | Felix Morgner <felix.morgner@ost.ch> | 2026-07-29 21:48:02 +0200 |
| commit | 0958e712a762374b4706015fe225215678906dd8 (patch) | |
| tree | 2cfdaccd3f352635d7a6cd8e6cda7b36155b830c /kernel | |
| parent | eff4dc6b0a9075e640bf8abdb38959d8c408986a (diff) | |
| download | kernel-develop.tar.xz kernel-develop.zip | |
Diffstat (limited to 'kernel')
| -rw-r--r-- | kernel/kapi/devices/driver.cpp | 5 | ||||
| -rw-r--r-- | kernel/kernel/filesystem/device_number_registry.cpp | 21 |
2 files changed, 25 insertions, 1 deletions
diff --git a/kernel/kapi/devices/driver.cpp b/kernel/kapi/devices/driver.cpp index ee16b4c2..4f0ce0e4 100644 --- a/kernel/kapi/devices/driver.cpp +++ b/kernel/kapi/devices/driver.cpp @@ -12,6 +12,11 @@ namespace kapi::devices return std::nullopt; } + auto driver::claimed_minor(device &) const -> std::optional<std::uint8_t> + { + return std::nullopt; + } + auto driver::query_facet(kapi::capabilities::facet_id) -> void * { return nullptr; diff --git a/kernel/kernel/filesystem/device_number_registry.cpp b/kernel/kernel/filesystem/device_number_registry.cpp index cced66e0..42663dba 100644 --- a/kernel/kernel/filesystem/device_number_registry.cpp +++ b/kernel/kernel/filesystem/device_number_registry.cpp @@ -9,6 +9,7 @@ #include <kstd/memory.hpp> #include <kstd/mutex.hpp> +#include <kstd/print.hpp> #include <kstd/result.hpp> #include <kstd/vector.hpp> @@ -202,7 +203,25 @@ namespace kernel::filesystem { auto guard = kstd::lock_guard{m_lock}; - auto minor = allocate_minor(binding->posix_type, *driver_major); + auto minor = std::uint8_t{}; + auto driver_minor = driver->claimed_minor(*device); + if (driver_minor) + { + minor = *driver_minor; + auto filtered = std::views::filter( + m_entries, [&](auto e) { return e.type == binding->posix_type && e.number.major == *driver_major; }); + auto found = std::ranges::find_if(filtered, [&](auto e) { return e.minor == minor; }, &entry::number); + if (found != std::ranges::cend(filtered)) + { + kstd::println(kstd::print_sink::stderr, "[OS:DEV] Driver '{}' tried to claim duplicate minor {}", + driver->name(), minor); + return; + } + } + else + { + minor = allocate_minor(binding->posix_type, *driver_major); + } numbered = entry{ .number = {.major = *driver_major, .minor = minor}, |
