1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-06-01 10:08:10 +00:00

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.
This commit is contained in:
Liav A 2022-07-23 11:15:35 +03:00 committed by Linus Groh
parent cb68619b7f
commit 1102089f9f
5 changed files with 17 additions and 12 deletions

View file

@ -11,7 +11,7 @@
namespace Kernel {
NonnullRefPtr<DiskPartition> DiskPartition::create(BlockDevice& device, unsigned minor_number, Partition::DiskPartitionMetadata metadata)
NonnullRefPtr<DiskPartition> DiskPartition::create(BlockDevice& device, MinorNumber minor_number, Partition::DiskPartitionMetadata metadata)
{
auto partition_or_error = DeviceManagement::try_create_device<DiskPartition>(device, minor_number, metadata);
// FIXME: Find a way to propagate errors
@ -19,7 +19,7 @@ NonnullRefPtr<DiskPartition> 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)

View file

@ -17,7 +17,7 @@ class DiskPartition final : public BlockDevice {
friend class DeviceManagement;
public:
static NonnullRefPtr<DiskPartition> create(BlockDevice&, unsigned, Partition::DiskPartitionMetadata);
static NonnullRefPtr<DiskPartition> 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<BlockDevice> m_device;

View file

@ -15,9 +15,7 @@ namespace Kernel {
NonnullRefPtr<RamdiskDevice> RamdiskDevice::create(RamdiskController const& controller, NonnullOwnPtr<Memory::Region>&& 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<RamdiskDevice>(controller, move(region), major, minor, move(device_name));
// FIXME: Find a way to propagate errors

View file

@ -30,7 +30,8 @@
namespace Kernel {
static Singleton<StorageManagement> s_the;
static Atomic<u32> s_device_minor_number;
static Atomic<u32> s_storage_device_minor_number;
static Atomic<u32> s_partition_device_minor_number;
static Atomic<u32> 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<FileSystem> 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

View file

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