* Allow NULL name argument on initialization.
* Some code beautification on the way. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@22454 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
d6e565c76b
commit
aa4d8ee6ee
@ -980,11 +980,11 @@ status_t
|
|||||||
BPartition::ValidateInitialize(const char *diskSystem, char *name,
|
BPartition::ValidateInitialize(const char *diskSystem, char *name,
|
||||||
const char *parameters)
|
const char *parameters)
|
||||||
{
|
{
|
||||||
if (!fPartitionData || !_IsShadow() || !diskSystem || !name)
|
if (!fPartitionData || !_IsShadow() || !diskSystem)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
return _kern_validate_initialize_partition(_ShadowID(), _ChangeCounter(),
|
return _kern_validate_initialize_partition(_ShadowID(), _ChangeCounter(),
|
||||||
diskSystem, name, parameters,
|
diskSystem, name, parameters,
|
||||||
(parameters ? strlen(parameters)+1 : 0));
|
(parameters ? strlen(parameters) + 1 : 0));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Initialize
|
// Initialize
|
||||||
@ -992,11 +992,11 @@ status_t
|
|||||||
BPartition::Initialize(const char *diskSystem, const char *name,
|
BPartition::Initialize(const char *diskSystem, const char *name,
|
||||||
const char *parameters)
|
const char *parameters)
|
||||||
{
|
{
|
||||||
if (!fPartitionData || !_IsShadow() || !diskSystem || !name)
|
if (!fPartitionData || !_IsShadow() || !diskSystem)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
status_t error = _kern_initialize_partition(_ShadowID(), _ChangeCounter(),
|
status_t error = _kern_initialize_partition(_ShadowID(), _ChangeCounter(),
|
||||||
diskSystem, name, parameters,
|
diskSystem, name, parameters,
|
||||||
(parameters ? strlen(parameters)+1 : 0));
|
(parameters ? strlen(parameters) + 1 : 0));
|
||||||
if (error == B_OK)
|
if (error == B_OK)
|
||||||
error = Device()->Update();
|
error = Device()->Update();
|
||||||
return error;
|
return error;
|
||||||
|
@ -165,9 +165,9 @@ bool
|
|||||||
KFileSystem::ValidateInitialize(KPartition *partition, char *name,
|
KFileSystem::ValidateInitialize(KPartition *partition, char *name,
|
||||||
const char *parameters)
|
const char *parameters)
|
||||||
{
|
{
|
||||||
return (partition && name && fModule && fModule->validate_initialize
|
return (partition && fModule && fModule->validate_initialize
|
||||||
&& fModule->validate_initialize(partition->PartitionData(), name,
|
&& fModule->validate_initialize(partition->PartitionData(), name,
|
||||||
parameters));
|
parameters));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -314,7 +314,7 @@ bool
|
|||||||
KPartitioningSystem::ValidateInitialize(KPartition *partition, char *name,
|
KPartitioningSystem::ValidateInitialize(KPartition *partition, char *name,
|
||||||
const char *parameters)
|
const char *parameters)
|
||||||
{
|
{
|
||||||
return (partition && name && fModule && fModule->validate_initialize
|
return (partition && fModule && fModule->validate_initialize
|
||||||
&& fModule->validate_initialize(partition->PartitionData(), name,
|
&& fModule->validate_initialize(partition->PartitionData(), name,
|
||||||
parameters));
|
parameters));
|
||||||
}
|
}
|
||||||
@ -788,7 +788,7 @@ KPartitioningSystem::Initialize(KPartition *partition, const char *name,
|
|||||||
const char *parameters, KDiskDeviceJob *job)
|
const char *parameters, KDiskDeviceJob *job)
|
||||||
{
|
{
|
||||||
// check parameters
|
// check parameters
|
||||||
if (!partition || !job || !name /*|| !parameters*/)
|
if (!partition || !job /*|| !parameters*/)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
if (!fModule->initialize)
|
if (!fModule->initialize)
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
|
@ -401,20 +401,25 @@ BPrivate::DiskDevice::validate_initialize_partition(KPartition *partition,
|
|||||||
int32 changeCounter, const char *diskSystemName, char *name,
|
int32 changeCounter, const char *diskSystemName, char *name,
|
||||||
const char *parameters, bool requireShadow)
|
const char *parameters, bool requireShadow)
|
||||||
{
|
{
|
||||||
if (!partition || !diskSystemName || !name)
|
if (!partition || !diskSystemName)
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
|
|
||||||
// truncate name to maximal size
|
// truncate name to maximal size
|
||||||
name[B_OS_NAME_LENGTH] = '\0';
|
if (name)
|
||||||
|
name[B_OS_NAME_LENGTH] = '\0';
|
||||||
|
|
||||||
// check the partition
|
// check the partition
|
||||||
status_t error = check_partition(partition, changeCounter, requireShadow);
|
status_t error = check_partition(partition, changeCounter, requireShadow);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
// get the disk system
|
// get the disk system
|
||||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||||
KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
|
KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
|
||||||
if (!diskSystem)
|
if (!diskSystem)
|
||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
DiskSystemLoader loader(diskSystem, true);
|
DiskSystemLoader loader(diskSystem, true);
|
||||||
|
|
||||||
// get the info
|
// get the info
|
||||||
if (diskSystem->ValidateInitialize(partition, name, parameters))
|
if (diskSystem->ValidateInitialize(partition, name, parameters))
|
||||||
return B_OK;
|
return B_OK;
|
||||||
|
@ -1022,40 +1022,52 @@ _user_validate_initialize_partition(partition_id partitionID,
|
|||||||
int32 changeCounter, const char *_diskSystemName, char *_name,
|
int32 changeCounter, const char *_diskSystemName, char *_name,
|
||||||
const char *_parameters, size_t parametersSize)
|
const char *_parameters, size_t parametersSize)
|
||||||
{
|
{
|
||||||
if (!_diskSystemName || !_name
|
if (!_diskSystemName || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|
||||||
|| parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE) {
|
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
|
||||||
|
// copy disk system name
|
||||||
char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH];
|
char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH];
|
||||||
char name[B_DISK_DEVICE_NAME_LENGTH];
|
|
||||||
char *parameters = NULL;
|
|
||||||
status_t error = ddm_strlcpy(diskSystemName, _diskSystemName,
|
status_t error = ddm_strlcpy(diskSystemName, _diskSystemName,
|
||||||
B_DISK_SYSTEM_NAME_LENGTH);
|
B_DISK_SYSTEM_NAME_LENGTH);
|
||||||
if (!error)
|
|
||||||
|
// copy name
|
||||||
|
char name[B_DISK_DEVICE_NAME_LENGTH];
|
||||||
|
if (!error && _name)
|
||||||
error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH, true);
|
error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH, true);
|
||||||
if (error)
|
|
||||||
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
// copy parameters
|
||||||
|
char *parameters = NULL;
|
||||||
|
MemoryDeleter parameterDeleter;
|
||||||
if (_parameters) {
|
if (_parameters) {
|
||||||
parameters = static_cast<char*>(malloc(parametersSize));
|
parameters = static_cast<char*>(malloc(parametersSize));
|
||||||
if (parameters)
|
if (!parameters)
|
||||||
user_memcpy(parameters, _parameters, parametersSize);
|
|
||||||
else
|
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
parameterDeleter.SetTo(parameters);
|
||||||
|
|
||||||
|
if (user_memcpy(parameters, _parameters, parametersSize) != B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
||||||
// get the partition
|
// get the partition
|
||||||
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||||
KPartition *partition = manager->ReadLockPartition(partitionID);
|
KPartition *partition = manager->ReadLockPartition(partitionID);
|
||||||
error = partition ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND;
|
if (!partition)
|
||||||
if (!error) {
|
return B_ENTRY_NOT_FOUND;
|
||||||
PartitionRegistrar registrar1(partition, true);
|
|
||||||
PartitionRegistrar registrar2(partition->Device(), true);
|
// validate
|
||||||
DeviceReadLocker locker(partition->Device(), true);
|
PartitionRegistrar registrar1(partition, true);
|
||||||
error = validate_initialize_partition(partition, changeCounter,
|
PartitionRegistrar registrar2(partition->Device(), true);
|
||||||
diskSystemName, name, parameters);
|
DeviceReadLocker locker(partition->Device(), true);
|
||||||
}
|
error = validate_initialize_partition(partition, changeCounter,
|
||||||
if (!error)
|
diskSystemName, _name ? name : NULL, parameters);
|
||||||
|
|
||||||
|
// copy back the modified name
|
||||||
|
if (!error && _name)
|
||||||
error = ddm_strlcpy(_name, name, B_DISK_DEVICE_NAME_LENGTH);
|
error = ddm_strlcpy(_name, name, B_DISK_DEVICE_NAME_LENGTH);
|
||||||
free(parameters);
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1591,71 +1603,83 @@ _user_initialize_partition(partition_id partitionID, int32 changeCounter,
|
|||||||
const char *_diskSystemName, const char *_name, const char *_parameters,
|
const char *_diskSystemName, const char *_name, const char *_parameters,
|
||||||
size_t parametersSize)
|
size_t parametersSize)
|
||||||
{
|
{
|
||||||
if (!_diskSystemName || !_name
|
if (!_diskSystemName || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|
||||||
|| parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE) {
|
|
||||||
return B_BAD_VALUE;
|
return B_BAD_VALUE;
|
||||||
}
|
|
||||||
|
// copy disk system name
|
||||||
char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH];
|
char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH];
|
||||||
char name[B_DISK_DEVICE_NAME_LENGTH];
|
|
||||||
char *parameters = NULL;
|
|
||||||
status_t error = ddm_strlcpy(diskSystemName, _diskSystemName,
|
status_t error = ddm_strlcpy(diskSystemName, _diskSystemName,
|
||||||
B_DISK_SYSTEM_NAME_LENGTH);
|
B_DISK_SYSTEM_NAME_LENGTH);
|
||||||
if (!error)
|
|
||||||
|
// copy name
|
||||||
|
char name[B_DISK_DEVICE_NAME_LENGTH];
|
||||||
|
if (!error && _name)
|
||||||
error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH);
|
error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH);
|
||||||
|
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
// copy parameters
|
||||||
|
MemoryDeleter parameterDeleter;
|
||||||
|
char *parameters = NULL;
|
||||||
if (_parameters) {
|
if (_parameters) {
|
||||||
parameters = static_cast<char*>(malloc(parametersSize));
|
parameters = static_cast<char*>(malloc(parametersSize));
|
||||||
if (parameters)
|
if (!parameters)
|
||||||
user_memcpy(parameters, _parameters, parametersSize);
|
|
||||||
else
|
|
||||||
return B_NO_MEMORY;
|
return B_NO_MEMORY;
|
||||||
|
parameterDeleter.SetTo(parameters);
|
||||||
|
|
||||||
|
if (user_memcpy(parameters, _parameters, parametersSize) != B_OK)
|
||||||
|
return B_BAD_ADDRESS;
|
||||||
}
|
}
|
||||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
||||||
// get the partition
|
// get the partition
|
||||||
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||||
KPartition *partition = manager->WriteLockPartition(partitionID);
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
||||||
error = partition ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND;
|
if (!partition)
|
||||||
if (!error) {
|
return B_ENTRY_NOT_FOUND;
|
||||||
PartitionRegistrar registrar1(partition, true);
|
|
||||||
PartitionRegistrar registrar2(partition->Device(), true);
|
PartitionRegistrar registrar1(partition, true);
|
||||||
DeviceWriteLocker locker(partition->Device(), true);
|
PartitionRegistrar registrar2(partition->Device(), true);
|
||||||
// get the disk system
|
DeviceWriteLocker locker(partition->Device(), true);
|
||||||
KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
|
|
||||||
error = diskSystem ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND;
|
// get the disk system
|
||||||
if (!error) {
|
KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
|
||||||
DiskSystemLoader loader(diskSystem, true);
|
if (!diskSystem)
|
||||||
// check parameters
|
return B_ENTRY_NOT_FOUND;
|
||||||
char proposedName[B_DISK_DEVICE_NAME_LENGTH];
|
DiskSystemLoader loader(diskSystem, true);
|
||||||
strcpy(proposedName, name);
|
|
||||||
error = validate_initialize_partition(partition, changeCounter,
|
// check parameters
|
||||||
diskSystemName, proposedName, parameters);
|
char proposedName[B_DISK_DEVICE_NAME_LENGTH];
|
||||||
if (!error) {
|
if (_name)
|
||||||
error = !strcmp(name, proposedName) ? B_OK : B_BAD_VALUE;
|
strcpy(proposedName, name);
|
||||||
}
|
|
||||||
if (!error) {
|
error = validate_initialize_partition(partition, changeCounter,
|
||||||
// unitialize the partition's contents and set the new
|
diskSystemName, _name ? proposedName : NULL, parameters);
|
||||||
// parameters
|
if (error != B_OK)
|
||||||
error = partition->UninitializeContents(true);
|
return error;
|
||||||
}
|
if (_name && strcmp(name, proposedName) != 0)
|
||||||
if (!error) {
|
return B_BAD_VALUE;
|
||||||
partition->SetDiskSystem(diskSystem);
|
|
||||||
error = partition->SetContentName(name);
|
// unitialize the partition's contents and set the new
|
||||||
}
|
// parameters
|
||||||
if (!error) {
|
if ((error = partition->UninitializeContents(true)) != B_OK)
|
||||||
partition->Changed(B_PARTITION_CHANGED_CONTENT_NAME);
|
return error;
|
||||||
error = partition->SetContentParameters(parameters);
|
|
||||||
}
|
partition->SetDiskSystem(diskSystem);
|
||||||
if (!error) {
|
|
||||||
partition->Changed(B_PARTITION_CHANGED_CONTENT_PARAMETERS);
|
if ((error = partition->SetContentName(_name ? name : NULL)) != B_OK)
|
||||||
partition->Changed(B_PARTITION_CHANGED_INITIALIZATION);
|
return error;
|
||||||
// implicit content disk system changes
|
partition->Changed(B_PARTITION_CHANGED_CONTENT_NAME);
|
||||||
error = partition->DiskSystem()->ShadowPartitionChanged(
|
|
||||||
partition, B_PARTITION_INITIALIZE);
|
if ((error = partition->SetContentParameters(parameters)) != B_OK)
|
||||||
}
|
return error;
|
||||||
}
|
partition->Changed(B_PARTITION_CHANGED_CONTENT_PARAMETERS);
|
||||||
}
|
|
||||||
free(parameters);
|
partition->Changed(B_PARTITION_CHANGED_INITIALIZATION);
|
||||||
return error;
|
|
||||||
|
// implicit content disk system changes
|
||||||
|
return partition->DiskSystem()->ShadowPartitionChanged(
|
||||||
|
partition, B_PARTITION_INITIALIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user