Bladeren bron

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.
Liav A 4 jaren geleden
bovenliggende
commit
dfb6b296cf

+ 2 - 2
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> IDEChannel::create(const IDEController& controller, IOAddressGroup io_group, ChannelType type, bool force_pio)
+UNMAP_AFTER_INIT NonnullRefPtr<IDEChannel> IDEChannel::create(const IDEController& controller, IOAddressGroup io_group, ChannelType type, bool force_pio)
 {
-    return make<IDEChannel>(controller, io_group, type, force_pio);
+    return adopt(*new IDEChannel(controller, io_group, type, force_pio));
 }
 
 RefPtr<StorageDevice> IDEChannel::master_device() const

+ 5 - 3
Kernel/Storage/IDEChannel.h

@@ -60,7 +60,8 @@ struct PhysicalRegionDescriptor {
 };
 
 class IDEController;
-class IDEChannel final : public IRQHandler {
+class IDEChannel final : public RefCounted<IDEChannel>
+    , public IRQHandler {
     friend class IDEController;
     friend class PATADiskDevice;
     AK_MAKE_ETERNAL
@@ -104,8 +105,7 @@ public:
     };
 
 public:
-    static NonnullOwnPtr<IDEChannel> create(const IDEController&, IOAddressGroup, ChannelType type, bool force_pio);
-    IDEChannel(const IDEController&, IOAddressGroup, ChannelType type, bool force_pio);
+    static NonnullRefPtr<IDEChannel> create(const IDEController&, IOAddressGroup, ChannelType type, bool force_pio);
     virtual ~IDEChannel() override;
 
     RefPtr<StorageDevice> 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;
 

+ 1 - 1
Kernel/Storage/IDEController.h

@@ -60,6 +60,6 @@ private:
     void initialize(bool force_pio);
     void detect_disks();
 
-    NonnullOwnPtrVector<IDEChannel> m_channels;
+    NonnullRefPtrVector<IDEChannel> m_channels;
 };
 }

+ 2 - 2
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

+ 1 - 1
Kernel/Storage/PATADiskDevice.h

@@ -77,7 +77,7 @@ private:
 
     Lock m_lock { "IDEDiskDevice" };
     u16 m_capabilities { 0 };
-    IDEChannel& m_channel;
+    NonnullRefPtr<IDEChannel> m_channel;
     DriveType m_drive_type { DriveType::Master };
     InterfaceType m_interface_type { InterfaceType::ATA };
 };