From b0814f61c3dc8f0aa67ae44b200d722a7701e7d1 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 29 Sep 2003 21:44:21 +0000 Subject: [PATCH] Implemented Resize() and ResizeChild(). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4869 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../KPartitioningSystem.cpp | 69 ++++++++++++++++--- 1 file changed, 61 insertions(+), 8 deletions(-) diff --git a/src/kernel/core/disk_device_manager/KPartitioningSystem.cpp b/src/kernel/core/disk_device_manager/KPartitioningSystem.cpp index 0003d26742..045bcef052 100644 --- a/src/kernel/core/disk_device_manager/KPartitioningSystem.cpp +++ b/src/kernel/core/disk_device_manager/KPartitioningSystem.cpp @@ -4,10 +4,13 @@ #include #include -#include "ddm_modules.h" -#include "KDiskDeviceUtils.h" -#include "KPartition.h" -#include "KPartitioningSystem.h" +#include +#include +#include +#include +#include +#include +#include // constructor KPartitioningSystem::KPartitioningSystem(const char *name) @@ -489,8 +492,32 @@ status_t KPartitioningSystem::Resize(KPartition *partition, off_t size, KDiskDeviceJob *job) { - // to be implemented - return B_ERROR; + // check parameters + if (!partition || !job || size < 0) + return B_BAD_VALUE; + if (!fModule->resize) + return B_ENTRY_NOT_FOUND; + // lock partition and open partition device + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + KPartition *_partition = manager->ReadLockPartition(partition->ID()); + if (!_partition) + return B_ERROR; + int fd = -1; + { + PartitionRegistrar registrar(_partition, true); + PartitionRegistrar deviceRegistrar(_partition->Device(), true); + DeviceReadLocker locker(_partition->Device(), true); + if (partition != _partition) + return B_ERROR; + status_t result = partition->Open(O_RDONLY, &fd); + if (result != B_OK) + return result; + } + // let the module do its job + status_t result = fModule->resize(fd, partition->ID(), size, job->ID()); + // cleanup and return + close(fd); + return result; } // ResizeChild @@ -498,8 +525,34 @@ status_t KPartitioningSystem::ResizeChild(KPartition *child, off_t size, KDiskDeviceJob *job) { - // to be implemented - return B_ERROR; + // check parameters + if (!child || !job || size < 0) + return B_BAD_VALUE; + if (!fModule->resize_child) + return B_ENTRY_NOT_FOUND; + // lock partition and open (parent) partition device + KDiskDeviceManager *manager = KDiskDeviceManager::Default(); + KPartition *_partition = manager->ReadLockPartition(child->ID()); + if (!_partition) + return B_ERROR; + int fd = -1; + { + PartitionRegistrar registrar(_partition, true); + PartitionRegistrar deviceRegistrar(_partition->Device(), true); + DeviceReadLocker locker(_partition->Device(), true); + if (child != _partition) + return B_ERROR; + if (!child->Parent()) + return B_BAD_VALUE; + status_t result = child->Parent()->Open(O_RDONLY, &fd); + if (result != B_OK) + return result; + } + // let the module do its job + status_t result = fModule->resize_child(fd, child->ID(), size, job->ID()); + // cleanup and return + close(fd); + return result; } // Move