From 88ef41115466c4ee4900a270ebd5dcdd1be6f730 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Mon, 12 Nov 2007 23:20:33 +0000 Subject: [PATCH] * Added an UninitializeMedia() method to KDiskDevice that also resets the device geometry. * If SetTo() reports no media, and GetGeometry() fails, the device geometry is now reset as well. * KDiskDeviceManager::_ScanPartition() no longer unmarks the partition busy; this is now done by the caller, and done independently from the outcome of _ScanPartition(). This also fixes the problem that devices with no media were never marked unbusy (and thus were ignored subsequently). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22912 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../kernel/disk_device_manager/KDiskDevice.h | 2 ++ .../disk_device_manager/KDiskDevice.cpp | 34 ++++++++++++++----- .../KDiskDeviceManager.cpp | 19 ++++------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/headers/private/kernel/disk_device_manager/KDiskDevice.h b/headers/private/kernel/disk_device_manager/KDiskDevice.h index c0482ed4cc..1482222d46 100644 --- a/headers/private/kernel/disk_device_manager/KDiskDevice.h +++ b/headers/private/kernel/disk_device_manager/KDiskDevice.h @@ -55,6 +55,7 @@ public: bool MediaChanged() const; void UpdateMediaStatusIfNeeded(); + void UninitializeMedia(); status_t SetPath(const char *path); // TODO: Remove this method or make it private. Once initialized the @@ -82,6 +83,7 @@ protected: virtual status_t GetGeometry(device_geometry *geometry); private: + void _ResetGeometry(); void _InitPartitionData(); disk_device_data fDeviceData; diff --git a/src/system/kernel/disk_device_manager/KDiskDevice.cpp b/src/system/kernel/disk_device_manager/KDiskDevice.cpp index b0bc48ab03..3511acbdb2 100644 --- a/src/system/kernel/disk_device_manager/KDiskDevice.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDevice.cpp @@ -71,7 +71,8 @@ KDiskDevice::SetTo(const char *path) } else { // no media: try to get the device geometry, but don't fail, if // we can't get it - GetGeometry(&fDeviceData.geometry); + if (GetGeometry(&fDeviceData.geometry) != B_OK) + _ResetGeometry(); } // set device flags if (fDeviceData.geometry.removable) @@ -102,14 +103,7 @@ KDiskDevice::Unset() free(fDeviceData.path); fDeviceData.path = NULL; } - fDeviceData.geometry.bytes_per_sector = 0; - fDeviceData.geometry.sectors_per_track = 0; - fDeviceData.geometry.cylinder_count = 0; - fDeviceData.geometry.head_count = 0; - fDeviceData.geometry.device_type = B_DISK; - fDeviceData.geometry.removable = true; - fDeviceData.geometry.read_only = true; - fDeviceData.geometry.write_once = false; + _ResetGeometry(); } // InitCheck @@ -248,6 +242,14 @@ KDiskDevice::UpdateMediaStatusIfNeeded() } +void +KDiskDevice::UninitializeMedia() +{ + UninitializeContents(); + _ResetGeometry(); +} + + // SetPath status_t KDiskDevice::SetPath(const char *path) @@ -383,3 +385,17 @@ KDiskDevice::_InitPartitionData() fPartitionData.flags |= B_PARTITION_IS_DEVICE; } + +void +KDiskDevice::_ResetGeometry() +{ + fDeviceData.geometry.bytes_per_sector = 0; + fDeviceData.geometry.sectors_per_track = 0; + fDeviceData.geometry.cylinder_count = 0; + fDeviceData.geometry.head_count = 0; + fDeviceData.geometry.device_type = B_DISK; + fDeviceData.geometry.removable = true; + fDeviceData.geometry.read_only = true; + fDeviceData.geometry.write_once = false; +} + diff --git a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp index 45f8f9dc86..c16ba8bfd3 100644 --- a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp @@ -531,6 +531,7 @@ KDiskDeviceManager::CreateFileDevice(const char *filePath, bool* newlyCreated) // scan device if (error == B_OK) { _ScanPartition(device, false); + device->UnmarkBusy(true); if (newlyCreated) *newlyCreated = true; @@ -746,6 +747,7 @@ KDiskDeviceManager::InitialDeviceScan() if (DeviceWriteLocker deviceLocker = device) { if (ManagerLocker locker = this) { error = _ScanPartition(device, false); + device->UnmarkBusy(true); if (error != B_OK) break; } else @@ -1034,18 +1036,7 @@ KDiskDeviceManager::_ScanPartition(KPartition *partition, bool async) // scan synchronously - if (!partition->Device()->HasMedia()) - return B_OK; - - status_t error = _ScanPartition(partition); - - // mark all partitions un-busy -// TODO: This is not quite correct here. Partitions are created marked "busy", -// hence the one creating it should be responsible for clearing the flag, not -// us. - partition->UnmarkBusy(true); - - return error; + return _ScanPartition(partition); } @@ -1055,6 +1046,8 @@ KDiskDeviceManager::_ScanPartition(KPartition *partition) // the partition's device must be write-locked if (!partition) return B_BAD_VALUE; + if (!partition->Device()->HasMedia()) + return B_OK; if (partition->DiskSystem() != NULL) { // TODO: this is more or less a hack to allow rescanning a partition for (int32 i = 0; KPartition *child = partition->ChildAt(i); i++) @@ -1151,7 +1144,7 @@ KDiskDeviceManager::_CheckMediaStatus() continue; device->MarkBusy(true); - device->UninitializeContents(true); + device->UninitializeMedia(); if (device->MediaChanged()) { dprintf("Media changed from %s\n", device->Path());