From 598b8e19a209a9a4374673a8b625a0819129ceb7 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 9 Sep 2019 20:50:54 -0400 Subject: [PATCH] kernel/disk_device_manager: Continue scanning after invalid partitions. As the inline comment notes, just because we could not scan one partition does not mean we won't be able to scan the following ones. This fixes scanning for disks on certain systems following axeld's change in 7c2135591ba90958b5c8d92a2a5ef8a930c9ee28. Part of #15330. --- .../KDiskDeviceManager.cpp | 24 +++++++++++-------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp index 56d48c1fbc..c960d59bc5 100644 --- a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp @@ -986,31 +986,33 @@ KDiskDeviceManager::LoadNextDiskSystem(int32* cookie) status_t KDiskDeviceManager::InitialDeviceScan() { - status_t error = B_ERROR; - // scan for devices if (ManagerLocker locker = this) { - error = _Scan("/dev/disk"); + status_t error = _Scan("/dev/disk"); if (error != B_OK) return error; } // scan the devices for partitions int32 cookie = 0; + status_t status = B_OK; while (KDiskDevice* device = RegisterNextDevice(&cookie)) { PartitionRegistrar _(device, true); if (DeviceWriteLocker deviceLocker = device) { if (ManagerLocker locker = this) { - error = _ScanPartition(device, false); + status_t error = _ScanPartition(device, false); device->UnmarkBusy(true); if (error != B_OK) - break; + status = error; + // Even if we could not scan this partition, we want to try + // and scan the rest. Just because one partition is invalid + // or unscannable does not mean the ones after it are. } else return B_ERROR; } else return B_ERROR; } - return error; + return status; } @@ -1091,21 +1093,23 @@ KDiskDeviceManager::RescanDiskSystems() // rescan existing devices with the new disk systems int32 cookie = 0; + status_t status = B_OK; while (KDiskDevice* device = RegisterNextDevice(&cookie)) { PartitionRegistrar _(device, true); if (DeviceWriteLocker deviceLocker = device) { if (ManagerLocker locker = this) { - status_t status = _ScanPartition(device, false, &addedSystems); + status_t error = _ScanPartition(device, false, &addedSystems); device->UnmarkBusy(true); - if (status != B_OK) - break; + if (error != B_OK) + status = error; + // See comment in InitialDeviceScan(). } else return B_ERROR; } else return B_ERROR; } - return B_OK; + return status; }