From 1102089f9f27de55739e33ba26624a079effd97d Mon Sep 17 00:00:00 2001 From: Liav A Date: Sat, 23 Jul 2022 11:15:35 +0300 Subject: [PATCH] Kernel/Storage: Don't hardcode a maximum of 16 partitions per drive In the near future, we will be able to figure out connections between storage devices and their partitions, so there's no need to hardcode 16 partitions per storage device - each storage device should be able to have "infinite" count of partitions in it, and we should be able to use and figure out about them. --- Kernel/Storage/DiskPartition.cpp | 4 ++-- Kernel/Storage/DiskPartition.h | 4 ++-- Kernel/Storage/Ramdisk/Device.cpp | 4 +--- Kernel/Storage/StorageManagement.cpp | 15 ++++++++++----- Kernel/Storage/StorageManagement.h | 2 ++ 5 files changed, 17 insertions(+), 12 deletions(-) diff --git a/Kernel/Storage/DiskPartition.cpp b/Kernel/Storage/DiskPartition.cpp index 4e931af09f..49d39294b5 100644 --- a/Kernel/Storage/DiskPartition.cpp +++ b/Kernel/Storage/DiskPartition.cpp @@ -11,7 +11,7 @@ namespace Kernel { -NonnullRefPtr DiskPartition::create(BlockDevice& device, unsigned minor_number, Partition::DiskPartitionMetadata metadata) +NonnullRefPtr DiskPartition::create(BlockDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata) { auto partition_or_error = DeviceManagement::try_create_device(device, minor_number, metadata); // FIXME: Find a way to propagate errors @@ -19,7 +19,7 @@ NonnullRefPtr DiskPartition::create(BlockDevice& device, unsigned return partition_or_error.release_value(); } -DiskPartition::DiskPartition(BlockDevice& device, unsigned minor_number, Partition::DiskPartitionMetadata metadata) +DiskPartition::DiskPartition(BlockDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata) : BlockDevice(100, minor_number, device.block_size()) , m_device(device) , m_metadata(metadata) diff --git a/Kernel/Storage/DiskPartition.h b/Kernel/Storage/DiskPartition.h index f67d2cb32f..440f56cd78 100644 --- a/Kernel/Storage/DiskPartition.h +++ b/Kernel/Storage/DiskPartition.h @@ -17,7 +17,7 @@ class DiskPartition final : public BlockDevice { friend class DeviceManagement; public: - static NonnullRefPtr create(BlockDevice&, unsigned, Partition::DiskPartitionMetadata); + static NonnullRefPtr create(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata); virtual ~DiskPartition(); virtual void start_request(AsyncBlockDeviceRequest&) override; @@ -31,7 +31,7 @@ public: Partition::DiskPartitionMetadata const& metadata() const; private: - DiskPartition(BlockDevice&, unsigned, Partition::DiskPartitionMetadata); + DiskPartition(BlockDevice&, MinorNumber, Partition::DiskPartitionMetadata); virtual StringView class_name() const override; WeakPtr m_device; diff --git a/Kernel/Storage/Ramdisk/Device.cpp b/Kernel/Storage/Ramdisk/Device.cpp index ad173c4120..d888137706 100644 --- a/Kernel/Storage/Ramdisk/Device.cpp +++ b/Kernel/Storage/Ramdisk/Device.cpp @@ -15,9 +15,7 @@ namespace Kernel { NonnullRefPtr RamdiskDevice::create(RamdiskController const& controller, NonnullOwnPtr&& region, int major, int minor) { - // FIXME: Try to not hardcode a maximum of 16 partitions per drive! - size_t drive_index = minor / 16; - auto device_name = MUST(KString::formatted("ramdisk{}", drive_index)); + auto device_name = MUST(KString::formatted("ramdisk{}", minor)); auto device_or_error = DeviceManagement::try_create_device(controller, move(region), major, minor, move(device_name)); // FIXME: Find a way to propagate errors diff --git a/Kernel/Storage/StorageManagement.cpp b/Kernel/Storage/StorageManagement.cpp index 71c06ef784..2e5691849b 100644 --- a/Kernel/Storage/StorageManagement.cpp +++ b/Kernel/Storage/StorageManagement.cpp @@ -30,7 +30,8 @@ namespace Kernel { static Singleton s_the; -static Atomic s_device_minor_number; +static Atomic s_storage_device_minor_number; +static Atomic s_partition_device_minor_number; static Atomic s_controller_id; static constexpr StringView partition_uuid_prefix = "PARTUUID:"sv; @@ -156,8 +157,7 @@ UNMAP_AFTER_INIT void StorageManagement::enumerate_disk_partitions() auto partition_metadata = partition_table->partition(partition_index); if (!partition_metadata.has_value()) continue; - // FIXME: Try to not hardcode a maximum of 16 partitions per drive! - auto disk_partition = DiskPartition::create(device, (partition_index + (16 * device_index)), partition_metadata.value()); + auto disk_partition = DiskPartition::create(device, generate_partition_minor_number(), partition_metadata.value()); device.add_partition(disk_partition); } device_index++; @@ -241,7 +241,12 @@ MajorNumber StorageManagement::storage_type_major_number() } MinorNumber StorageManagement::generate_storage_minor_number() { - return s_device_minor_number.fetch_add(1); + return s_storage_device_minor_number.fetch_add(1); +} + +MinorNumber StorageManagement::generate_partition_minor_number() +{ + return s_partition_device_minor_number.fetch_add(1); } u32 StorageManagement::generate_controller_id() @@ -270,7 +275,7 @@ NonnullRefPtr StorageManagement::root_filesystem() const UNMAP_AFTER_INIT void StorageManagement::initialize(StringView root_device, bool force_pio, bool poll) { - VERIFY(s_device_minor_number == 0); + VERIFY(s_storage_device_minor_number == 0); m_boot_argument = root_device; if (PCI::Access::is_disabled()) { // Note: If PCI is disabled, we assume that at least we have an ISA IDE controller diff --git a/Kernel/Storage/StorageManagement.h b/Kernel/Storage/StorageManagement.h index 84fc698c7e..0e6f43b310 100644 --- a/Kernel/Storage/StorageManagement.h +++ b/Kernel/Storage/StorageManagement.h @@ -31,6 +31,8 @@ public: static MajorNumber storage_type_major_number(); static MinorNumber generate_storage_minor_number(); + static MinorNumber generate_partition_minor_number(); + static u32 generate_controller_id(); void remove_device(StorageDevice&);