From dfb6b296cf9ae8b5afa19cf2ea6813f0d774fcb1 Mon Sep 17 00:00:00 2001 From: Liav A Date: Sat, 27 Mar 2021 06:22:55 +0300 Subject: Kernel: Make IDEChannel Ref-counted Technically not supported by the original ATA specification, IDE hot swapping is still in practice possible, so the only sane way to start support it is with ref-counting the IDEChannel object so if we remove a PATADiskDevice, it's not gone with it. --- Kernel/Storage/IDEChannel.cpp | 4 ++-- Kernel/Storage/IDEChannel.h | 8 +++++--- Kernel/Storage/IDEController.h | 2 +- Kernel/Storage/PATADiskDevice.cpp | 4 ++-- Kernel/Storage/PATADiskDevice.h | 2 +- 5 files changed, 11 insertions(+), 9 deletions(-) (limited to 'Kernel') diff --git a/Kernel/Storage/IDEChannel.cpp b/Kernel/Storage/IDEChannel.cpp index 86e2b04eb3..2fbc43f286 100644 --- a/Kernel/Storage/IDEChannel.cpp +++ b/Kernel/Storage/IDEChannel.cpp @@ -45,9 +45,9 @@ namespace Kernel { #define PCI_Mass_Storage_Class 0x1 #define PCI_IDE_Controller_Subclass 0x1 -UNMAP_AFTER_INIT NonnullOwnPtr IDEChannel::create(const IDEController& controller, IOAddressGroup io_group, ChannelType type, bool force_pio) +UNMAP_AFTER_INIT NonnullRefPtr IDEChannel::create(const IDEController& controller, IOAddressGroup io_group, ChannelType type, bool force_pio) { - return make(controller, io_group, type, force_pio); + return adopt(*new IDEChannel(controller, io_group, type, force_pio)); } RefPtr IDEChannel::master_device() const diff --git a/Kernel/Storage/IDEChannel.h b/Kernel/Storage/IDEChannel.h index e48c7fd68c..095bc3808f 100644 --- a/Kernel/Storage/IDEChannel.h +++ b/Kernel/Storage/IDEChannel.h @@ -60,7 +60,8 @@ struct PhysicalRegionDescriptor { }; class IDEController; -class IDEChannel final : public IRQHandler { +class IDEChannel final : public RefCounted + , public IRQHandler { friend class IDEController; friend class PATADiskDevice; AK_MAKE_ETERNAL @@ -104,8 +105,7 @@ public: }; public: - static NonnullOwnPtr create(const IDEController&, IOAddressGroup, ChannelType type, bool force_pio); - IDEChannel(const IDEController&, IOAddressGroup, ChannelType type, bool force_pio); + static NonnullRefPtr create(const IDEController&, IOAddressGroup, ChannelType type, bool force_pio); virtual ~IDEChannel() override; RefPtr master_device() const; @@ -114,6 +114,8 @@ public: virtual const char* purpose() const override { return "PATA Channel"; } private: + IDEChannel(const IDEController&, IOAddressGroup, ChannelType type, bool force_pio); + //^ IRQHandler virtual void handle_irq(const RegisterState&) override; diff --git a/Kernel/Storage/IDEController.h b/Kernel/Storage/IDEController.h index 51518ffa21..aff37f1bd9 100644 --- a/Kernel/Storage/IDEController.h +++ b/Kernel/Storage/IDEController.h @@ -60,6 +60,6 @@ private: void initialize(bool force_pio); void detect_disks(); - NonnullOwnPtrVector m_channels; + NonnullRefPtrVector m_channels; }; } diff --git a/Kernel/Storage/PATADiskDevice.cpp b/Kernel/Storage/PATADiskDevice.cpp index 4649b71581..1e6b6cba29 100644 --- a/Kernel/Storage/PATADiskDevice.cpp +++ b/Kernel/Storage/PATADiskDevice.cpp @@ -58,8 +58,8 @@ const char* PATADiskDevice::class_name() const void PATADiskDevice::start_request(AsyncBlockDeviceRequest& request) { - bool use_dma = !m_channel.m_io_group.bus_master_base().is_null() && m_channel.m_dma_enabled.resource(); - m_channel.start_request(request, use_dma, is_slave(), m_capabilities); + bool use_dma = !m_channel->m_io_group.bus_master_base().is_null() && m_channel->m_dma_enabled.resource(); + m_channel->start_request(request, use_dma, is_slave(), m_capabilities); } String PATADiskDevice::device_name() const diff --git a/Kernel/Storage/PATADiskDevice.h b/Kernel/Storage/PATADiskDevice.h index 55c394dd00..406242c584 100644 --- a/Kernel/Storage/PATADiskDevice.h +++ b/Kernel/Storage/PATADiskDevice.h @@ -77,7 +77,7 @@ private: Lock m_lock { "IDEDiskDevice" }; u16 m_capabilities { 0 }; - IDEChannel& m_channel; + NonnullRefPtr m_channel; DriveType m_drive_type { DriveType::Master }; InterfaceType m_interface_type { InterfaceType::ATA }; }; -- cgit debian/1.2.3+git2.25.1-1-2-gaceb0