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&);