From 8bc0bd912a7e7cc11571754577eae7fc7bf675cd Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 16 Jul 2003 21:01:14 +0000 Subject: [PATCH] Added and implemented the remaining disk system syscalls. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3997 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../ddm_userland_interface.h | 35 ++ .../ddm_userland_interface.cpp | 298 ++++++++++++++++++ 2 files changed, 333 insertions(+) diff --git a/headers/private/kernel/disk_device_manager/ddm_userland_interface.h b/headers/private/kernel/disk_device_manager/ddm_userland_interface.h index 9cabcbba4b..5d1d214018 100644 --- a/headers/private/kernel/disk_device_manager/ddm_userland_interface.h +++ b/headers/private/kernel/disk_device_manager/ddm_userland_interface.h @@ -128,6 +128,41 @@ bool _kern_supports_initializing_partition(disk_system_id diskSystemID, bool _kern_supports_initializing_child_partition(disk_system_id diskSystemID, partition_id partitionID, const char *childSystem); +bool _kern_is_sub_disk_system_for(disk_system_id diskSystemID, + partition_id partitionID); + +status_t _kern_validate_resize_partition(disk_system_id diskSystemID, + partition_id partitionID, + off_t *size); +status_t _kern_validate_resize_child_partition(disk_system_id diskSystemID, + partition_id partitionID, + off_t *size); +status_t _kern_validate_move_partition(disk_system_id diskSystemID, + partition_id partitionID, + off_t *offset); +status_t _kern_validate_move_child_partition(disk_system_id diskSystemID, + partition_id partitionID, + off_t *offset); +status_t _kern_validate_set_partition_name(disk_system_id diskSystemID, + partition_id partitionID, + char *name); +status_t _kern_validate_set_partition_content_name(disk_system_id diskSystemID, + partition_id partitionID, + char *name); +status_t _kern_validate_set_partition_type(disk_system_id diskSystemID, + partition_id partitionID, + const char *type); +status_t _kern_validate_create_child_partition(disk_system_id diskSystemID, + partition_id partitionID, + off_t *offset, off_t *size, + const char *type, + const char *parameters); +status_t _kern_get_next_supported_partition_type(disk_system_id diskSystemID, + partition_id partitionID, + int32 *cookie, char *type); +status_t _kern_get_partition_type_for_content_type(disk_system_id diskSystemID, + const char *contentType, + char *type); // disk device modification status_t _kern_prepare_disk_device_modifications(partition_id deviceID); diff --git a/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp b/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp index c57aabc2f2..189c3fbef6 100644 --- a/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp +++ b/src/kernel/core/disk_device_manager/ddm_userland_interface.cpp @@ -529,6 +529,304 @@ _kern_supports_initializing_child_partition(disk_system_id diskSystemID, return diskSystem->SupportsInitializingChild(partition, childSystem); } +// _kern_is_sub_disk_system_for +bool +_kern_is_sub_disk_system_for(disk_system_id diskSystemID, + partition_id partitionID) +{ + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return false; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return false; + // get the disk system + KDiskSystem *diskSystem = partition->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return false; + // get the info + return diskSystem->IsSubSystemFor(partition); +} + +// _kern_validate_resize_partition +status_t +_kern_validate_resize_partition(disk_system_id diskSystemID, + partition_id partitionID, off_t *size) +{ + if (!size) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + KDiskSystem *diskSystem = partition->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateResize(partition, size)) + return B_OK; + return B_ERROR; +} + +// _kern_validate_resize_child_partition +status_t +_kern_validate_resize_child_partition(disk_system_id diskSystemID, + partition_id partitionID, off_t *size) +{ + if (!size) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + if (!partition->Parent()) + return B_BAD_VALUE; + KDiskSystem *diskSystem = partition->Parent()->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateResizeChild(partition, size)) + return B_OK; + return B_ERROR; +} + +// _kern_validate_move_partition +status_t +_kern_validate_move_partition(disk_system_id diskSystemID, + partition_id partitionID, off_t *offset) +{ + if (!offset) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + KDiskSystem *diskSystem = partition->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateMove(partition, offset)) + return B_OK; + return B_ERROR; +} + +// _kern_validate_move_child_partition +status_t +_kern_validate_move_child_partition(disk_system_id diskSystemID, + partition_id partitionID, off_t *offset) +{ + if (!offset) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + if (!partition->Parent()) + return B_BAD_VALUE; + KDiskSystem *diskSystem = partition->Parent()->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateMoveChild(partition, offset)) + return B_OK; + return B_ERROR; +} + +// _kern_validate_set_partition_name +status_t +_kern_validate_set_partition_name(disk_system_id diskSystemID, + partition_id partitionID, char *name) +{ + if (!name) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + if (!partition->Parent()) + return B_BAD_VALUE; + KDiskSystem *diskSystem = partition->Parent()->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateSetName(partition, name)) + return B_OK; + return B_ERROR; +} + +// _kern_validate_set_partition_content_name +status_t +_kern_validate_set_partition_content_name(disk_system_id diskSystemID, + partition_id partitionID, char *name) +{ + if (!name) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + KDiskSystem *diskSystem = partition->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateSetContentName(partition, name)) + return B_OK; + return B_ERROR; +} + +// _kern_validate_set_partition_type +status_t +_kern_validate_set_partition_type(disk_system_id diskSystemID, + partition_id partitionID, const char *type) +{ + if (!type) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + if (!partition->Parent()) + return B_BAD_VALUE; + KDiskSystem *diskSystem = partition->Parent()->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateSetType(partition, type)) + return B_OK; + return B_ERROR; +} + +// _kern_validate_create_child_partition +status_t +_kern_validate_create_child_partition(disk_system_id diskSystemID, + partition_id partitionID, off_t *offset, + off_t *size, const char *type, + const char *parameters) +{ + if (!offset || !size || !type) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + KDiskSystem *diskSystem = partition->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->ValidateCreateChild(partition, offset, size, type, + parameters)) { + return B_OK; + } + return B_ERROR; +} + +// _kern_get_next_supported_partition_type +status_t +_kern_get_next_supported_partition_type(disk_system_id diskSystemID, + partition_id partitionID, + int32 *cookie, char *type) +{ + if (!cookie || !type) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the partition + KPartition *partition = manager->ReadLockPartition(partitionID); + if (!partition) + return B_ENTRY_NOT_FOUND; + PartitionRegistrar registrar1(partition, true); + PartitionRegistrar registrar2(partition->Device(), true); + DeviceReadLocker locker(partition->Device(), true); + if (!check_shadow_partition(partition)) + return B_BAD_VALUE; + // get the disk system + KDiskSystem *diskSystem = partition->DiskSystem(); + if (!diskSystem || diskSystem->ID() != diskSystemID) + return B_ENTRY_NOT_FOUND; + // get the info + if (diskSystem->GetNextSupportedType(partition, cookie, type)) + return B_OK; + return B_ERROR; +} + +// _kern_get_partition_type_for_content_type +status_t +_kern_get_partition_type_for_content_type(disk_system_id diskSystemID, + const char *contentType, char *type) +{ + if (!contentType || !type) + return B_BAD_VALUE; + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + // get the disk system + KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemID); + if (!diskSystem) + return false; + DiskSystemLoader loader(diskSystem, true); + // get the info + if (diskSystem->GetTypeForContentType(contentType, type)) + return B_OK; + return B_ERROR; +} + // _kern_prepare_disk_device_modifications status_t _kern_prepare_disk_device_modifications(partition_id deviceID)