mirror of
				https://github.com/RGBCube/serenity
				synced 2025-10-31 00:42:44 +00:00 
			
		
		
		
	Kernel: Allow adding storage devices after init
This commit is contained in:
		
							parent
							
								
									0b649878a5
								
							
						
					
					
						commit
						4f46fb9891
					
				
					 2 changed files with 23 additions and 12 deletions
				
			
		|  | @ -81,6 +81,13 @@ u32 StorageManagement::generate_relative_sd_controller_id(Badge<SDHostController | ||||||
|     return controller_id; |     return controller_id; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | void StorageManagement::add_device(StorageDevice& device) | ||||||
|  | { | ||||||
|  |     m_storage_devices.append(device); | ||||||
|  |     // FIXME: Maybe handle this error in some way shape or form
 | ||||||
|  |     (void)enumerate_device_partitions(device); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| void StorageManagement::remove_device(StorageDevice& device) | void StorageManagement::remove_device(StorageDevice& device) | ||||||
| { | { | ||||||
|     m_storage_devices.remove(device); |     m_storage_devices.remove(device); | ||||||
|  | @ -193,7 +200,7 @@ UNMAP_AFTER_INIT void StorageManagement::dump_storage_devices_and_partitions() c | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| UNMAP_AFTER_INIT ErrorOr<NonnullOwnPtr<Partition::PartitionTable>> StorageManagement::try_to_initialize_partition_table(StorageDevice& device) const | ErrorOr<NonnullOwnPtr<Partition::PartitionTable>> StorageManagement::try_to_initialize_partition_table(StorageDevice& device) const | ||||||
| { | { | ||||||
|     auto mbr_table_or_error = Partition::MBRPartitionTable::try_to_initialize(device); |     auto mbr_table_or_error = Partition::MBRPartitionTable::try_to_initialize(device); | ||||||
|     if (!mbr_table_or_error.is_error()) |     if (!mbr_table_or_error.is_error()) | ||||||
|  | @ -205,21 +212,23 @@ UNMAP_AFTER_INIT ErrorOr<NonnullOwnPtr<Partition::PartitionTable>> StorageManage | ||||||
|     return TRY(Partition::GUIDPartitionTable::try_to_initialize(device)); |     return TRY(Partition::GUIDPartitionTable::try_to_initialize(device)); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | ErrorOr<void> StorageManagement::enumerate_device_partitions(StorageDevice& device) | ||||||
|  | { | ||||||
|  |     auto partition_table = TRY(try_to_initialize_partition_table(device)); | ||||||
|  |     for (auto partition_metadata : partition_table->partitions()) { | ||||||
|  |         auto disk_partition = DiskPartition::create(device, generate_partition_minor_number(), partition_metadata); | ||||||
|  |         device.add_partition(disk_partition); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     return {}; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| UNMAP_AFTER_INIT void StorageManagement::enumerate_disk_partitions() | UNMAP_AFTER_INIT void StorageManagement::enumerate_disk_partitions() | ||||||
| { | { | ||||||
|     VERIFY(!m_storage_devices.is_empty()); |     VERIFY(!m_storage_devices.is_empty()); | ||||||
|     for (auto& device : m_storage_devices) { |     for (auto& device : m_storage_devices) { | ||||||
|         auto partition_table_or_error = try_to_initialize_partition_table(device); |         // FIXME: Maybe handle this error in some way shape or form
 | ||||||
|         if (partition_table_or_error.is_error()) |         (void)enumerate_device_partitions(device); | ||||||
|             continue; |  | ||||||
|         auto partition_table = partition_table_or_error.release_value(); |  | ||||||
|         for (size_t partition_index = 0; partition_index < partition_table->partitions_count(); partition_index++) { |  | ||||||
|             auto partition_metadata = partition_table->partition(partition_index); |  | ||||||
|             if (!partition_metadata.has_value()) |  | ||||||
|                 continue; |  | ||||||
|             auto disk_partition = DiskPartition::create(device, generate_partition_minor_number(), partition_metadata.value()); |  | ||||||
|             device.add_partition(disk_partition); |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -40,11 +40,13 @@ public: | ||||||
|     static u32 generate_relative_ata_controller_id(Badge<ATAController>); |     static u32 generate_relative_ata_controller_id(Badge<ATAController>); | ||||||
|     static u32 generate_relative_sd_controller_id(Badge<SDHostController>); |     static u32 generate_relative_sd_controller_id(Badge<SDHostController>); | ||||||
| 
 | 
 | ||||||
|  |     void add_device(StorageDevice&); | ||||||
|     void remove_device(StorageDevice&); |     void remove_device(StorageDevice&); | ||||||
| 
 | 
 | ||||||
| private: | private: | ||||||
|     void enumerate_pci_controllers(bool force_pio, bool nvme_poll); |     void enumerate_pci_controllers(bool force_pio, bool nvme_poll); | ||||||
|     void enumerate_storage_devices(); |     void enumerate_storage_devices(); | ||||||
|  |     ErrorOr<void> enumerate_device_partitions(StorageDevice&); | ||||||
|     void enumerate_disk_partitions(); |     void enumerate_disk_partitions(); | ||||||
| 
 | 
 | ||||||
|     void determine_boot_device(); |     void determine_boot_device(); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Hendiadyoin1
						Hendiadyoin1