* Cleanup.
* Corrected checking of parameters (name). * Gracefully deals with disk systems that rescan after initialization, now. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22448 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -8,6 +8,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include <KernelExport.h>
|
#include <KernelExport.h>
|
||||||
#include <DiskDeviceDefs.h>
|
#include <DiskDeviceDefs.h>
|
||||||
@@ -59,66 +60,79 @@ KInitializeJob::Do()
|
|||||||
DBG(OUT("KInitializeJob::Do(%ld)\n", PartitionID()));
|
DBG(OUT("KInitializeJob::Do(%ld)\n", PartitionID()));
|
||||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||||
KPartition *partition = manager->WriteLockPartition(PartitionID());
|
KPartition *partition = manager->WriteLockPartition(PartitionID());
|
||||||
if (partition) {
|
if (!partition) {
|
||||||
PartitionRegistrar registrar(partition, true);
|
|
||||||
PartitionRegistrar deviceRegistrar(partition->Device(), true);
|
|
||||||
|
|
||||||
DeviceWriteLocker locker(partition->Device(), true);
|
|
||||||
// basic checks
|
|
||||||
|
|
||||||
// if (!partition->ParentDiskSystem()) {
|
|
||||||
// SetErrorMessage("Partition has no parent disk system!");
|
|
||||||
// return B_BAD_VALUE;
|
|
||||||
// }
|
|
||||||
|
|
||||||
// all descendants should be marked busy/descendant busy
|
|
||||||
if (IsPartitionNotBusy(partition)) {
|
|
||||||
SetErrorMessage("Can't initialize non-busy partition!");
|
|
||||||
return B_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if (!fParameters) {
|
|
||||||
//no parameters for the operation
|
|
||||||
SetErrorMessage( "No parameters for partition initialization." );
|
|
||||||
return B_ERROR;
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// TODO shouldn't we load the disk system AFTER the validation?
|
|
||||||
KDiskSystem *diskSystemToInit = manager->LoadDiskSystem(fDiskSystemID);
|
|
||||||
if (!diskSystemToInit) {
|
|
||||||
SetErrorMessage("Given DiskSystemID doesn't correspond to any "
|
|
||||||
"known DiskSystem.");
|
|
||||||
return B_BAD_VALUE;
|
|
||||||
}
|
|
||||||
DiskSystemLoader loader2(diskSystemToInit);
|
|
||||||
|
|
||||||
// TODO: The parameters are already validated and should not be changed again!
|
|
||||||
status_t validationResult = validate_initialize_partition(partition,
|
|
||||||
partition->ChangeCounter(), diskSystemToInit->Name(), fName,
|
|
||||||
fParameters, false);
|
|
||||||
|
|
||||||
if (validationResult != B_OK) {
|
|
||||||
SetErrorMessage("Validation of initializing partition failed!");
|
|
||||||
return validationResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
// everything seems OK -> let's do the job
|
|
||||||
locker.Unlock();
|
|
||||||
|
|
||||||
status_t initResult = diskSystemToInit->Initialize(partition, fName,
|
|
||||||
fParameters, this);
|
|
||||||
|
|
||||||
if (initResult != B_OK) {
|
|
||||||
SetErrorMessage("Initialization of partition failed!");
|
|
||||||
return initResult;
|
|
||||||
}
|
|
||||||
|
|
||||||
partition->SetDiskSystem(diskSystemToInit);
|
|
||||||
|
|
||||||
return B_OK;
|
|
||||||
|
|
||||||
} else {
|
|
||||||
SetErrorMessage("Couldn't find partition.");
|
SetErrorMessage("Couldn't find partition.");
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PartitionRegistrar registrar(partition, true);
|
||||||
|
PartitionRegistrar deviceRegistrar(partition->Device(), true);
|
||||||
|
|
||||||
|
DeviceWriteLocker locker(partition->Device(), true);
|
||||||
|
|
||||||
|
// basic checks
|
||||||
|
|
||||||
|
// all descendants should be marked busy/descendant busy
|
||||||
|
if (IsPartitionNotBusy(partition)) {
|
||||||
|
SetErrorMessage("Can't initialize non-busy partition!");
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (partition->DiskSystem()) {
|
||||||
|
SetErrorMessage("Partition is already initialized.");
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the disk system
|
||||||
|
KDiskSystem *diskSystemToInit = manager->LoadDiskSystem(fDiskSystemID);
|
||||||
|
if (!diskSystemToInit) {
|
||||||
|
SetErrorMessage("Given DiskSystemID doesn't correspond to any "
|
||||||
|
"known DiskSystem.");
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
DiskSystemLoader loader(diskSystemToInit, true);
|
||||||
|
|
||||||
|
// check the parameters
|
||||||
|
char name[B_DISK_DEVICE_NAME_LENGTH];
|
||||||
|
if (fName)
|
||||||
|
strlcpy(name, fName, sizeof(name));
|
||||||
|
|
||||||
|
status_t error = validate_initialize_partition(partition,
|
||||||
|
partition->ChangeCounter(), diskSystemToInit->Name(),
|
||||||
|
fName ? name : NULL, fParameters, false);
|
||||||
|
|
||||||
|
if (error != B_OK) {
|
||||||
|
SetErrorMessage("Validation of initializing partition failed.");
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fName != NULL && strcmp(fName, name) != 0) {
|
||||||
|
SetErrorMessage("Requested name not valid.");
|
||||||
|
return B_BAD_VALUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
// everything seems OK -> let's do the job
|
||||||
|
locker.Unlock();
|
||||||
|
|
||||||
|
error = diskSystemToInit->Initialize(partition, fName, fParameters, this);
|
||||||
|
if (error != B_OK) {
|
||||||
|
SetErrorMessage("Initialization of partition failed!");
|
||||||
|
return error;
|
||||||
|
}
|
||||||
|
|
||||||
|
locker.Lock();
|
||||||
|
|
||||||
|
if (partition->DiskSystem()) {
|
||||||
|
// The disk system might have triggered a rescan after initializing, in
|
||||||
|
// which case the disk system is already set. Just check, if it is the
|
||||||
|
// right one.
|
||||||
|
if (partition->DiskSystem() != diskSystemToInit) {
|
||||||
|
SetErrorMessage("Partition has wrong disk system after "
|
||||||
|
"initialization.");
|
||||||
|
return B_ERROR;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
partition->SetDiskSystem(diskSystemToInit);
|
||||||
|
|
||||||
|
return B_OK;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user