From 081065f27ffcbe12cf18f658edd53a0487b0d142 Mon Sep 17 00:00:00 2001 From: "Liav A." Date: Sat, 13 Jul 2024 00:38:47 +0300 Subject: [PATCH] Kernel/Devices: Improve construction paths semantically Do this by: - Removing more instances of `LockRefPtr` and `NonnullLockRefPtr`. - Using better names of construction methods (i.e. `create` instead of `try_create`). - Only returning `NonnullRefPtr` on the `Device::try_create_device` method. - Removing a version of the `Device::try_create_device` method that called `DeviceType::try_create(forward(args)...)`, which was only used in a construction point in a VirtIO driver which now doesn't need this anymore. --- Kernel/Arch/aarch64/RPi/MiniUART.cpp | 2 +- Kernel/Arch/aarch64/RPi/MiniUART.h | 2 +- .../Hypervisor/BochsDisplayConnector.cpp | 24 ++++++++----------- .../x86_64/Hypervisor/BochsDisplayConnector.h | 4 ++-- Kernel/Arch/x86_64/ISABus/SerialDevice.cpp | 4 ++-- Kernel/Devices/Device.h | 13 ++-------- Kernel/Devices/FUSEDevice.cpp | 2 +- Kernel/Devices/FUSEDevice.h | 2 +- Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp | 2 +- Kernel/Devices/GPU/3dfx/GraphicsAdapter.h | 2 +- .../GPU/3dfx/VoodooDisplayConnector.cpp | 10 ++++---- .../Devices/GPU/3dfx/VoodooDisplayConnector.h | 2 +- Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp | 6 ++--- Kernel/Devices/GPU/Bochs/GraphicsAdapter.h | 2 +- .../GPU/Bochs/QEMUDisplayConnector.cpp | 10 ++++---- .../Devices/GPU/Bochs/QEMUDisplayConnector.h | 2 +- .../Devices/GPU/Generic/DisplayConnector.cpp | 10 ++++---- Kernel/Devices/GPU/Generic/DisplayConnector.h | 2 +- .../Devices/GPU/Intel/DisplayConnectorGroup.h | 2 +- .../GPU/Intel/NativeDisplayConnector.cpp | 2 +- .../GPU/Intel/NativeDisplayConnector.h | 2 +- Kernel/Devices/GPU/Management.cpp | 12 +++++----- Kernel/Devices/GPU/Management.h | 4 ++-- .../Devices/GPU/VMWare/DisplayConnector.cpp | 8 +++---- Kernel/Devices/GPU/VMWare/DisplayConnector.h | 2 +- Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp | 2 +- Kernel/Devices/GPU/VMWare/GraphicsAdapter.h | 2 +- .../Devices/GPU/VirtIO/DisplayConnector.cpp | 7 ++---- Kernel/Devices/GPU/VirtIO/DisplayConnector.h | 2 +- Kernel/Devices/GPU/VirtIO/GPU3DDevice.cpp | 2 +- Kernel/Devices/GPU/VirtIO/GPU3DDevice.h | 2 +- Kernel/Devices/GPU/VirtIO/GraphicsAdapter.cpp | 4 ++-- Kernel/Devices/GPU/VirtIO/GraphicsAdapter.h | 4 ++-- Kernel/Devices/Generic/ConsoleDevice.cpp | 6 ++--- Kernel/Devices/Generic/ConsoleDevice.h | 2 +- .../Devices/Generic/DeviceControlDevice.cpp | 7 ++---- Kernel/Devices/Generic/DeviceControlDevice.h | 2 +- Kernel/Devices/Generic/FullDevice.cpp | 7 ++---- Kernel/Devices/Generic/FullDevice.h | 2 +- Kernel/Devices/Generic/MemoryDevice.cpp | 7 ++---- Kernel/Devices/Generic/MemoryDevice.h | 2 +- Kernel/Devices/Generic/NullDevice.cpp | 7 ++---- Kernel/Devices/Generic/NullDevice.h | 2 +- Kernel/Devices/Generic/RandomDevice.cpp | 7 ++---- Kernel/Devices/Generic/RandomDevice.h | 2 +- Kernel/Devices/Generic/SelfTTYDevice.cpp | 7 ++---- Kernel/Devices/Generic/SelfTTYDevice.h | 2 +- Kernel/Devices/Generic/ZeroDevice.cpp | 7 ++---- Kernel/Devices/Generic/ZeroDevice.h | 2 +- Kernel/Devices/HID/KeyboardDevice.cpp | 2 +- Kernel/Devices/HID/MouseDevice.cpp | 2 +- Kernel/Devices/KCOVDevice.cpp | 7 ++---- Kernel/Devices/KCOVDevice.h | 2 +- Kernel/Devices/Loop/LoopDevice.cpp | 2 +- Kernel/Devices/Serial/VirtIO/Console.cpp | 4 ++-- Kernel/Devices/Serial/VirtIO/Console.h | 2 +- Kernel/Devices/Serial/VirtIO/ConsolePort.cpp | 4 ++-- Kernel/Devices/Serial/VirtIO/ConsolePort.h | 4 +++- Kernel/Devices/SerialDevice.h | 2 +- Kernel/Devices/Storage/AHCI/ATADiskDevice.cpp | 7 ++---- Kernel/Devices/Storage/AHCI/ATADiskDevice.h | 2 +- Kernel/Devices/Storage/AHCI/Controller.cpp | 7 +++++- Kernel/Devices/Storage/AHCI/Port.cpp | 2 +- Kernel/Devices/Storage/AHCI/Port.h | 6 +++-- .../Devices/Storage/NVMe/NVMeController.cpp | 6 +++-- Kernel/Devices/Storage/NVMe/NVMeController.h | 2 +- Kernel/Devices/Storage/NVMe/NVMeNameSpace.cpp | 2 +- Kernel/Devices/Storage/NVMe/NVMeNameSpace.h | 2 +- .../Devices/Storage/SD/SDHostController.cpp | 12 +++++++++- Kernel/Devices/Storage/SD/SDHostController.h | 6 ++--- Kernel/Devices/Storage/StorageDevice.h | 8 ++++--- .../Storage/StorageDevicePartition.cpp | 7 ++---- .../Devices/Storage/StorageDevicePartition.h | 2 +- Kernel/Devices/Storage/StorageManagement.cpp | 13 ++++++---- Kernel/Devices/Storage/StorageManagement.h | 2 +- .../Devices/Storage/USB/BulkSCSIInterface.h | 4 ++-- 76 files changed, 161 insertions(+), 189 deletions(-) diff --git a/Kernel/Arch/aarch64/RPi/MiniUART.cpp b/Kernel/Arch/aarch64/RPi/MiniUART.cpp index 562c06b2de134a..2c085453db7d7f 100644 --- a/Kernel/Arch/aarch64/RPi/MiniUART.cpp +++ b/Kernel/Arch/aarch64/RPi/MiniUART.cpp @@ -56,7 +56,7 @@ enum LineStatus { constexpr FlatPtr AUX_ENABLES = 0x21'5000; -UNMAP_AFTER_INIT ErrorOr> MiniUART::create() +UNMAP_AFTER_INIT ErrorOr> MiniUART::create() { return Device::try_create_device(); } diff --git a/Kernel/Arch/aarch64/RPi/MiniUART.h b/Kernel/Arch/aarch64/RPi/MiniUART.h index df445a9f06f9af..dc6892a47ea700 100644 --- a/Kernel/Arch/aarch64/RPi/MiniUART.h +++ b/Kernel/Arch/aarch64/RPi/MiniUART.h @@ -20,7 +20,7 @@ class MiniUART final : public CharacterDevice { friend class Kernel::Device; public: - static ErrorOr> create(); + static ErrorOr> create(); virtual ~MiniUART() override; diff --git a/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.cpp b/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.cpp index b08dcefcfa4568..c231b416bfe3dd 100644 --- a/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.cpp +++ b/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.cpp @@ -28,12 +28,12 @@ static u16 get_register_with_io(u16 index) return IO::in16(VBE_DISPI_IOPORT_DATA); } -LockRefPtr BochsDisplayConnector::try_create_for_vga_isa_connector() +ErrorOr> BochsDisplayConnector::try_create_for_vga_isa_connector() { VERIFY(PCI::Access::is_hardware_disabled()); BochsDisplayConnector::IndexID index_id = get_register_with_io(0); if (index_id != VBE_DISPI_ID5) - return {}; + return Error::from_errno(ENOTSUP); auto video_ram_64k_chunks_count = get_register_with_io(to_underlying(BochsDISPIRegisters::VIDEO_RAM_64K_CHUNKS_COUNT)); if (video_ram_64k_chunks_count == 0 || video_ram_64k_chunks_count == 0xffff) { @@ -47,24 +47,20 @@ LockRefPtr BochsDisplayConnector::try_create_for_vga_isa_ // Since this is probably hardcoded at other OSes in their guest drivers, // we can assume this is going to stay the same framebuffer physical address for // this device and will not be changed in the future. - auto device_or_error = Device::try_create_device(PhysicalAddress(0xE0000000), video_ram_64k_chunks_count * (64 * KiB)); - VERIFY(!device_or_error.is_error()); - auto connector = device_or_error.release_value(); - MUST(connector->create_attached_framebuffer_console()); - MUST(connector->initialize_edid_for_generic_monitor({})); + auto connector = TRY(Device::try_create_device(PhysicalAddress(0xE0000000), video_ram_64k_chunks_count * (64 * KiB))); + TRY(connector->create_attached_framebuffer_console()); + TRY(connector->initialize_edid_for_generic_monitor({})); return connector; } -NonnullLockRefPtr BochsDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware) +ErrorOr> BochsDisplayConnector::create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware) { - auto device_or_error = Device::try_create_device(framebuffer_address, framebuffer_resource_size); - VERIFY(!device_or_error.is_error()); - auto connector = device_or_error.release_value(); - MUST(connector->create_attached_framebuffer_console()); + auto connector = TRY(Device::try_create_device(framebuffer_address, framebuffer_resource_size)); + TRY(connector->create_attached_framebuffer_console()); if (virtual_box_hardware) - MUST(connector->initialize_edid_for_generic_monitor(Array { 'V', 'B', 'X' })); + TRY(connector->initialize_edid_for_generic_monitor(Array { 'V', 'B', 'X' })); else - MUST(connector->initialize_edid_for_generic_monitor({})); + TRY(connector->initialize_edid_for_generic_monitor({})); return connector; } diff --git a/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.h b/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.h index c898a440c193c4..5cd118428ebabb 100644 --- a/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.h +++ b/Kernel/Arch/x86_64/Hypervisor/BochsDisplayConnector.h @@ -25,9 +25,9 @@ class BochsDisplayConnector public: AK_TYPEDEF_DISTINCT_ORDERED_ID(u16, IndexID); - static LockRefPtr try_create_for_vga_isa_connector(); + static ErrorOr> try_create_for_vga_isa_connector(); - static NonnullLockRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware); + static ErrorOr> create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, bool virtual_box_hardware); private: IndexID index_id() const; diff --git a/Kernel/Arch/x86_64/ISABus/SerialDevice.cpp b/Kernel/Arch/x86_64/ISABus/SerialDevice.cpp index eeca9bf9b8a1c9..cd916fdb2cd4fc 100644 --- a/Kernel/Arch/x86_64/ISABus/SerialDevice.cpp +++ b/Kernel/Arch/x86_64/ISABus/SerialDevice.cpp @@ -16,11 +16,11 @@ namespace Kernel { #define SERIAL_COM3_ADDR 0x3E8 #define SERIAL_COM4_ADDR 0x2E8 -UNMAP_AFTER_INIT NonnullLockRefPtr SerialDevice::must_create(size_t com_number) +UNMAP_AFTER_INIT NonnullRefPtr SerialDevice::must_create(size_t com_number) { // FIXME: This way of blindly doing release_value is really not a good thing, find // a way to propagate errors back. - LockRefPtr serial_device; + RefPtr serial_device; switch (com_number) { case 0: { auto io_window = IOWindow::create_for_io_space(IOAddress(SERIAL_COM1_ADDR), 16).release_value_but_fixme_should_propagate_errors(); diff --git a/Kernel/Devices/Device.h b/Kernel/Devices/Device.h index eef46acd373c53..f6f57ec10a0374 100644 --- a/Kernel/Devices/Device.h +++ b/Kernel/Devices/Device.h @@ -75,18 +75,9 @@ class Device : public File { static void initialize_base_devices(); template - static inline ErrorOr> try_create_device(Args&&... args) - requires(requires(Args... args) { DeviceType::try_create(args...); }) + static inline ErrorOr> try_create_device(Args&&... args) { - auto device = TRY(DeviceType::try_create(forward(args)...)); - TRY(static_ptr_cast(device)->after_inserting()); - return device; - } - - template - static inline ErrorOr> try_create_device(Args&&... args) - { - auto device = TRY(adopt_nonnull_lock_ref_or_enomem(new (nothrow) DeviceType(forward(args)...))); + auto device = TRY(adopt_nonnull_ref_or_enomem(new (nothrow) DeviceType(forward(args)...))); TRY(static_ptr_cast(device)->after_inserting()); return device; } diff --git a/Kernel/Devices/FUSEDevice.cpp b/Kernel/Devices/FUSEDevice.cpp index 9c248404974cf2..deecd2ea769e83 100644 --- a/Kernel/Devices/FUSEDevice.cpp +++ b/Kernel/Devices/FUSEDevice.cpp @@ -13,7 +13,7 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr FUSEDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr FUSEDevice::must_create() { return MUST(Device::try_create_device()); } diff --git a/Kernel/Devices/FUSEDevice.h b/Kernel/Devices/FUSEDevice.h index 7185f2433d5384..5fd00ad4ae0fef 100644 --- a/Kernel/Devices/FUSEDevice.h +++ b/Kernel/Devices/FUSEDevice.h @@ -26,7 +26,7 @@ class FUSEDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); virtual ~FUSEDevice() override; ErrorOr initialize_instance(OpenFileDescription const&); diff --git a/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp b/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp index 9d5d3ca9d440ee..7e24d28cb2aecf 100644 --- a/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/3dfx/GraphicsAdapter.cpp @@ -60,7 +60,7 @@ UNMAP_AFTER_INIT ErrorOr VoodooGraphicsAdapter::initialize_adapter(PCI::De auto io_window = TRY(IOWindow::create_for_pci_device_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR2)); - m_display_connector = VoodooGraphics::VoodooDisplayConnector::must_create(vmem_addr, vmem_size, move(mmio_mapping), move(io_window)); + m_display_connector = TRY(VoodooGraphics::VoodooDisplayConnector::create(vmem_addr, vmem_size, move(mmio_mapping), move(io_window))); TRY(m_display_connector->set_safe_mode_setting()); return {}; diff --git a/Kernel/Devices/GPU/3dfx/GraphicsAdapter.h b/Kernel/Devices/GPU/3dfx/GraphicsAdapter.h index d6d319574eb6ae..a341948e30fcab 100644 --- a/Kernel/Devices/GPU/3dfx/GraphicsAdapter.h +++ b/Kernel/Devices/GPU/3dfx/GraphicsAdapter.h @@ -27,6 +27,6 @@ class VoodooGraphicsAdapter final : public GPUDevice explicit VoodooGraphicsAdapter(PCI::DeviceIdentifier const&); - LockRefPtr m_display_connector; + RefPtr m_display_connector; }; } diff --git a/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.cpp b/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.cpp index 3dfbce5b480498..adca483188206e 100644 --- a/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.cpp +++ b/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.cpp @@ -11,13 +11,11 @@ namespace Kernel::VoodooGraphics { -NonnullLockRefPtr VoodooDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping registers_mapping, NonnullOwnPtr io_window) +ErrorOr> VoodooDisplayConnector::create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping registers_mapping, NonnullOwnPtr io_window) { - auto device_or_error = Device::try_create_device(framebuffer_address, framebuffer_resource_size, move(registers_mapping), move(io_window)); - VERIFY(!device_or_error.is_error()); - auto connector = device_or_error.release_value(); - MUST(connector->create_attached_framebuffer_console()); - MUST(connector->fetch_and_initialize_edid()); + auto connector = TRY(Device::try_create_device(framebuffer_address, framebuffer_resource_size, move(registers_mapping), move(io_window))); + TRY(connector->create_attached_framebuffer_console()); + TRY(connector->fetch_and_initialize_edid()); return connector; } diff --git a/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.h b/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.h index ef8e384d51fe02..8167c3c173e4b3 100644 --- a/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.h +++ b/Kernel/Devices/GPU/3dfx/VoodooDisplayConnector.h @@ -21,7 +21,7 @@ class VoodooDisplayConnector final friend class Kernel::Device; public: - static NonnullLockRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping, NonnullOwnPtr io_window); + static ErrorOr> create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping, NonnullOwnPtr io_window); private: ErrorOr fetch_and_initialize_edid(); diff --git a/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp b/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp index ab3fb118a3a97f..61b4a55e55d924 100644 --- a/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/Bochs/GraphicsAdapter.cpp @@ -57,16 +57,16 @@ UNMAP_AFTER_INIT ErrorOr BochsGraphicsAdapter::initialize_adapter(PCI::Dev #if ARCH(X86_64) bool virtual_box_hardware = (pci_device_identifier.hardware_id().vendor_id == 0x80ee && pci_device_identifier.hardware_id().device_id == 0xbeef); if (pci_device_identifier.revision_id().value() == 0x0 || virtual_box_hardware) { - m_display_connector = BochsDisplayConnector::must_create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, virtual_box_hardware); + m_display_connector = TRY(BochsDisplayConnector::create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, virtual_box_hardware)); } else { auto registers_mapping = TRY(PCI::map_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR2)); VERIFY(registers_mapping.region); - m_display_connector = QEMUDisplayConnector::must_create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, move(registers_mapping)); + m_display_connector = TRY(QEMUDisplayConnector::create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, move(registers_mapping))); } #else auto registers_mapping = TRY(PCI::map_bar(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR2)); VERIFY(registers_mapping.region); - m_display_connector = QEMUDisplayConnector::must_create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, move(registers_mapping)); + m_display_connector = TRY(QEMUDisplayConnector::create(PhysicalAddress(TRY(PCI::get_bar_address(pci_device_identifier, PCI::HeaderType0BaseRegister::BAR0))), bar0_space_size, move(registers_mapping))); #endif // Note: According to Gerd Hoffmann - "The linux driver simply does diff --git a/Kernel/Devices/GPU/Bochs/GraphicsAdapter.h b/Kernel/Devices/GPU/Bochs/GraphicsAdapter.h index 4929bb0489eb2d..c6e12b216a0473 100644 --- a/Kernel/Devices/GPU/Bochs/GraphicsAdapter.h +++ b/Kernel/Devices/GPU/Bochs/GraphicsAdapter.h @@ -34,6 +34,6 @@ class BochsGraphicsAdapter final : public GPUDevice explicit BochsGraphicsAdapter(PCI::DeviceIdentifier const&); - LockRefPtr m_display_connector; + RefPtr m_display_connector; }; } diff --git a/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.cpp b/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.cpp index fd2ae1c73f8f30..ae3f07fad94c91 100644 --- a/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.cpp +++ b/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.cpp @@ -13,13 +13,11 @@ namespace Kernel { -NonnullLockRefPtr QEMUDisplayConnector::must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping registers_mapping) +ErrorOr> QEMUDisplayConnector::create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping registers_mapping) { - auto device_or_error = Device::try_create_device(framebuffer_address, framebuffer_resource_size, move(registers_mapping)); - VERIFY(!device_or_error.is_error()); - auto connector = device_or_error.release_value(); - MUST(connector->create_attached_framebuffer_console()); - MUST(connector->fetch_and_initialize_edid()); + auto connector = TRY(Device::try_create_device(framebuffer_address, framebuffer_resource_size, move(registers_mapping))); + TRY(connector->create_attached_framebuffer_console()); + TRY(connector->fetch_and_initialize_edid()); return connector; } diff --git a/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.h b/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.h index ff1bbf2b8e8569..76419dc9aa51a1 100644 --- a/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.h +++ b/Kernel/Devices/GPU/Bochs/QEMUDisplayConnector.h @@ -25,7 +25,7 @@ class QEMUDisplayConnector final public: AK_TYPEDEF_DISTINCT_ORDERED_ID(u16, IndexID); - static NonnullLockRefPtr must_create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping); + static ErrorOr> create(PhysicalAddress framebuffer_address, size_t framebuffer_resource_size, Memory::TypedMapping); private: IndexID index_id() const; diff --git a/Kernel/Devices/GPU/Generic/DisplayConnector.cpp b/Kernel/Devices/GPU/Generic/DisplayConnector.cpp index c594f907cc4c36..fe850c11c147ea 100644 --- a/Kernel/Devices/GPU/Generic/DisplayConnector.cpp +++ b/Kernel/Devices/GPU/Generic/DisplayConnector.cpp @@ -11,13 +11,11 @@ namespace Kernel { -NonnullLockRefPtr GenericDisplayConnector::must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) +ErrorOr> GenericDisplayConnector::create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch) { - auto device_or_error = Device::try_create_device(framebuffer_address, width, height, pitch); - VERIFY(!device_or_error.is_error()); - auto connector = device_or_error.release_value(); - MUST(connector->create_attached_framebuffer_console()); - MUST(connector->initialize_edid_for_generic_monitor({})); + auto connector = TRY(Device::try_create_device(framebuffer_address, width, height, pitch)); + TRY(connector->create_attached_framebuffer_console()); + TRY(connector->initialize_edid_for_generic_monitor({})); return connector; } diff --git a/Kernel/Devices/GPU/Generic/DisplayConnector.h b/Kernel/Devices/GPU/Generic/DisplayConnector.h index a9bf7944c724f0..53e769d6479aa4 100644 --- a/Kernel/Devices/GPU/Generic/DisplayConnector.h +++ b/Kernel/Devices/GPU/Generic/DisplayConnector.h @@ -20,7 +20,7 @@ class GenericDisplayConnector friend class Device; public: - static NonnullLockRefPtr must_create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch); + static ErrorOr> create_with_preset_resolution(PhysicalAddress framebuffer_address, size_t width, size_t height, size_t pitch); protected: ErrorOr create_attached_framebuffer_console(); diff --git a/Kernel/Devices/GPU/Intel/DisplayConnectorGroup.h b/Kernel/Devices/GPU/Intel/DisplayConnectorGroup.h index 45a4220afdd751..2c6b2a798dee12 100644 --- a/Kernel/Devices/GPU/Intel/DisplayConnectorGroup.h +++ b/Kernel/Devices/GPU/Intel/DisplayConnectorGroup.h @@ -81,7 +81,7 @@ class IntelDisplayConnectorGroup : public RefCounted // Note: The linux driver specifies an enum of possible ports and there is only // 9 ports (PORT_{A-I}). PORT_TC{1-6} are mapped to PORT_{D-I}. - Array, 9> m_connectors; + Array, 9> m_connectors; Array, 5> m_transcoders; Array, 3> m_planes; diff --git a/Kernel/Devices/GPU/Intel/NativeDisplayConnector.cpp b/Kernel/Devices/GPU/Intel/NativeDisplayConnector.cpp index eb432aa745ff15..25eee3a731d5ca 100644 --- a/Kernel/Devices/GPU/Intel/NativeDisplayConnector.cpp +++ b/Kernel/Devices/GPU/Intel/NativeDisplayConnector.cpp @@ -15,7 +15,7 @@ namespace Kernel { -ErrorOr> IntelNativeDisplayConnector::try_create_with_display_connector_group(IntelDisplayConnectorGroup const& parent_connector_group, ConnectorIndex connector_index, Type type, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size) +ErrorOr> IntelNativeDisplayConnector::try_create_with_display_connector_group(IntelDisplayConnectorGroup const& parent_connector_group, ConnectorIndex connector_index, Type type, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size) { return TRY(Device::try_create_device(parent_connector_group, connector_index, type, framebuffer_address, framebuffer_resource_size)); } diff --git a/Kernel/Devices/GPU/Intel/NativeDisplayConnector.h b/Kernel/Devices/GPU/Intel/NativeDisplayConnector.h index 3eae7775dab682..4f43a82d2f191f 100644 --- a/Kernel/Devices/GPU/Intel/NativeDisplayConnector.h +++ b/Kernel/Devices/GPU/Intel/NativeDisplayConnector.h @@ -46,7 +46,7 @@ class IntelNativeDisplayConnector final PortI = 8, }; - static ErrorOr> try_create_with_display_connector_group(IntelDisplayConnectorGroup const&, ConnectorIndex, Type, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); + static ErrorOr> try_create_with_display_connector_group(IntelDisplayConnectorGroup const&, ConnectorIndex, Type, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); void set_edid_bytes(Badge, Array const& edid_bytes); ErrorOr create_attached_framebuffer_console(Badge); diff --git a/Kernel/Devices/GPU/Management.cpp b/Kernel/Devices/GPU/Management.cpp index eae2f8ded79cdb..7fc4fc619f9de8 100644 --- a/Kernel/Devices/GPU/Management.cpp +++ b/Kernel/Devices/GPU/Management.cpp @@ -122,11 +122,11 @@ UNMAP_AFTER_INIT void GraphicsManagement::initialize_preset_resolution_generic_d VERIFY(!multiboot_framebuffer_addr.is_null()); VERIFY(multiboot_framebuffer_type == MULTIBOOT_FRAMEBUFFER_TYPE_RGB); dmesgln("Graphics: Using a preset resolution from the bootloader, without knowing the PCI device"); - m_preset_resolution_generic_display_connector = GenericDisplayConnector::must_create_with_preset_resolution( + m_preset_resolution_generic_display_connector = MUST(GenericDisplayConnector::create_with_preset_resolution( multiboot_framebuffer_addr, multiboot_framebuffer_width, multiboot_framebuffer_height, - multiboot_framebuffer_pitch); + multiboot_framebuffer_pitch)); } UNMAP_AFTER_INIT bool GraphicsManagement::initialize() @@ -169,11 +169,11 @@ UNMAP_AFTER_INIT bool GraphicsManagement::initialize() // for the framebuffer. if (PCI::Access::is_hardware_disabled() && !(graphics_subsystem_mode == CommandLine::GraphicsSubsystemMode::Limited && !multiboot_framebuffer_addr.is_null() && multiboot_framebuffer_type == MULTIBOOT_FRAMEBUFFER_TYPE_RGB)) { #if ARCH(X86_64) - auto vga_isa_bochs_display_connector = BochsDisplayConnector::try_create_for_vga_isa_connector(); - if (vga_isa_bochs_display_connector) { + auto vga_isa_bochs_display_connector_or_error = BochsDisplayConnector::try_create_for_vga_isa_connector(); + if (!vga_isa_bochs_display_connector_or_error.is_error()) { + m_platform_board_specific_display_connector = vga_isa_bochs_display_connector_or_error.release_value(); dmesgln("Graphics: Using a Bochs ISA VGA compatible adapter"); - MUST(vga_isa_bochs_display_connector->set_safe_mode_setting()); - m_platform_board_specific_display_connector = vga_isa_bochs_display_connector; + MUST(m_platform_board_specific_display_connector->set_safe_mode_setting()); dmesgln("Graphics: Invoking manual blanking with VGA ISA ports"); IO::out8(0x3c0, 0x20); return true; diff --git a/Kernel/Devices/GPU/Management.h b/Kernel/Devices/GPU/Management.h index 26192419631373..5829272538cee2 100644 --- a/Kernel/Devices/GPU/Management.h +++ b/Kernel/Devices/GPU/Management.h @@ -50,9 +50,9 @@ class GraphicsManagement { LockRefPtr m_console; // Note: This is only used when booting with kernel commandline that includes "graphics_subsystem_mode=limited" - LockRefPtr m_preset_resolution_generic_display_connector; + RefPtr m_preset_resolution_generic_display_connector; - LockRefPtr m_platform_board_specific_display_connector; + RefPtr m_platform_board_specific_display_connector; unsigned m_current_minor_number { 0 }; diff --git a/Kernel/Devices/GPU/VMWare/DisplayConnector.cpp b/Kernel/Devices/GPU/VMWare/DisplayConnector.cpp index 52e0c8e511b6e0..78a02afbc34b47 100644 --- a/Kernel/Devices/GPU/VMWare/DisplayConnector.cpp +++ b/Kernel/Devices/GPU/VMWare/DisplayConnector.cpp @@ -11,11 +11,11 @@ namespace Kernel { -NonnullLockRefPtr VMWareDisplayConnector::must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size) +ErrorOr> VMWareDisplayConnector::create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size) { - auto connector = MUST(Device::try_create_device(parent_adapter, framebuffer_address, framebuffer_resource_size)); - MUST(connector->create_attached_framebuffer_console()); - MUST(connector->initialize_edid_for_generic_monitor(Array { 'V', 'M', 'W' })); + auto connector = TRY(Device::try_create_device(parent_adapter, framebuffer_address, framebuffer_resource_size)); + TRY(connector->create_attached_framebuffer_console()); + TRY(connector->initialize_edid_for_generic_monitor(Array { 'V', 'M', 'W' })); return connector; } diff --git a/Kernel/Devices/GPU/VMWare/DisplayConnector.h b/Kernel/Devices/GPU/VMWare/DisplayConnector.h index f878bdd0d66fff..23ae3414a120e5 100644 --- a/Kernel/Devices/GPU/VMWare/DisplayConnector.h +++ b/Kernel/Devices/GPU/VMWare/DisplayConnector.h @@ -23,7 +23,7 @@ class VMWareDisplayConnector : public DisplayConnector { friend class Device; public: - static NonnullLockRefPtr must_create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); + static ErrorOr> create(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); private: VMWareDisplayConnector(VMWareGraphicsAdapter const& parent_adapter, PhysicalAddress framebuffer_address, size_t framebuffer_resource_size); diff --git a/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp b/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp index 597f4259c0b092..aaa684b4b4565a 100644 --- a/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/VMWare/GraphicsAdapter.cpp @@ -186,7 +186,7 @@ UNMAP_AFTER_INIT ErrorOr VMWareGraphicsAdapter::initialize_adapter() auto bar1_space_size = PCI::get_BAR_space_size(device_identifier(), PCI::HeaderType0BaseRegister::BAR1); - m_display_connector = VMWareDisplayConnector::must_create(*this, TRY(PCI::get_bar_address(device_identifier(), PCI::HeaderType0BaseRegister::BAR1)), bar1_space_size); + m_display_connector = TRY(VMWareDisplayConnector::create(*this, TRY(PCI::get_bar_address(device_identifier(), PCI::HeaderType0BaseRegister::BAR1)), bar1_space_size)); TRY(m_display_connector->set_safe_mode_setting()); return {}; } diff --git a/Kernel/Devices/GPU/VMWare/GraphicsAdapter.h b/Kernel/Devices/GPU/VMWare/GraphicsAdapter.h index 6e0f9311c59e48..fa73612057ce42 100644 --- a/Kernel/Devices/GPU/VMWare/GraphicsAdapter.h +++ b/Kernel/Devices/GPU/VMWare/GraphicsAdapter.h @@ -52,7 +52,7 @@ class VMWareGraphicsAdapter final VMWareGraphicsAdapter(PCI::DeviceIdentifier const&, NonnullOwnPtr registers_io_window); Memory::TypedMapping m_fifo_registers; - LockRefPtr m_display_connector; + RefPtr m_display_connector; mutable NonnullOwnPtr m_registers_io_window; mutable Spinlock m_io_access_lock {}; mutable RecursiveSpinlock m_operation_lock {}; diff --git a/Kernel/Devices/GPU/VirtIO/DisplayConnector.cpp b/Kernel/Devices/GPU/VirtIO/DisplayConnector.cpp index 4bb9f195a03760..4c14e0e1570811 100644 --- a/Kernel/Devices/GPU/VirtIO/DisplayConnector.cpp +++ b/Kernel/Devices/GPU/VirtIO/DisplayConnector.cpp @@ -15,12 +15,9 @@ namespace Kernel { -NonnullLockRefPtr VirtIODisplayConnector::must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id) +ErrorOr> VirtIODisplayConnector::create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id) { - auto device_or_error = Device::try_create_device(graphics_adapter, scanout_id); - VERIFY(!device_or_error.is_error()); - auto connector = device_or_error.release_value(); - return connector; + return TRY(Device::try_create_device(graphics_adapter, scanout_id)); } static_assert((MAX_VIRTIOGPU_RESOLUTION_WIDTH * MAX_VIRTIOGPU_RESOLUTION_HEIGHT * sizeof(u32) * 2) % PAGE_SIZE == 0); diff --git a/Kernel/Devices/GPU/VirtIO/DisplayConnector.h b/Kernel/Devices/GPU/VirtIO/DisplayConnector.h index 843a6fea2f0110..6c699c6ae7247c 100644 --- a/Kernel/Devices/GPU/VirtIO/DisplayConnector.h +++ b/Kernel/Devices/GPU/VirtIO/DisplayConnector.h @@ -30,7 +30,7 @@ class VirtIODisplayConnector final : public DisplayConnector { friend class Device; public: - static NonnullLockRefPtr must_create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id); + static ErrorOr> create(VirtIOGraphicsAdapter& graphics_adapter, Graphics::VirtIOGPU::ScanoutID scanout_id); void set_edid_bytes(Badge, Array const& edid_bytes); void set_safe_mode_setting_after_initialization(Badge); diff --git a/Kernel/Devices/GPU/VirtIO/GPU3DDevice.cpp b/Kernel/Devices/GPU/VirtIO/GPU3DDevice.cpp index e24d175d4aee8e..77636ce2c7d731 100644 --- a/Kernel/Devices/GPU/VirtIO/GPU3DDevice.cpp +++ b/Kernel/Devices/GPU/VirtIO/GPU3DDevice.cpp @@ -23,7 +23,7 @@ VirtIOGPU3DDevice::PerContextState::PerContextState(OpenFileDescription& descrip { } -ErrorOr> VirtIOGPU3DDevice::try_create(VirtIOGraphicsAdapter& adapter) +ErrorOr> VirtIOGPU3DDevice::create(VirtIOGraphicsAdapter& adapter) { // Setup memory transfer region auto region_result = TRY(MM.allocate_kernel_region( diff --git a/Kernel/Devices/GPU/VirtIO/GPU3DDevice.h b/Kernel/Devices/GPU/VirtIO/GPU3DDevice.h index e583254530f618..83b19f18080926 100644 --- a/Kernel/Devices/GPU/VirtIO/GPU3DDevice.h +++ b/Kernel/Devices/GPU/VirtIO/GPU3DDevice.h @@ -97,7 +97,7 @@ class VirtIOGPU3DDevice : public CharacterDevice { friend class Device; public: - static ErrorOr> try_create(VirtIOGraphicsAdapter&); + static ErrorOr> create(VirtIOGraphicsAdapter&); private: VirtIOGPU3DDevice(VirtIOGraphicsAdapter const& graphics_adapter, NonnullOwnPtr transfer_buffer_region, Graphics::VirtIOGPU::ContextID kernel_context_id); diff --git a/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.cpp b/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.cpp index 451cd8c455c921..a54ad5ede324ef 100644 --- a/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.cpp +++ b/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.cpp @@ -49,7 +49,7 @@ ErrorOr VirtIOGraphicsAdapter::initialize_adapter() VERIFY(m_num_scanouts <= VIRTIO_GPU_MAX_SCANOUTS); TRY(initialize_3d_device()); for (size_t index = 0; index < m_num_scanouts; index++) { - auto display_connector = VirtIODisplayConnector::must_create(*this, index); + auto display_connector = TRY(VirtIODisplayConnector::create(*this, index)); m_scanouts[index].display_connector = display_connector; TRY(query_and_set_edid(index, *display_connector)); display_connector->set_safe_mode_setting_after_initialization({}); @@ -465,7 +465,7 @@ ErrorOr VirtIOGraphicsAdapter::initialize_3d_device() { if (m_has_virgl_support) { SpinlockLocker locker(m_operation_lock); - m_3d_device = TRY(VirtIOGPU3DDevice::try_create(*this)); + m_3d_device = TRY(VirtIOGPU3DDevice::create(*this)); } return {}; } diff --git a/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.h b/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.h index 1f89e07c97f092..95edba698233c6 100644 --- a/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.h +++ b/Kernel/Devices/GPU/VirtIO/GraphicsAdapter.h @@ -60,7 +60,7 @@ class VirtIOGraphicsAdapter final Graphics::VirtIOGPU::ResourceID resource_id { 0 }; }; - LockRefPtr display_connector; + RefPtr display_connector; PhysicalBuffer main_buffer; PhysicalBuffer back_buffer; }; @@ -114,7 +114,7 @@ class VirtIOGraphicsAdapter final // Note: Resource ID 0 is invalid, and we must not allocate 0 as the first resource ID. Atomic m_resource_id_counter { 1 }; SpinlockProtected m_active_context_ids {}; - LockRefPtr m_3d_device; + RefPtr m_3d_device; bool m_has_virgl_support { false }; Spinlock m_operation_lock {}; diff --git a/Kernel/Devices/Generic/ConsoleDevice.cpp b/Kernel/Devices/Generic/ConsoleDevice.cpp index 3de5f4dedbf2f2..fad4d63ebf2c60 100644 --- a/Kernel/Devices/Generic/ConsoleDevice.cpp +++ b/Kernel/Devices/Generic/ConsoleDevice.cpp @@ -19,11 +19,9 @@ namespace Kernel { Spinlock g_console_lock {}; -UNMAP_AFTER_INIT NonnullLockRefPtr ConsoleDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr ConsoleDevice::must_create() { - auto device_or_error = Device::try_create_device(); - VERIFY(!device_or_error.is_error()); - return device_or_error.release_value(); + return MUST(Device::try_create_device()); } UNMAP_AFTER_INIT ConsoleDevice::ConsoleDevice() diff --git a/Kernel/Devices/Generic/ConsoleDevice.h b/Kernel/Devices/Generic/ConsoleDevice.h index 82c8d3d68ef244..7f4cfc5ddba238 100644 --- a/Kernel/Devices/Generic/ConsoleDevice.h +++ b/Kernel/Devices/Generic/ConsoleDevice.h @@ -18,7 +18,7 @@ class ConsoleDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); virtual ~ConsoleDevice() override; diff --git a/Kernel/Devices/Generic/DeviceControlDevice.cpp b/Kernel/Devices/Generic/DeviceControlDevice.cpp index a8b6c0cce3b859..09ff720e94d8a3 100644 --- a/Kernel/Devices/Generic/DeviceControlDevice.cpp +++ b/Kernel/Devices/Generic/DeviceControlDevice.cpp @@ -13,12 +13,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr DeviceControlDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr DeviceControlDevice::must_create() { - auto device_control_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!device_control_device_or_error.is_error()); - return device_control_device_or_error.release_value(); + return MUST(Device::try_create_device()); } bool DeviceControlDevice::can_read(OpenFileDescription const&, u64) const diff --git a/Kernel/Devices/Generic/DeviceControlDevice.h b/Kernel/Devices/Generic/DeviceControlDevice.h index 52cbc2dc48f7c9..97ee9d2d45efbd 100644 --- a/Kernel/Devices/Generic/DeviceControlDevice.h +++ b/Kernel/Devices/Generic/DeviceControlDevice.h @@ -14,7 +14,7 @@ class DeviceControlDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); virtual ~DeviceControlDevice() override; private: diff --git a/Kernel/Devices/Generic/FullDevice.cpp b/Kernel/Devices/Generic/FullDevice.cpp index 83ab10858d2665..ef105798eaab79 100644 --- a/Kernel/Devices/Generic/FullDevice.cpp +++ b/Kernel/Devices/Generic/FullDevice.cpp @@ -12,12 +12,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr FullDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr FullDevice::must_create() { - auto full_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!full_device_or_error.is_error()); - return full_device_or_error.release_value(); + return MUST(Device::try_create_device()); } UNMAP_AFTER_INIT FullDevice::FullDevice() diff --git a/Kernel/Devices/Generic/FullDevice.h b/Kernel/Devices/Generic/FullDevice.h index 10dfad0354e8d0..861a76702ed5f6 100644 --- a/Kernel/Devices/Generic/FullDevice.h +++ b/Kernel/Devices/Generic/FullDevice.h @@ -14,7 +14,7 @@ class FullDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); virtual ~FullDevice() override; private: diff --git a/Kernel/Devices/Generic/MemoryDevice.cpp b/Kernel/Devices/Generic/MemoryDevice.cpp index e4446448f6cac4..51bae04786baec 100644 --- a/Kernel/Devices/Generic/MemoryDevice.cpp +++ b/Kernel/Devices/Generic/MemoryDevice.cpp @@ -13,12 +13,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr MemoryDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr MemoryDevice::must_create() { - auto memory_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!memory_device_or_error.is_error()); - return memory_device_or_error.release_value(); + return MUST(Device::try_create_device()); } UNMAP_AFTER_INIT MemoryDevice::MemoryDevice() diff --git a/Kernel/Devices/Generic/MemoryDevice.h b/Kernel/Devices/Generic/MemoryDevice.h index bf69ad34493f2f..92db137532bb34 100644 --- a/Kernel/Devices/Generic/MemoryDevice.h +++ b/Kernel/Devices/Generic/MemoryDevice.h @@ -16,7 +16,7 @@ class MemoryDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); ~MemoryDevice(); virtual ErrorOr> vmobject_for_mmap(Process&, Memory::VirtualRange const&, u64& offset, bool shared) override; diff --git a/Kernel/Devices/Generic/NullDevice.cpp b/Kernel/Devices/Generic/NullDevice.cpp index ac93caa10e226b..e34b752f8048ac 100644 --- a/Kernel/Devices/Generic/NullDevice.cpp +++ b/Kernel/Devices/Generic/NullDevice.cpp @@ -12,12 +12,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr NullDevice::must_initialize() +UNMAP_AFTER_INIT NonnullRefPtr NullDevice::must_initialize() { - auto null_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!null_device_or_error.is_error()); - return null_device_or_error.release_value(); + return MUST(Device::try_create_device()); } UNMAP_AFTER_INIT NullDevice::NullDevice() diff --git a/Kernel/Devices/Generic/NullDevice.h b/Kernel/Devices/Generic/NullDevice.h index 4fefada4dfd4bf..f4495490d49ec7 100644 --- a/Kernel/Devices/Generic/NullDevice.h +++ b/Kernel/Devices/Generic/NullDevice.h @@ -16,7 +16,7 @@ class NullDevice final : public CharacterDevice { public: virtual ~NullDevice() override; - static NonnullLockRefPtr must_initialize(); + static NonnullRefPtr must_initialize(); private: NullDevice(); diff --git a/Kernel/Devices/Generic/RandomDevice.cpp b/Kernel/Devices/Generic/RandomDevice.cpp index 74df59b2295ba9..2c233a986f5483 100644 --- a/Kernel/Devices/Generic/RandomDevice.cpp +++ b/Kernel/Devices/Generic/RandomDevice.cpp @@ -12,12 +12,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr RandomDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr RandomDevice::must_create() { - auto random_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!random_device_or_error.is_error()); - return random_device_or_error.release_value(); + return MUST(Device::try_create_device()); } UNMAP_AFTER_INIT RandomDevice::RandomDevice() diff --git a/Kernel/Devices/Generic/RandomDevice.h b/Kernel/Devices/Generic/RandomDevice.h index 326105d563b13e..36f8a170a7d0b7 100644 --- a/Kernel/Devices/Generic/RandomDevice.h +++ b/Kernel/Devices/Generic/RandomDevice.h @@ -14,7 +14,7 @@ class RandomDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); virtual ~RandomDevice() override; private: diff --git a/Kernel/Devices/Generic/SelfTTYDevice.cpp b/Kernel/Devices/Generic/SelfTTYDevice.cpp index a041d962cb5131..1d882cc8c66ccb 100644 --- a/Kernel/Devices/Generic/SelfTTYDevice.cpp +++ b/Kernel/Devices/Generic/SelfTTYDevice.cpp @@ -12,12 +12,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr SelfTTYDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr SelfTTYDevice::must_create() { - auto self_tty_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!self_tty_device_or_error.is_error()); - return self_tty_device_or_error.release_value(); + return MUST(Device::try_create_device()); } ErrorOr> SelfTTYDevice::open(int options) diff --git a/Kernel/Devices/Generic/SelfTTYDevice.h b/Kernel/Devices/Generic/SelfTTYDevice.h index d1b8999095f595..303fd188791636 100644 --- a/Kernel/Devices/Generic/SelfTTYDevice.h +++ b/Kernel/Devices/Generic/SelfTTYDevice.h @@ -14,7 +14,7 @@ class SelfTTYDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); virtual ~SelfTTYDevice() override; private: diff --git a/Kernel/Devices/Generic/ZeroDevice.cpp b/Kernel/Devices/Generic/ZeroDevice.cpp index 992025117aae2a..bd5c4ae3e3db28 100644 --- a/Kernel/Devices/Generic/ZeroDevice.cpp +++ b/Kernel/Devices/Generic/ZeroDevice.cpp @@ -11,12 +11,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr ZeroDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr ZeroDevice::must_create() { - auto zero_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!zero_device_or_error.is_error()); - return zero_device_or_error.release_value(); + return MUST(Device::try_create_device()); } UNMAP_AFTER_INIT ZeroDevice::ZeroDevice() diff --git a/Kernel/Devices/Generic/ZeroDevice.h b/Kernel/Devices/Generic/ZeroDevice.h index 4f552fd328d32b..adf98f4c650daa 100644 --- a/Kernel/Devices/Generic/ZeroDevice.h +++ b/Kernel/Devices/Generic/ZeroDevice.h @@ -14,7 +14,7 @@ class ZeroDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); virtual ~ZeroDevice() override; private: diff --git a/Kernel/Devices/HID/KeyboardDevice.cpp b/Kernel/Devices/HID/KeyboardDevice.cpp index 596606e16957bf..c2f8bea9efc9f5 100644 --- a/Kernel/Devices/HID/KeyboardDevice.cpp +++ b/Kernel/Devices/HID/KeyboardDevice.cpp @@ -77,7 +77,7 @@ void KeyboardDevice::handle_input_event(KeyEvent queued_event) ErrorOr> KeyboardDevice::try_to_initialize() { - return *TRY(Device::try_create_device()); + return TRY(Device::try_create_device()); } // FIXME: UNMAP_AFTER_INIT is fine for now, but for hot-pluggable devices diff --git a/Kernel/Devices/HID/MouseDevice.cpp b/Kernel/Devices/HID/MouseDevice.cpp index e5d86321296735..f52848982dc17d 100644 --- a/Kernel/Devices/HID/MouseDevice.cpp +++ b/Kernel/Devices/HID/MouseDevice.cpp @@ -13,7 +13,7 @@ namespace Kernel { ErrorOr> MouseDevice::try_to_initialize() { - return *TRY(Device::try_create_device()); + return TRY(Device::try_create_device()); } MouseDevice::MouseDevice() diff --git a/Kernel/Devices/KCOVDevice.cpp b/Kernel/Devices/KCOVDevice.cpp index 7c226b707bf0b7..2d7c2c1091ff64 100644 --- a/Kernel/Devices/KCOVDevice.cpp +++ b/Kernel/Devices/KCOVDevice.cpp @@ -17,12 +17,9 @@ namespace Kernel { -UNMAP_AFTER_INIT NonnullLockRefPtr KCOVDevice::must_create() +UNMAP_AFTER_INIT NonnullRefPtr KCOVDevice::must_create() { - auto kcov_device_or_error = Device::try_create_device(); - // FIXME: Find a way to propagate errors - VERIFY(!kcov_device_or_error.is_error()); - return kcov_device_or_error.release_value(); + return MUST(Device::try_create_device()); } UNMAP_AFTER_INIT KCOVDevice::KCOVDevice() diff --git a/Kernel/Devices/KCOVDevice.h b/Kernel/Devices/KCOVDevice.h index f294b28210509b..8a2dcba9e1cf1e 100644 --- a/Kernel/Devices/KCOVDevice.h +++ b/Kernel/Devices/KCOVDevice.h @@ -14,7 +14,7 @@ class KCOVDevice final : public BlockDevice { friend class Device; public: - static NonnullLockRefPtr must_create(); + static NonnullRefPtr must_create(); static void free_thread(); static void free_process(); diff --git a/Kernel/Devices/Loop/LoopDevice.cpp b/Kernel/Devices/Loop/LoopDevice.cpp index 4843a07281417c..f7757c1222ab64 100644 --- a/Kernel/Devices/Loop/LoopDevice.cpp +++ b/Kernel/Devices/Loop/LoopDevice.cpp @@ -66,7 +66,7 @@ ErrorOr> LoopDevice::create_with_file_description(Open return Error::from_errno(ENOTSUP); return TRY(LoopDevice::all_instances().with([custody](auto& all_instances_list) -> ErrorOr> { - NonnullRefPtr device = *TRY(Device::try_create_device(*custody, s_loop_device_id.fetch_add(1))); + NonnullRefPtr device = TRY(Device::try_create_device(*custody, s_loop_device_id.fetch_add(1))); all_instances_list.append(*device); return device; })); diff --git a/Kernel/Devices/Serial/VirtIO/Console.cpp b/Kernel/Devices/Serial/VirtIO/Console.cpp index e247d405e1e12b..fc197eed8d04fa 100644 --- a/Kernel/Devices/Serial/VirtIO/Console.cpp +++ b/Kernel/Devices/Serial/VirtIO/Console.cpp @@ -53,7 +53,7 @@ UNMAP_AFTER_INIT ErrorOr Console::initialize_virtio_resources() if (is_feature_accepted(VIRTIO_CONSOLE_F_MULTIPORT)) { setup_multiport(); } else { - auto port = TRY(Kernel::Device::try_create_device(0u, *this)); + auto port = TRY(VirtIO::ConsolePort::create(0u, *this)); port->init_receive_buffer({}); m_ports.append(port); } @@ -161,7 +161,7 @@ void Console::process_control_message(ControlMessage message) return; } - auto port = MUST(Kernel::Device::try_create_device(id, *this)); + auto port = MUST(VirtIO::ConsolePort::create(id, *this)); port->init_receive_buffer({}); m_ports.at(id) = port; diff --git a/Kernel/Devices/Serial/VirtIO/Console.h b/Kernel/Devices/Serial/VirtIO/Console.h index ca1531a9ab1483..9b13ce3b497715 100644 --- a/Kernel/Devices/Serial/VirtIO/Console.h +++ b/Kernel/Devices/Serial/VirtIO/Console.h @@ -62,7 +62,7 @@ class Console virtual ErrorOr handle_device_config_change() override; virtual void handle_queue_update(u16 queue_index) override; - Vector> m_ports; + Vector> m_ports; void setup_multiport(); void process_control_message(ControlMessage message); void write_control_message(ControlMessage message); diff --git a/Kernel/Devices/Serial/VirtIO/ConsolePort.cpp b/Kernel/Devices/Serial/VirtIO/ConsolePort.cpp index 99c463a18a6ca4..30e8d4e168f297 100644 --- a/Kernel/Devices/Serial/VirtIO/ConsolePort.cpp +++ b/Kernel/Devices/Serial/VirtIO/ConsolePort.cpp @@ -13,11 +13,11 @@ namespace Kernel::VirtIO { unsigned ConsolePort::next_device_id = 0; -ErrorOr> ConsolePort::try_create(unsigned port, Console& console) +ErrorOr> ConsolePort::create(unsigned port, Console& console) { auto receive_buffer = TRY(Memory::RingBuffer::try_create("VirtIO::ConsolePort Receive"sv, RINGBUFFER_SIZE)); auto transmit_buffer = TRY(Memory::RingBuffer::try_create("VirtIO::ConsolePort Transmit"sv, RINGBUFFER_SIZE)); - return adopt_nonnull_lock_ref_or_enomem(new (nothrow) ConsolePort(port, console, move(receive_buffer), move(transmit_buffer))); + return TRY(Device::try_create_device(port, console, move(receive_buffer), move(transmit_buffer))); } ConsolePort::ConsolePort(unsigned port, VirtIO::Console& console, NonnullOwnPtr receive_buffer, NonnullOwnPtr transmit_buffer) diff --git a/Kernel/Devices/Serial/VirtIO/ConsolePort.h b/Kernel/Devices/Serial/VirtIO/ConsolePort.h index ac6f51980a430e..609c71e09bd549 100644 --- a/Kernel/Devices/Serial/VirtIO/ConsolePort.h +++ b/Kernel/Devices/Serial/VirtIO/ConsolePort.h @@ -23,8 +23,10 @@ class Console; class ConsolePort : public CharacterDevice { + friend class Device; + public: - static ErrorOr> try_create(unsigned port, VirtIO::Console&); + static ErrorOr> create(unsigned port, VirtIO::Console&); void handle_queue_update(Badge, u16 queue_index); diff --git a/Kernel/Devices/SerialDevice.h b/Kernel/Devices/SerialDevice.h index b0cd7d171a149d..6cf7424f2e0693 100644 --- a/Kernel/Devices/SerialDevice.h +++ b/Kernel/Devices/SerialDevice.h @@ -15,7 +15,7 @@ class SerialDevice final : public CharacterDevice { friend class Device; public: - static NonnullLockRefPtr must_create(size_t com_number); + static NonnullRefPtr must_create(size_t com_number); virtual ~SerialDevice() override; diff --git a/Kernel/Devices/Storage/AHCI/ATADiskDevice.cpp b/Kernel/Devices/Storage/AHCI/ATADiskDevice.cpp index 3391fd56019c8b..eb1f73bb05bea0 100644 --- a/Kernel/Devices/Storage/AHCI/ATADiskDevice.cpp +++ b/Kernel/Devices/Storage/AHCI/ATADiskDevice.cpp @@ -12,12 +12,9 @@ namespace Kernel { -NonnullLockRefPtr ATADiskDevice::create(AHCIController const& controller, ATA::Address ata_address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block) +ErrorOr> ATADiskDevice::create(AHCIController const& controller, ATA::Address ata_address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block) { - auto disk_device_or_error = Device::try_create_device(controller, ata_address, capabilities, logical_sector_size, max_addressable_block); - // FIXME: Find a way to propagate errors - VERIFY(!disk_device_or_error.is_error()); - return disk_device_or_error.release_value(); + return TRY(Device::try_create_device(controller, ata_address, capabilities, logical_sector_size, max_addressable_block)); } ATADiskDevice::ATADiskDevice(AHCIController const& controller, ATA::Address ata_address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block) diff --git a/Kernel/Devices/Storage/AHCI/ATADiskDevice.h b/Kernel/Devices/Storage/AHCI/ATADiskDevice.h index 7cd6675794b4ec..dcfebb857f668f 100644 --- a/Kernel/Devices/Storage/AHCI/ATADiskDevice.h +++ b/Kernel/Devices/Storage/AHCI/ATADiskDevice.h @@ -18,7 +18,7 @@ class ATADiskDevice final : public ATADevice { friend class Device; public: - static NonnullLockRefPtr create(AHCIController const&, ATA::Address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block); + static ErrorOr> create(AHCIController const&, ATA::Address, u16 capabilities, u16 logical_sector_size, u64 max_addressable_block); virtual ~ATADiskDevice() override; // ^StorageDevice diff --git a/Kernel/Devices/Storage/AHCI/Controller.cpp b/Kernel/Devices/Storage/AHCI/Controller.cpp index 053febde2cabdf..d2208bad2fd0c1 100644 --- a/Kernel/Devices/Storage/AHCI/Controller.cpp +++ b/Kernel/Devices/Storage/AHCI/Controller.cpp @@ -202,7 +202,12 @@ LockRefPtr AHCIController::device_by_port(u32 port_index) const if (!port) return {}; SpinlockLocker port_hard_locker(port->m_hard_lock); - return port->connected_device(); + + // FIXME: Remove this once we get rid of this hacky method in the future. + auto device = port->connected_device(); + if (!device) + return nullptr; + return *device; } LockRefPtr AHCIController::device(u32 index) const diff --git a/Kernel/Devices/Storage/AHCI/Port.cpp b/Kernel/Devices/Storage/AHCI/Port.cpp index 35fbad6e273bb7..1104ac537d25cb 100644 --- a/Kernel/Devices/Storage/AHCI/Port.cpp +++ b/Kernel/Devices/Storage/AHCI/Port.cpp @@ -277,7 +277,7 @@ bool AHCIPort::initialize() // FIXME: We don't support ATAPI devices yet, so for now we don't "create" them if (!is_atapi_attached()) { - m_connected_device = ATADiskDevice::create(*m_parent_controller, { m_port_index, 0 }, 0, logical_sector_size, max_addressable_sector); + m_connected_device = MUST(ATADiskDevice::create(*m_parent_controller, { m_port_index, 0 }, 0, logical_sector_size, max_addressable_sector)); } else { dbgln("AHCI Port {}: Ignoring ATAPI devices as we don't support them.", representative_port_index()); } diff --git a/Kernel/Devices/Storage/AHCI/Port.h b/Kernel/Devices/Storage/AHCI/Port.h index c2cab5afa28fbf..715c8549faca79 100644 --- a/Kernel/Devices/Storage/AHCI/Port.h +++ b/Kernel/Devices/Storage/AHCI/Port.h @@ -43,7 +43,7 @@ class AHCIPort bool is_operable() const; bool is_atapi_attached() const { return m_port_registers.sig == (u32)ATA::DeviceSignature::ATAPI; } - LockRefPtr connected_device() const { return m_connected_device; } + RefPtr connected_device() const { return m_connected_device; } bool reset(); bool initialize_without_reset(); @@ -113,7 +113,9 @@ class AHCIPort RefPtr m_command_list_page; OwnPtr m_command_list_region; RefPtr m_fis_receive_page; - LockRefPtr m_connected_device; + // FIXME: This should have some locking once we actually support hotplug + // properly. + RefPtr m_connected_device; u32 m_port_index; diff --git a/Kernel/Devices/Storage/NVMe/NVMeController.cpp b/Kernel/Devices/Storage/NVMe/NVMeController.cpp index 3b9e35c6ce814b..9dbc7651789863 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeController.cpp +++ b/Kernel/Devices/Storage/NVMe/NVMeController.cpp @@ -209,7 +209,7 @@ UNMAP_AFTER_INIT ErrorOr NVMeController::identify_and_init_namespaces() dbgln_if(NVME_DEBUG, "NVMe: Block count is {} and Block size is {}", block_counts, block_size); - m_namespaces.append(TRY(NVMeNameSpace::try_create(*this, m_queues, nsid, block_counts, block_size))); + m_namespaces.append(TRY(NVMeNameSpace::create(*this, m_queues, nsid, block_counts, block_size))); m_device_count++; dbgln_if(NVME_DEBUG, "NVMe: Initialized namespace with NSID: {}", nsid); } @@ -288,7 +288,9 @@ UNMAP_AFTER_INIT NVMeController::NSFeatures NVMeController::get_ns_features(Iden LockRefPtr NVMeController::device(u32 index) const { - return m_namespaces.at(index); + // FIXME: Remove this once we get rid of this hacky method in the future. + auto device = m_namespaces.at(index); + return *device; } size_t NVMeController::devices_count() const diff --git a/Kernel/Devices/Storage/NVMe/NVMeController.h b/Kernel/Devices/Storage/NVMe/NVMeController.h index e35c758dab5cc2..bb706f88d75dd1 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeController.h +++ b/Kernel/Devices/Storage/NVMe/NVMeController.h @@ -74,7 +74,7 @@ class NVMeController : public PCI::Device private: LockRefPtr m_admin_queue; Vector> m_queues; - Vector> m_namespaces; + Vector> m_namespaces; Memory::TypedMapping m_controller_regs; RefPtr m_dbbuf_shadow_page; RefPtr m_dbbuf_eventidx_page; diff --git a/Kernel/Devices/Storage/NVMe/NVMeNameSpace.cpp b/Kernel/Devices/Storage/NVMe/NVMeNameSpace.cpp index ac5d0db5888620..0d62a1e86405d3 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeNameSpace.cpp +++ b/Kernel/Devices/Storage/NVMe/NVMeNameSpace.cpp @@ -12,7 +12,7 @@ namespace Kernel { -UNMAP_AFTER_INIT ErrorOr> NVMeNameSpace::try_create(NVMeController const& controller, Vector> queues, u16 nsid, size_t storage_size, size_t lba_size) +UNMAP_AFTER_INIT ErrorOr> NVMeNameSpace::create(NVMeController const& controller, Vector> queues, u16 nsid, size_t storage_size, size_t lba_size) { auto device = TRY(Device::try_create_device(StorageDevice::LUNAddress { controller.controller_id(), nsid, 0 }, controller.hardware_relative_controller_id(), move(queues), storage_size, lba_size, nsid)); return device; diff --git a/Kernel/Devices/Storage/NVMe/NVMeNameSpace.h b/Kernel/Devices/Storage/NVMe/NVMeNameSpace.h index 2867225d9fcb85..09b1126967a191 100644 --- a/Kernel/Devices/Storage/NVMe/NVMeNameSpace.h +++ b/Kernel/Devices/Storage/NVMe/NVMeNameSpace.h @@ -23,7 +23,7 @@ class NVMeNameSpace : public StorageDevice { friend class Device; public: - static ErrorOr> try_create(NVMeController const&, Vector> queues, u16 nsid, size_t storage_size, size_t lba_size); + static ErrorOr> create(NVMeController const&, Vector> queues, u16 nsid, size_t storage_size, size_t lba_size); CommandSet command_set() const override { return CommandSet::NVMe; } void start_request(AsyncBlockDeviceRequest& request) override; diff --git a/Kernel/Devices/Storage/SD/SDHostController.cpp b/Kernel/Devices/Storage/SD/SDHostController.cpp index 7b005f5569d2ac..59f548d3cfddad 100644 --- a/Kernel/Devices/Storage/SD/SDHostController.cpp +++ b/Kernel/Devices/Storage/SD/SDHostController.cpp @@ -78,6 +78,16 @@ void SDHostController::complete_current_request(AsyncDeviceRequest::RequestResul VERIFY_NOT_REACHED(); } +LockRefPtr SDHostController::device(u32 index) const +{ + // FIXME: Remove this once we get rid of this hacky method in the future. + if (index != 0) + return nullptr; + if (!m_card) + return nullptr; + return *m_card; +} + ErrorOr SDHostController::initialize() { m_registers = get_register_map_base_address(); @@ -129,7 +139,7 @@ void SDHostController::try_enable_dma() } } -ErrorOr> SDHostController::try_initialize_inserted_card() +ErrorOr> SDHostController::try_initialize_inserted_card() { if (!is_card_inserted()) return ENODEV; diff --git a/Kernel/Devices/Storage/SD/SDHostController.h b/Kernel/Devices/Storage/SD/SDHostController.h index 2d5e625b3705c4..bd00f59f381428 100644 --- a/Kernel/Devices/Storage/SD/SDHostController.h +++ b/Kernel/Devices/Storage/SD/SDHostController.h @@ -24,7 +24,7 @@ class SDHostController : public StorageController { virtual ~SDHostController() = default; - virtual LockRefPtr device(u32 index) const override { return index == 0 ? m_card : nullptr; } + virtual LockRefPtr device(u32 index) const override; virtual size_t devices_count() const override { return m_card ? 1 : 0; } virtual void complete_current_request(AsyncDeviceRequest::RequestResult) override; @@ -37,7 +37,7 @@ class SDHostController : public StorageController { virtual SD::HostControlRegisterMap volatile* get_register_map_base_address() = 0; private: - ErrorOr> try_initialize_inserted_card(); + ErrorOr> try_initialize_inserted_card(); bool is_card_inserted() const { @@ -90,7 +90,7 @@ class SDHostController : public StorageController { u32 make_adma_descriptor_table(u32 block_count); volatile SD::HostControlRegisterMap* m_registers; - LockRefPtr m_card { nullptr }; + RefPtr m_card { nullptr }; u32 m_hardware_relative_controller_id { 0 }; OperatingMode m_mode { OperatingMode::PIO }; diff --git a/Kernel/Devices/Storage/StorageDevice.h b/Kernel/Devices/Storage/StorageDevice.h index 52d2f7ab309ecd..13a1e2c221fa07 100644 --- a/Kernel/Devices/Storage/StorageDevice.h +++ b/Kernel/Devices/Storage/StorageDevice.h @@ -67,9 +67,9 @@ class StorageDevice : public BlockDevice { virtual bool can_write(OpenFileDescription const&, u64) const override { return true; } virtual void prepare_for_unplug() { m_partitions.clear(); } - Vector> const& partitions() const { return m_partitions; } + Vector> const& partitions() const { return m_partitions; } - void add_partition(NonnullLockRefPtr disk_partition) { MUST(m_partitions.try_append(disk_partition)); } + void add_partition(NonnullRefPtr disk_partition) { MUST(m_partitions.try_append(disk_partition)); } LUNAddress const& logical_unit_number_address() const { return m_logical_unit_number_address; } @@ -93,7 +93,9 @@ class StorageDevice : public BlockDevice { virtual void will_be_destroyed() override; mutable IntrusiveListNode> m_list_node; - Vector> m_partitions; + // NOTE: This probably need a better locking once we support hotplug and + // refresh of the partition table. + Vector> m_partitions; LUNAddress const m_logical_unit_number_address; diff --git a/Kernel/Devices/Storage/StorageDevicePartition.cpp b/Kernel/Devices/Storage/StorageDevicePartition.cpp index 563a87afed034e..80300d2afe4fff 100644 --- a/Kernel/Devices/Storage/StorageDevicePartition.cpp +++ b/Kernel/Devices/Storage/StorageDevicePartition.cpp @@ -13,12 +13,9 @@ namespace Kernel { -NonnullLockRefPtr StorageDevicePartition::create(StorageDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata) +ErrorOr> StorageDevicePartition::create(StorageDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata) { - auto partition_or_error = Device::try_create_device(device, minor_number, metadata); - // FIXME: Find a way to propagate errors - VERIFY(!partition_or_error.is_error()); - return partition_or_error.release_value(); + return TRY(Device::try_create_device(device, minor_number, metadata)); } StorageDevicePartition::StorageDevicePartition(StorageDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata) diff --git a/Kernel/Devices/Storage/StorageDevicePartition.h b/Kernel/Devices/Storage/StorageDevicePartition.h index 86f757e7a5febc..c6a014ad9c3f35 100644 --- a/Kernel/Devices/Storage/StorageDevicePartition.h +++ b/Kernel/Devices/Storage/StorageDevicePartition.h @@ -18,7 +18,7 @@ class StorageDevicePartition final : public BlockDevice { friend class Device; public: - static NonnullLockRefPtr create(StorageDevice&, MinorNumber, Partition::DiskPartitionMetadata); + static ErrorOr> create(StorageDevice&, MinorNumber, Partition::DiskPartitionMetadata); virtual ~StorageDevicePartition(); virtual void start_request(AsyncBlockDeviceRequest&) override; diff --git a/Kernel/Devices/Storage/StorageManagement.cpp b/Kernel/Devices/Storage/StorageManagement.cpp index 43b704643c64fc..05f5d1b1b95f9d 100644 --- a/Kernel/Devices/Storage/StorageManagement.cpp +++ b/Kernel/Devices/Storage/StorageManagement.cpp @@ -214,7 +214,7 @@ ErrorOr StorageManagement::enumerate_device_partitions(StorageDevice& devi { auto partition_table = TRY(try_to_initialize_partition_table(device)); for (auto partition_metadata : partition_table->partitions()) { - auto disk_partition = StorageDevicePartition::create(device, generate_partition_minor_number(), partition_metadata); + auto disk_partition = TRY(StorageDevicePartition::create(device, generate_partition_minor_number(), partition_metadata)); device.add_partition(disk_partition); } @@ -290,7 +290,7 @@ UNMAP_AFTER_INIT void StorageManagement::resolve_partition_from_boot_device_para auto partition_number = possible_partition_number.value(); if (chosen_storage_device.partitions().size() <= partition_number) PANIC("StorageManagement: Invalid partition number parameter."); - m_boot_block_device = chosen_storage_device.partitions()[partition_number]; + m_boot_block_device = *chosen_storage_device.partitions()[partition_number]; } UNMAP_AFTER_INIT void StorageManagement::determine_hardware_relative_boot_device(StringView relative_hardware_prefix, Function filter_device_callback) @@ -422,16 +422,19 @@ UNMAP_AFTER_INIT void StorageManagement::determine_boot_device_with_partition_uu if (partition->metadata().unique_guid().is_zero()) continue; if (partition->metadata().unique_guid() == partition_uuid) { - m_boot_block_device = partition; + m_boot_block_device = *partition; break; } } } } -LockRefPtr StorageManagement::boot_block_device() const +RefPtr StorageManagement::boot_block_device() const { - return m_boot_block_device.strong_ref(); + auto device = m_boot_block_device.strong_ref(); + if (!device) + return nullptr; + return *device; } MinorNumber StorageManagement::generate_storage_minor_number() diff --git a/Kernel/Devices/Storage/StorageManagement.h b/Kernel/Devices/Storage/StorageManagement.h index 3e62d2aeb2b4f8..f941d4851a961d 100644 --- a/Kernel/Devices/Storage/StorageManagement.h +++ b/Kernel/Devices/Storage/StorageManagement.h @@ -66,7 +66,7 @@ class StorageManagement { ErrorOr> try_to_initialize_partition_table(StorageDevice&) const; - LockRefPtr boot_block_device() const; + RefPtr boot_block_device() const; StringView m_boot_argument; LockWeakPtr m_boot_block_device; diff --git a/Kernel/Devices/Storage/USB/BulkSCSIInterface.h b/Kernel/Devices/Storage/USB/BulkSCSIInterface.h index a8b10ef2f801ed..03735c48bcf238 100644 --- a/Kernel/Devices/Storage/USB/BulkSCSIInterface.h +++ b/Kernel/Devices/Storage/USB/BulkSCSIInterface.h @@ -213,7 +213,7 @@ class BulkSCSIInterface : public RefCounted { private: BulkSCSIInterface(USB::Device&, USBInterface const&, NonnullOwnPtr, NonnullOwnPtr); - void add_storage_device(NonnullLockRefPtr storage_device) { m_storage_devices.append(storage_device); } + void add_storage_device(NonnullRefPtr storage_device) { m_storage_devices.append(storage_device); } BulkSCSIStorageDevice::List m_storage_devices; @@ -222,7 +222,7 @@ class BulkSCSIInterface : public RefCounted { NonnullOwnPtr m_in_pipe; NonnullOwnPtr m_out_pipe; - IntrusiveListNode> m_list_node; + IntrusiveListNode> m_list_node; public: using List = IntrusiveList<&BulkSCSIInterface::m_list_node>;