Parcourir la source

Kernel/Storage: Restore booting from MBR partitions functionality

We had such functionality in the past, but it was regressed and now is
restored.
Liav A il y a 3 ans
Parent
commit
ed5a4f2938
2 fichiers modifiés avec 16 ajouts et 1 suppressions
  1. 1 1
      Kernel/Storage/StorageDevice.h
  2. 15 0
      Kernel/Storage/StorageManagement.cpp

+ 1 - 1
Kernel/Storage/StorageDevice.h

@@ -46,7 +46,7 @@ public:
     // FIXME: Remove this method after figuring out another scheme for naming.
     StringView early_storage_name() const;
 
-    NonnullRefPtrVector<DiskPartition> partitions() const { return m_partitions; }
+    NonnullRefPtrVector<DiskPartition> const& partitions() const { return m_partitions; }
 
     virtual CommandSet command_set() const = 0;
 

+ 15 - 0
Kernel/Storage/StorageManagement.cpp

@@ -128,6 +128,21 @@ UNMAP_AFTER_INIT void StorageManagement::determine_boot_device()
         for (auto& storage_device : m_storage_devices) {
             if (storage_device.early_storage_name() == storage_name) {
                 m_boot_block_device = storage_device;
+                break;
+            }
+            auto start_storage_name = storage_name.substring_view(0, min(storage_device.early_storage_name().length(), storage_name.length()));
+
+            if (storage_device.early_storage_name().starts_with(start_storage_name)) {
+                StringView partition_sign = storage_name.substring_view(start_storage_name.length());
+                auto possible_partition_number = partition_sign.to_uint<size_t>();
+                if (!possible_partition_number.has_value())
+                    break;
+                if (possible_partition_number.value() == 0)
+                    break;
+                if (storage_device.partitions().size() < possible_partition_number.value())
+                    break;
+                m_boot_block_device = storage_device.partitions()[possible_partition_number.value() - 1];
+                break;
             }
         }
     }