* 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
This commit is contained in:
@@ -55,6 +55,7 @@ public:
|
|||||||
bool MediaChanged() const;
|
bool MediaChanged() const;
|
||||||
|
|
||||||
void UpdateMediaStatusIfNeeded();
|
void UpdateMediaStatusIfNeeded();
|
||||||
|
void UninitializeMedia();
|
||||||
|
|
||||||
status_t SetPath(const char *path);
|
status_t SetPath(const char *path);
|
||||||
// TODO: Remove this method or make it private. Once initialized the
|
// TODO: Remove this method or make it private. Once initialized the
|
||||||
@@ -82,6 +83,7 @@ protected:
|
|||||||
virtual status_t GetGeometry(device_geometry *geometry);
|
virtual status_t GetGeometry(device_geometry *geometry);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void _ResetGeometry();
|
||||||
void _InitPartitionData();
|
void _InitPartitionData();
|
||||||
|
|
||||||
disk_device_data fDeviceData;
|
disk_device_data fDeviceData;
|
||||||
|
|||||||
@@ -71,7 +71,8 @@ KDiskDevice::SetTo(const char *path)
|
|||||||
} else {
|
} else {
|
||||||
// no media: try to get the device geometry, but don't fail, if
|
// no media: try to get the device geometry, but don't fail, if
|
||||||
// we can't get it
|
// we can't get it
|
||||||
GetGeometry(&fDeviceData.geometry);
|
if (GetGeometry(&fDeviceData.geometry) != B_OK)
|
||||||
|
_ResetGeometry();
|
||||||
}
|
}
|
||||||
// set device flags
|
// set device flags
|
||||||
if (fDeviceData.geometry.removable)
|
if (fDeviceData.geometry.removable)
|
||||||
@@ -102,14 +103,7 @@ KDiskDevice::Unset()
|
|||||||
free(fDeviceData.path);
|
free(fDeviceData.path);
|
||||||
fDeviceData.path = NULL;
|
fDeviceData.path = NULL;
|
||||||
}
|
}
|
||||||
fDeviceData.geometry.bytes_per_sector = 0;
|
_ResetGeometry();
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// InitCheck
|
// InitCheck
|
||||||
@@ -248,6 +242,14 @@ KDiskDevice::UpdateMediaStatusIfNeeded()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
KDiskDevice::UninitializeMedia()
|
||||||
|
{
|
||||||
|
UninitializeContents();
|
||||||
|
_ResetGeometry();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// SetPath
|
// SetPath
|
||||||
status_t
|
status_t
|
||||||
KDiskDevice::SetPath(const char *path)
|
KDiskDevice::SetPath(const char *path)
|
||||||
@@ -383,3 +385,17 @@ KDiskDevice::_InitPartitionData()
|
|||||||
fPartitionData.flags |= B_PARTITION_IS_DEVICE;
|
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;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -531,6 +531,7 @@ KDiskDeviceManager::CreateFileDevice(const char *filePath, bool* newlyCreated)
|
|||||||
// scan device
|
// scan device
|
||||||
if (error == B_OK) {
|
if (error == B_OK) {
|
||||||
_ScanPartition(device, false);
|
_ScanPartition(device, false);
|
||||||
|
device->UnmarkBusy(true);
|
||||||
|
|
||||||
if (newlyCreated)
|
if (newlyCreated)
|
||||||
*newlyCreated = true;
|
*newlyCreated = true;
|
||||||
@@ -746,6 +747,7 @@ KDiskDeviceManager::InitialDeviceScan()
|
|||||||
if (DeviceWriteLocker deviceLocker = device) {
|
if (DeviceWriteLocker deviceLocker = device) {
|
||||||
if (ManagerLocker locker = this) {
|
if (ManagerLocker locker = this) {
|
||||||
error = _ScanPartition(device, false);
|
error = _ScanPartition(device, false);
|
||||||
|
device->UnmarkBusy(true);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
break;
|
break;
|
||||||
} else
|
} else
|
||||||
@@ -1034,18 +1036,7 @@ KDiskDeviceManager::_ScanPartition(KPartition *partition, bool async)
|
|||||||
|
|
||||||
// scan synchronously
|
// scan synchronously
|
||||||
|
|
||||||
if (!partition->Device()->HasMedia())
|
return _ScanPartition(partition);
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1055,6 +1046,8 @@ KDiskDeviceManager::_ScanPartition(KPartition *partition)
|
|||||||
// the partition's device must be write-locked
|
// the partition's device must be write-locked
|
||||||
if (!partition)
|
if (!partition)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
if (!partition->Device()->HasMedia())
|
||||||
|
return B_OK;
|
||||||
if (partition->DiskSystem() != NULL) {
|
if (partition->DiskSystem() != NULL) {
|
||||||
// TODO: this is more or less a hack to allow rescanning a partition
|
// TODO: this is more or less a hack to allow rescanning a partition
|
||||||
for (int32 i = 0; KPartition *child = partition->ChildAt(i); i++)
|
for (int32 i = 0; KPartition *child = partition->ChildAt(i); i++)
|
||||||
@@ -1151,7 +1144,7 @@ KDiskDeviceManager::_CheckMediaStatus()
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
device->MarkBusy(true);
|
device->MarkBusy(true);
|
||||||
device->UninitializeContents(true);
|
device->UninitializeMedia();
|
||||||
|
|
||||||
if (device->MediaChanged()) {
|
if (device->MediaChanged()) {
|
||||||
dprintf("Media changed from %s\n", device->Path());
|
dprintf("Media changed from %s\n", device->Path());
|
||||||
|
|||||||
Reference in New Issue
Block a user