diff --git a/Kernel/Storage/StorageManagement.cpp b/Kernel/Storage/StorageManagement.cpp index 7d05fce3d9..54fe0266bb 100644 --- a/Kernel/Storage/StorageManagement.cpp +++ b/Kernel/Storage/StorageManagement.cpp @@ -109,6 +109,24 @@ UNMAP_AFTER_INIT void StorageManagement::enumerate_storage_devices() } } +UNMAP_AFTER_INIT void StorageManagement::dump_storage_devices_and_partitions() const +{ + dbgln("StorageManagement: Detected {} storage devices", m_storage_devices.size_slow()); + for (auto const& storage_device : m_storage_devices) { + auto const& partitions = storage_device.partitions(); + if (partitions.is_empty()) { + dbgln(" Device: {} (no partitions)", storage_device.early_storage_name()); + } else { + dbgln(" Device: {} ({} partitions)", storage_device.early_storage_name(), partitions.size()); + unsigned partition_number = 1; + for (auto const& partition : partitions) { + dbgln(" Partition: {} (UUID {})", partition_number, partition.metadata().unique_guid().to_string()); + partition_number++; + } + } + } +} + UNMAP_AFTER_INIT OwnPtr StorageManagement::try_to_initialize_partition_table(const StorageDevice& device) const { auto mbr_table_or_result = MBRPartitionTable::try_to_initialize(device); @@ -191,6 +209,7 @@ UNMAP_AFTER_INIT void StorageManagement::determine_boot_device() } if (m_boot_block_device.is_null()) { + dump_storage_devices_and_partitions(); PANIC("StorageManagement: boot device {} not found", m_boot_argument); } } @@ -203,6 +222,9 @@ UNMAP_AFTER_INIT void StorageManagement::determine_boot_device_with_partition_uu auto partition_uuid = UUID(m_boot_argument.substring_view(partition_uuid_prefix.length())); if (partition_uuid.to_string().length() != 36) { + // FIXME: It would be helpful to output the specified and detected UUIDs in this case, + // but we never actually enter this path - if the length doesn't match, the UUID + // constructor above crashes with a VERIFY in convert_string_view_to_uuid(). PANIC("StorageManagement: Specified partition UUID is not valid"); } for (auto& storage_device : m_storage_devices) { @@ -237,6 +259,7 @@ NonnullRefPtr StorageManagement::root_filesystem() const { auto boot_device_description = boot_block_device(); if (!boot_device_description) { + dump_storage_devices_and_partitions(); PANIC("StorageManagement: Couldn't find a suitable device to boot from"); } auto description_or_error = OpenFileDescription::try_create(boot_device_description.release_nonnull()); @@ -245,6 +268,7 @@ NonnullRefPtr StorageManagement::root_filesystem() const auto file_system = Ext2FS::try_create(description_or_error.release_value()).release_value(); if (auto result = file_system->initialize(); result.is_error()) { + dump_storage_devices_and_partitions(); PANIC("StorageManagement: Couldn't open root filesystem: {}", result.error()); } return file_system; diff --git a/Kernel/Storage/StorageManagement.h b/Kernel/Storage/StorageManagement.h index 570a45ce8c..29c7e6be19 100644 --- a/Kernel/Storage/StorageManagement.h +++ b/Kernel/Storage/StorageManagement.h @@ -43,6 +43,8 @@ private: void determine_boot_device(); void determine_boot_device_with_partition_uuid(); + void dump_storage_devices_and_partitions() const; + OwnPtr try_to_initialize_partition_table(const StorageDevice&) const; RefPtr boot_block_device() const;