diff --git a/headers/private/kernel/disk_device_manager/KDiskDevice.h b/headers/private/kernel/disk_device_manager/KDiskDevice.h index 1482222d46..fba729ef0f 100644 --- a/headers/private/kernel/disk_device_manager/KDiskDevice.h +++ b/headers/private/kernel/disk_device_manager/KDiskDevice.h @@ -57,6 +57,8 @@ public: void UpdateMediaStatusIfNeeded(); void UninitializeMedia(); + void UpdateGeometry(); + status_t SetPath(const char *path); // TODO: Remove this method or make it private. Once initialized the // path must not be changed. @@ -85,6 +87,7 @@ protected: private: void _ResetGeometry(); void _InitPartitionData(); + void _UpdateDeviceFlags(); disk_device_data fDeviceData; RWLocker fLocker; diff --git a/src/system/kernel/disk_device_manager/KDiskDevice.cpp b/src/system/kernel/disk_device_manager/KDiskDevice.cpp index 3511acbdb2..bd084f50f3 100644 --- a/src/system/kernel/disk_device_manager/KDiskDevice.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDevice.cpp @@ -74,15 +74,9 @@ KDiskDevice::SetTo(const char *path) if (GetGeometry(&fDeviceData.geometry) != B_OK) _ResetGeometry(); } + // set device flags - if (fDeviceData.geometry.removable) - SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_REMOVABLE); - if (fMediaStatus == B_OK) - SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_HAS_MEDIA); - if (fDeviceData.geometry.read_only) - SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_READ_ONLY); - if (fDeviceData.geometry.write_once) - SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_WRITE_ONCE); + _UpdateDeviceFlags(); // update partition data _InitPartitionData(); return B_OK; @@ -247,6 +241,19 @@ KDiskDevice::UninitializeMedia() { UninitializeContents(); _ResetGeometry(); + _UpdateDeviceFlags(); + _InitPartitionData(); +} + + +void +KDiskDevice::UpdateGeometry() +{ + if (GetGeometry(&fDeviceData.geometry) != B_OK) + return; + + _UpdateDeviceFlags(); + _InitPartitionData(); } @@ -399,3 +406,20 @@ KDiskDevice::_ResetGeometry() fDeviceData.geometry.write_once = false; } + +void +KDiskDevice::_UpdateDeviceFlags() +{ + if (fDeviceData.geometry.removable) + SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_REMOVABLE); + if (HasMedia()) + SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_HAS_MEDIA); + else + SetDeviceFlags(DeviceFlags() & ~B_DISK_DEVICE_HAS_MEDIA); + + if (fDeviceData.geometry.read_only) + SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_READ_ONLY); + if (fDeviceData.geometry.write_once) + SetDeviceFlags(DeviceFlags() | B_DISK_DEVICE_WRITE_ONCE); +} + diff --git a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp index c16ba8bfd3..8a2ac206b0 100644 --- a/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp +++ b/src/system/kernel/disk_device_manager/KDiskDeviceManager.cpp @@ -1148,6 +1148,7 @@ KDiskDeviceManager::_CheckMediaStatus() if (device->MediaChanged()) { dprintf("Media changed from %s\n", device->Path()); + device->UpdateGeometry(); _ScanPartition(device, false); } else if (!device->HasMedia() && hadMedia) { dprintf("Media removed from %s\n", device->Path());