2007-10-06 02:39:52 +04:00
|
|
|
/** \file ddm_userland_interface.cpp
|
2007-07-27 16:12:35 +04:00
|
|
|
*
|
|
|
|
* \brief Interface for userspace calls.
|
|
|
|
*/
|
2003-07-07 02:56:39 +04:00
|
|
|
|
2003-09-28 19:16:42 +04:00
|
|
|
#include <stdlib.h>
|
|
|
|
|
|
|
|
#include <AutoDeleter.h>
|
2003-07-30 21:48:08 +04:00
|
|
|
#include <ddm_userland_interface.h>
|
2003-07-07 02:56:39 +04:00
|
|
|
#include <KDiskDevice.h>
|
|
|
|
#include <KDiskDeviceManager.h>
|
|
|
|
#include <KDiskDeviceUtils.h>
|
2003-07-09 03:23:27 +04:00
|
|
|
#include <KDiskSystem.h>
|
2003-07-25 02:58:06 +04:00
|
|
|
#include <KFileDiskDevice.h>
|
2003-09-28 19:16:42 +04:00
|
|
|
#include <syscall_args.h>
|
2003-07-07 02:56:39 +04:00
|
|
|
|
|
|
|
#include "UserDataWriter.h"
|
|
|
|
|
2003-09-30 01:40:36 +04:00
|
|
|
using namespace BPrivate::DiskDevice;
|
|
|
|
|
2003-09-28 19:16:42 +04:00
|
|
|
// debugging
|
|
|
|
#define ERROR(x)
|
|
|
|
|
2007-10-07 19:39:35 +04:00
|
|
|
|
|
|
|
// TODO: Add user address checks and check return values of user_memcpy()!
|
|
|
|
|
|
|
|
|
2003-10-25 03:09:43 +04:00
|
|
|
// ddm_strlcpy
|
|
|
|
/*! \brief Wrapper around user_strlcpy() that returns a status_t
|
|
|
|
indicating appropriate success or failure.
|
2003-10-25 12:35:27 +04:00
|
|
|
|
|
|
|
\param allowTruncation If \c true, does not return an error if
|
|
|
|
\a from is longer than \to. If \c false, returns \c B_NAME_TOO_LONG
|
|
|
|
if \a from is longer than \to.
|
2003-10-25 03:09:43 +04:00
|
|
|
*/
|
2007-10-06 02:39:52 +04:00
|
|
|
static status_t
|
|
|
|
ddm_strlcpy(char *to, const char *from, size_t size,
|
|
|
|
bool allowTruncation = false)
|
|
|
|
{
|
|
|
|
ssize_t fromLen = user_strlcpy(to, from, size);
|
|
|
|
if (fromLen < 0)
|
|
|
|
return fromLen;
|
|
|
|
if ((size_t)fromLen >= size && !allowTruncation)
|
|
|
|
return B_NAME_TOO_LONG;
|
|
|
|
return B_OK;
|
2003-10-25 03:09:43 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2007-11-02 01:41:22 +03:00
|
|
|
#if 0
|
2003-07-25 02:58:06 +04:00
|
|
|
// move_descendants
|
2007-10-06 02:39:52 +04:00
|
|
|
static void
|
2003-07-25 02:58:06 +04:00
|
|
|
move_descendants(KPartition *partition, off_t moveBy)
|
|
|
|
{
|
|
|
|
if (!partition)
|
|
|
|
return;
|
|
|
|
partition->SetOffset(partition->Offset() + moveBy);
|
|
|
|
// move children
|
|
|
|
for (int32 i = 0; KPartition *child = partition->ChildAt(i); i++)
|
|
|
|
move_descendants(child, moveBy);
|
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2003-07-25 02:58:06 +04:00
|
|
|
// move_descendants_contents
|
2007-10-06 02:39:52 +04:00
|
|
|
static status_t
|
2003-07-25 02:58:06 +04:00
|
|
|
move_descendants_contents(KPartition *partition)
|
|
|
|
{
|
|
|
|
if (!partition)
|
|
|
|
return B_BAD_VALUE;
|
|
|
|
// implicit content disk system changes
|
|
|
|
KDiskSystem *diskSystem = partition->DiskSystem();
|
|
|
|
if (diskSystem || partition->AlgorithmData()) {
|
|
|
|
status_t error = diskSystem->ShadowPartitionChanged(partition,
|
2007-10-07 19:39:35 +04:00
|
|
|
NULL, B_PARTITION_MOVE);
|
2003-07-25 02:58:06 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
// move children's contents
|
|
|
|
for (int32 i = 0; KPartition *child = partition->ChildAt(i); i++) {
|
|
|
|
status_t error = move_descendants_contents(child);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
return B_OK;
|
|
|
|
}
|
2007-11-02 01:41:22 +03:00
|
|
|
#endif // 0
|
2003-07-25 02:58:06 +04:00
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_get_next_disk_device_id
|
2003-07-07 02:56:39 +04:00
|
|
|
partition_id
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_get_next_disk_device_id(int32 *_cookie, size_t *neededSize)
|
2003-07-07 02:56:39 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (!_cookie)
|
2003-07-07 02:56:39 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-24 13:37:20 +04:00
|
|
|
int32 cookie;
|
|
|
|
user_memcpy(&cookie, _cookie, sizeof(cookie));
|
2003-09-27 09:19:37 +04:00
|
|
|
|
2003-07-15 05:27:43 +04:00
|
|
|
partition_id id = B_ENTRY_NOT_FOUND;
|
2003-07-07 02:56:39 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
2003-07-15 05:27:43 +04:00
|
|
|
// get the next device
|
2003-09-27 09:19:37 +04:00
|
|
|
if (KDiskDevice *device = manager->RegisterNextDevice(&cookie)) {
|
2003-07-07 02:56:39 +04:00
|
|
|
PartitionRegistrar _(device, true);
|
|
|
|
id = device->ID();
|
|
|
|
if (neededSize) {
|
|
|
|
if (DeviceReadLocker locker = device) {
|
2003-07-15 05:27:43 +04:00
|
|
|
// get the needed size
|
|
|
|
UserDataWriter writer;
|
2007-11-02 02:36:21 +03:00
|
|
|
device->WriteUserData(writer);
|
2003-07-15 05:27:43 +04:00
|
|
|
*neededSize = writer.AllocatedSize();
|
2003-09-27 09:19:37 +04:00
|
|
|
} else {
|
|
|
|
id = B_ERROR;
|
|
|
|
}
|
2003-07-15 05:27:43 +04:00
|
|
|
}
|
|
|
|
}
|
2003-10-24 13:37:20 +04:00
|
|
|
user_memcpy(_cookie, &cookie, sizeof(cookie));
|
2003-07-15 05:27:43 +04:00
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_find_disk_device
|
2003-07-15 05:27:43 +04:00
|
|
|
partition_id
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_find_disk_device(const char *_filename, size_t *neededSize)
|
2003-07-15 05:27:43 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (!_filename)
|
2003-07-15 05:27:43 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-09-27 09:19:37 +04:00
|
|
|
|
2003-10-25 03:09:43 +04:00
|
|
|
char filename[B_PATH_NAME_LENGTH];
|
|
|
|
status_t error = ddm_strlcpy(filename, _filename, B_PATH_NAME_LENGTH);
|
|
|
|
if (error)
|
|
|
|
return error;
|
|
|
|
|
2003-07-15 05:27:43 +04:00
|
|
|
partition_id id = B_ENTRY_NOT_FOUND;
|
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// find the device
|
|
|
|
if (KDiskDevice *device = manager->RegisterDevice(filename)) {
|
|
|
|
PartitionRegistrar _(device, true);
|
|
|
|
id = device->ID();
|
|
|
|
if (neededSize) {
|
|
|
|
if (DeviceReadLocker locker = device) {
|
|
|
|
// get the needed size
|
|
|
|
UserDataWriter writer;
|
2007-11-02 02:36:21 +03:00
|
|
|
device->WriteUserData(writer);
|
2003-07-15 05:27:43 +04:00
|
|
|
*neededSize = writer.AllocatedSize();
|
|
|
|
} else
|
|
|
|
return B_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_find_partition
|
2003-07-15 05:27:43 +04:00
|
|
|
partition_id
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_find_partition(const char *_filename, size_t *neededSize)
|
2003-07-15 05:27:43 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (!_filename)
|
2003-07-15 05:27:43 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-09-27 09:19:37 +04:00
|
|
|
|
2003-10-25 03:09:43 +04:00
|
|
|
char filename[B_PATH_NAME_LENGTH];
|
|
|
|
status_t error = ddm_strlcpy(filename, _filename, B_PATH_NAME_LENGTH);
|
|
|
|
if (error)
|
|
|
|
return error;
|
2003-09-27 09:19:37 +04:00
|
|
|
|
2003-07-15 05:27:43 +04:00
|
|
|
partition_id id = B_ENTRY_NOT_FOUND;
|
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// find the partition
|
|
|
|
if (KPartition *partition = manager->RegisterPartition(filename)) {
|
|
|
|
PartitionRegistrar _(partition, true);
|
|
|
|
id = partition->ID();
|
|
|
|
if (neededSize) {
|
|
|
|
// get and lock the partition's device
|
|
|
|
KDiskDevice *device = manager->RegisterDevice(partition->ID());
|
|
|
|
if (!device)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar _2(device, true);
|
|
|
|
if (DeviceReadLocker locker = device) {
|
|
|
|
// get the needed size
|
2003-07-07 02:56:39 +04:00
|
|
|
UserDataWriter writer;
|
2007-11-02 02:36:21 +03:00
|
|
|
device->WriteUserData(writer);
|
2003-07-07 02:56:39 +04:00
|
|
|
*neededSize = writer.AllocatedSize();
|
|
|
|
} else
|
|
|
|
return B_ERROR;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return id;
|
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_get_disk_device_data
|
2003-09-28 19:16:42 +04:00
|
|
|
/*! \brief Writes data describing the disk device identified by ID and all
|
|
|
|
its partitions into the supplied buffer.
|
|
|
|
|
|
|
|
The function passes the buffer size required to hold the data back
|
|
|
|
through the \a _neededSize parameter, if the device could be found at
|
|
|
|
least and no serious error occured. If fails with \c B_BUFFER_OVERFLOW,
|
|
|
|
if the supplied buffer is too small or a \c NULL buffer is supplied
|
|
|
|
(and \c bufferSize is 0).
|
|
|
|
|
|
|
|
The device is identified by \a id. If \a deviceOnly is \c true, then
|
|
|
|
it must be the ID of a disk device, otherwise the disk device is
|
|
|
|
chosen, on which the partition \a id refers to resides.
|
|
|
|
|
|
|
|
\param id The ID of an arbitrary partition on the disk device (including
|
|
|
|
the disk device itself), whose data shall be returned
|
|
|
|
(if \a deviceOnly is \c false), or the ID of the disk device
|
|
|
|
itself (if \a deviceOnly is true).
|
|
|
|
\param deviceOnly Specifies whether only IDs of disk devices (\c true),
|
|
|
|
or also IDs of partitions (\c false) are accepted for \a id.
|
|
|
|
\param buffer The buffer into which the disk device data shall be written.
|
|
|
|
May be \c NULL.
|
|
|
|
\param bufferSize The size of \a buffer.
|
|
|
|
\param _neededSize Pointer to a variable into which the actually needed
|
|
|
|
buffer size is written. May be \c NULL.
|
|
|
|
\return
|
|
|
|
- \c B_OK: Everything went fine. The device was found and, if not \c NULL,
|
|
|
|
in \a _neededSize the actually needed buffer size is returned. And
|
|
|
|
\a buffer will contain the disk device data.
|
|
|
|
- \c B_BAD_VALUE: \c NULL \a buffer, but not 0 \a bufferSize.
|
|
|
|
- \c B_BUFFER_OVERFLOW: The supplied buffer was too small. \a _neededSize,
|
|
|
|
if not \c NULL, will contain the required buffer size.
|
|
|
|
- \c B_NO_MEMORY: Insufficient memory to complete the operation.
|
|
|
|
- \c B_ENTRY_NOT_FOUND: \a id is no valid disk device ID (if \a deviceOnly
|
|
|
|
is \c true) or not even a valid partition ID (if \a deviceOnly is
|
|
|
|
\c false).
|
|
|
|
- \c B_ERROR: An unexpected error occured.
|
|
|
|
- another error code...
|
|
|
|
*/
|
2003-07-07 02:56:39 +04:00
|
|
|
status_t
|
2007-11-02 02:36:21 +03:00
|
|
|
_user_get_disk_device_data(partition_id id, bool deviceOnly,
|
2007-10-06 02:39:52 +04:00
|
|
|
user_disk_device_data *buffer, size_t bufferSize, size_t *_neededSize)
|
2003-07-07 02:56:39 +04:00
|
|
|
{
|
2003-09-28 19:16:42 +04:00
|
|
|
if (!buffer && bufferSize > 0)
|
2003-07-07 02:56:39 +04:00
|
|
|
return B_BAD_VALUE;
|
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
2003-07-15 05:27:43 +04:00
|
|
|
// get the device
|
|
|
|
if (KDiskDevice *device = manager->RegisterDevice(id, deviceOnly)) {
|
2003-07-07 02:56:39 +04:00
|
|
|
PartitionRegistrar _(device, true);
|
|
|
|
if (DeviceReadLocker locker = device) {
|
2003-09-28 19:16:42 +04:00
|
|
|
// do a dry run first to get the needed size
|
|
|
|
UserDataWriter writer;
|
2007-11-02 02:36:21 +03:00
|
|
|
device->WriteUserData(writer);
|
2003-09-28 19:16:42 +04:00
|
|
|
size_t neededSize = writer.AllocatedSize();
|
|
|
|
if (_neededSize) {
|
|
|
|
status_t error = copy_ref_var_to_user(neededSize, _neededSize);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
}
|
|
|
|
// if no buffer has been supplied or the buffer is too small,
|
|
|
|
// then we're done
|
|
|
|
if (!buffer || bufferSize < neededSize)
|
|
|
|
return B_BUFFER_OVERFLOW;
|
|
|
|
// otherwise allocate a kernel buffer
|
|
|
|
user_disk_device_data *kernelBuffer
|
|
|
|
= static_cast<user_disk_device_data*>(malloc(neededSize));
|
|
|
|
if (!kernelBuffer)
|
|
|
|
return B_NO_MEMORY;
|
|
|
|
MemoryDeleter deleter(kernelBuffer);
|
2003-07-15 05:27:43 +04:00
|
|
|
// write the device data into the buffer
|
2003-09-28 19:16:42 +04:00
|
|
|
writer.SetTo(kernelBuffer, bufferSize);
|
2007-11-02 02:36:21 +03:00
|
|
|
device->WriteUserData(writer);
|
2003-09-28 19:16:42 +04:00
|
|
|
// sanity check
|
|
|
|
if (writer.AllocatedSize() != neededSize) {
|
|
|
|
ERROR(("Size of written disk device user data changed from "
|
|
|
|
"%lu to %lu while device was locked!\n"));
|
|
|
|
return B_ERROR;
|
|
|
|
}
|
|
|
|
// relocate
|
|
|
|
status_t error = writer.Relocate(buffer);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
// copy out
|
|
|
|
if (buffer)
|
|
|
|
return user_memcpy(buffer, kernelBuffer, neededSize);
|
|
|
|
} else
|
|
|
|
return B_ERROR;
|
2003-07-07 02:56:39 +04:00
|
|
|
}
|
2003-09-28 19:16:42 +04:00
|
|
|
return B_ENTRY_NOT_FOUND;
|
2003-07-15 05:27:43 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_register_file_device
|
2003-07-15 05:27:43 +04:00
|
|
|
partition_id
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_register_file_device(const char *_filename)
|
2003-07-15 05:27:43 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (!_filename)
|
2003-07-15 05:27:43 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-09-27 09:19:37 +04:00
|
|
|
char filename[B_PATH_NAME_LENGTH];
|
2003-10-25 03:09:43 +04:00
|
|
|
status_t error = ddm_strlcpy(filename, _filename, B_PATH_NAME_LENGTH);
|
|
|
|
if (error)
|
|
|
|
return error;
|
2003-07-15 05:27:43 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
if (ManagerLocker locker = manager) {
|
|
|
|
if (KFileDiskDevice *device = manager->FindFileDevice(filename))
|
|
|
|
return device->ID();
|
|
|
|
return manager->CreateFileDevice(filename);
|
|
|
|
}
|
2003-07-07 02:56:39 +04:00
|
|
|
return B_ERROR;
|
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_unregister_file_device
|
2003-07-15 05:27:43 +04:00
|
|
|
status_t
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_unregister_file_device(partition_id deviceID, const char *_filename)
|
2003-07-15 05:27:43 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (deviceID < 0 && !_filename)
|
|
|
|
return B_BAD_VALUE;
|
2003-07-15 05:27:43 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
2003-09-27 09:19:37 +04:00
|
|
|
if (deviceID >= 0) {
|
2003-07-15 05:27:43 +04:00
|
|
|
return manager->DeleteFileDevice(deviceID);
|
2003-09-27 09:19:37 +04:00
|
|
|
} else {
|
|
|
|
char filename[B_PATH_NAME_LENGTH];
|
2003-10-25 03:09:43 +04:00
|
|
|
status_t error = ddm_strlcpy(filename, _filename, B_PATH_NAME_LENGTH);
|
|
|
|
if (error)
|
|
|
|
return error;
|
2003-09-27 09:19:37 +04:00
|
|
|
return manager->DeleteFileDevice(filename);
|
|
|
|
}
|
2003-07-15 05:27:43 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_get_disk_system_info
|
2003-07-09 03:23:27 +04:00
|
|
|
status_t
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_get_disk_system_info(disk_system_id id, user_disk_system_info *_info)
|
2003-07-09 03:23:27 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (!_info)
|
2003-07-09 03:23:27 +04:00
|
|
|
return B_BAD_VALUE;
|
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
if (ManagerLocker locker = manager) {
|
|
|
|
if (KDiskSystem *diskSystem = manager->FindDiskSystem(id)) {
|
2003-09-27 09:19:37 +04:00
|
|
|
user_disk_system_info info;
|
|
|
|
diskSystem->GetInfo(&info);
|
|
|
|
user_memcpy(_info, &info, sizeof(info));
|
2003-07-09 03:23:27 +04:00
|
|
|
return B_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_get_next_disk_system_info
|
2003-07-09 03:23:27 +04:00
|
|
|
status_t
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_get_next_disk_system_info(int32 *_cookie, user_disk_system_info *_info)
|
2003-07-09 03:23:27 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (!_cookie || !_info)
|
2003-07-09 03:23:27 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-24 13:37:20 +04:00
|
|
|
int32 cookie;
|
|
|
|
user_memcpy(&cookie, _cookie, sizeof(cookie));
|
2003-09-27 09:19:37 +04:00
|
|
|
status_t result = B_ENTRY_NOT_FOUND;
|
2003-07-09 03:23:27 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
if (ManagerLocker locker = manager) {
|
2003-09-27 09:19:37 +04:00
|
|
|
if (KDiskSystem *diskSystem = manager->NextDiskSystem(&cookie)) {
|
|
|
|
user_disk_system_info info;
|
|
|
|
diskSystem->GetInfo(&info);
|
|
|
|
user_memcpy(_info, &info, sizeof(info));
|
|
|
|
result = B_OK;
|
2003-07-09 03:23:27 +04:00
|
|
|
}
|
|
|
|
}
|
2003-10-24 13:37:20 +04:00
|
|
|
user_memcpy(_cookie, &cookie, sizeof(cookie));
|
2003-09-27 09:19:37 +04:00
|
|
|
return result;
|
2003-07-09 03:23:27 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_find_disk_system
|
2003-07-09 03:23:27 +04:00
|
|
|
status_t
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_find_disk_system(const char *_name, user_disk_system_info *_info)
|
2003-07-09 03:23:27 +04:00
|
|
|
{
|
2003-09-27 09:19:37 +04:00
|
|
|
if (!_name || !_info)
|
2003-07-09 03:23:27 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-28 03:13:11 +03:00
|
|
|
char name[B_DISK_SYSTEM_NAME_LENGTH];
|
|
|
|
status_t error = ddm_strlcpy(name, _name, B_DISK_SYSTEM_NAME_LENGTH);
|
2003-10-25 03:09:43 +04:00
|
|
|
if (error)
|
|
|
|
return error;
|
2003-07-09 03:23:27 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
if (ManagerLocker locker = manager) {
|
|
|
|
if (KDiskSystem *diskSystem = manager->FindDiskSystem(name)) {
|
2003-09-27 09:19:37 +04:00
|
|
|
user_disk_system_info info;
|
|
|
|
diskSystem->GetInfo(&info);
|
|
|
|
user_memcpy(_info, &info, sizeof(info));
|
2003-07-09 03:23:27 +04:00
|
|
|
return B_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_defragment_partition
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_defragment_partition(partition_id partitionID, int32* changeCounter)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check whether the disk system supports defragmenting
|
|
|
|
status_t error = validate_defragment_partition(partition, changeCounter);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
// set the defragmenting flag
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_DEFRAGMENTATION);
|
|
|
|
return B_OK;
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_repair_partition
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_repair_partition(partition_id partitionID, int32* changeCounter,
|
2007-10-06 02:39:52 +04:00
|
|
|
bool checkOnly)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check whether the disk system supports defragmenting
|
|
|
|
status_t error = validate_repair_partition(partition, changeCounter,
|
2007-10-06 02:39:52 +04:00
|
|
|
checkOnly);
|
2003-07-25 02:58:06 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
// set the respective flag
|
|
|
|
if (checkOnly)
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_CHECK);
|
|
|
|
else
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_REPAIR);
|
|
|
|
return B_OK;
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_resize_partition
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_resize_partition(partition_id partitionID, int32* changeCounter,
|
|
|
|
partition_id childID, int32* childChangeCounter, off_t size,
|
|
|
|
off_t contentSize)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-07-22 04:11:03 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check the size
|
|
|
|
if (size == partition->Size())
|
|
|
|
return B_OK;
|
|
|
|
off_t proposedSize = size;
|
2003-09-30 01:40:36 +04:00
|
|
|
off_t contentSize = 0;
|
2003-07-22 04:11:03 +04:00
|
|
|
status_t error = validate_resize_partition(partition, changeCounter,
|
2007-10-06 02:39:52 +04:00
|
|
|
&proposedSize, &contentSize);
|
2003-07-22 04:11:03 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
if (proposedSize != size)
|
|
|
|
return B_BAD_VALUE;
|
|
|
|
// new size is fine -- resize the thing
|
|
|
|
partition->SetSize(size);
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_SIZE);
|
2003-07-25 02:58:06 +04:00
|
|
|
// implicit partitioning system changes
|
|
|
|
error = partition->Parent()->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition->Parent(), partition, B_PARTITION_RESIZE_CHILD);
|
2003-07-25 02:58:06 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
2003-09-22 01:26:12 +04:00
|
|
|
// implicit content disk system changes
|
|
|
|
if (partition->DiskSystem()) {
|
2003-07-25 02:58:06 +04:00
|
|
|
error = partition->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition, NULL, B_PARTITION_RESIZE);
|
2003-07-22 04:11:03 +04:00
|
|
|
}
|
2003-07-25 02:58:06 +04:00
|
|
|
return error;
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_move_partition
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_move_partition(partition_id partitionID, int32* changeCounter,
|
|
|
|
partition_id childID, int32* childChangeCounter, off_t newOffset,
|
|
|
|
partition_id* descendantIDs, int32* descendantChangeCounters,
|
|
|
|
int32 descendantCount)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check the new offset
|
|
|
|
if (newOffset == partition->Offset())
|
|
|
|
return B_OK;
|
|
|
|
off_t proposedOffset = newOffset;
|
|
|
|
status_t error = validate_move_partition(partition, changeCounter,
|
2007-10-06 02:39:52 +04:00
|
|
|
&proposedOffset, true);
|
2003-07-25 02:58:06 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
if (proposedOffset != newOffset)
|
|
|
|
return B_BAD_VALUE;
|
|
|
|
// new offset is fine -- move the thing
|
|
|
|
off_t moveBy = newOffset - partition->Offset();
|
|
|
|
move_descendants(partition, moveBy);
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_OFFSET);
|
|
|
|
// implicit partitioning system changes
|
|
|
|
error = partition->Parent()->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition->Parent(), partition, B_PARTITION_MOVE_CHILD);
|
2003-07-25 02:58:06 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
// implicit descendants' content disk system changes
|
|
|
|
return move_descendants_contents(partition);
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_set_partition_name
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_set_partition_name(partition_id partitionID, int32* changeCounter,
|
|
|
|
partition_id childID, int32* childChangeCounter, const char* name)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-10-24 13:37:20 +04:00
|
|
|
if (!_name)
|
2003-07-25 02:58:06 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-28 03:13:11 +03:00
|
|
|
char name[B_DISK_DEVICE_NAME_LENGTH];
|
|
|
|
status_t error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH);
|
2003-10-25 03:09:43 +04:00
|
|
|
if (error)
|
|
|
|
return error;
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check name
|
2003-10-28 03:13:11 +03:00
|
|
|
char proposedName[B_DISK_DEVICE_NAME_LENGTH];
|
2003-07-25 02:58:06 +04:00
|
|
|
strcpy(proposedName, name);
|
2007-10-06 02:39:52 +04:00
|
|
|
error = validate_set_partition_name(partition, changeCounter, proposedName);
|
2003-07-25 02:58:06 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
if (strcmp(name, proposedName))
|
|
|
|
return B_BAD_VALUE;
|
|
|
|
// set name
|
|
|
|
error = partition->SetName(name);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_NAME);
|
|
|
|
// implicit partitioning system changes
|
|
|
|
return partition->Parent()->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition->Parent(), partition, B_PARTITION_SET_NAME);
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_set_partition_content_name
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_set_partition_content_name(partition_id partitionID, int32* changeCounter,
|
|
|
|
const char* name)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-10-24 13:37:20 +04:00
|
|
|
if (!_name)
|
2003-07-25 02:58:06 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-28 03:13:11 +03:00
|
|
|
char name[B_DISK_DEVICE_NAME_LENGTH];
|
|
|
|
status_t error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH);
|
2003-10-25 03:09:43 +04:00
|
|
|
if (error)
|
|
|
|
return error;
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check name
|
2003-10-28 03:13:11 +03:00
|
|
|
char proposedName[B_DISK_DEVICE_NAME_LENGTH];
|
2003-07-25 02:58:06 +04:00
|
|
|
strcpy(proposedName, name);
|
2003-10-25 03:09:43 +04:00
|
|
|
error = validate_set_partition_content_name(partition,
|
2003-07-25 02:58:06 +04:00
|
|
|
changeCounter, proposedName);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
if (strcmp(name, proposedName))
|
|
|
|
return B_BAD_VALUE;
|
|
|
|
// set name
|
|
|
|
error = partition->SetContentName(name);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_CONTENT_NAME);
|
|
|
|
// implicit content disk system changes
|
|
|
|
return partition->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition, NULL, B_PARTITION_SET_CONTENT_NAME);
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_set_partition_type
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_set_partition_type(partition_id partitionID, int32* changeCounter,
|
|
|
|
partition_id childID, int32* childChangeCounter, const char* type)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-10-24 13:37:20 +04:00
|
|
|
if (!_type)
|
2003-07-25 02:58:06 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-28 03:13:11 +03:00
|
|
|
char type[B_DISK_DEVICE_TYPE_LENGTH];
|
|
|
|
status_t error = ddm_strlcpy(type, _type, B_DISK_DEVICE_TYPE_LENGTH);
|
2003-10-25 03:09:43 +04:00
|
|
|
if (error)
|
|
|
|
return error;
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check type
|
2007-10-06 02:39:52 +04:00
|
|
|
error = validate_set_partition_type(partition, changeCounter, type);
|
2003-07-25 02:58:06 +04:00
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
// set type
|
|
|
|
error = partition->SetType(type);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_TYPE);
|
|
|
|
// implicit partitioning system changes
|
|
|
|
return partition->Parent()->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition->Parent(), partition, B_PARTITION_SET_TYPE);
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_set_partition_parameters
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_set_partition_parameters(partition_id partitionID, int32* changeCounter,
|
|
|
|
partition_id childID, int32* childChangeCounter, const char* parameters,
|
|
|
|
size_t parametersSize)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-10-27 11:10:52 +03:00
|
|
|
if (!_parameters || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|
2003-07-25 02:58:06 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-24 13:37:20 +04:00
|
|
|
char *parameters = NULL;
|
|
|
|
if (_parameters) {
|
2003-10-25 12:35:27 +04:00
|
|
|
parameters = static_cast<char*>(malloc(parametersSize));
|
2003-10-24 13:37:20 +04:00
|
|
|
if (parameters)
|
2003-10-25 12:35:27 +04:00
|
|
|
user_memcpy(parameters, _parameters, parametersSize);
|
2003-10-24 13:37:20 +04:00
|
|
|
else
|
|
|
|
return B_NO_MEMORY;
|
|
|
|
}
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
2007-10-06 02:39:52 +04:00
|
|
|
status_t error = partition ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND;
|
2003-10-24 13:37:20 +04:00
|
|
|
if (!error) {
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check parameters
|
|
|
|
error = validate_set_partition_parameters(partition,
|
|
|
|
changeCounter, parameters);
|
|
|
|
if (!error) {
|
|
|
|
// set type
|
|
|
|
error = partition->SetParameters(parameters);
|
|
|
|
if (!error) {
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_PARAMETERS);
|
|
|
|
// implicit partitioning system changes
|
2007-10-06 02:39:52 +04:00
|
|
|
error = partition->Parent()->DiskSystem()
|
2007-10-07 19:39:35 +04:00
|
|
|
->ShadowPartitionChanged(partition->Parent(), partition,
|
2007-10-06 02:39:52 +04:00
|
|
|
B_PARTITION_SET_PARAMETERS);
|
2003-10-24 13:37:20 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(parameters);
|
|
|
|
return error;
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_set_partition_content_parameters
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2004-10-29 05:38:17 +04:00
|
|
|
_user_set_partition_content_parameters(partition_id partitionID,
|
2007-11-01 00:16:22 +03:00
|
|
|
int32* changeCounter, const char* parameters, size_t parametersSize)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-10-27 11:10:52 +03:00
|
|
|
if (!_parameters || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|
2003-10-24 13:37:20 +04:00
|
|
|
return B_BAD_VALUE;
|
|
|
|
char *parameters = NULL;
|
|
|
|
if (_parameters) {
|
2003-10-25 12:35:27 +04:00
|
|
|
parameters = static_cast<char*>(malloc(parametersSize));
|
2003-10-24 13:37:20 +04:00
|
|
|
if (parameters)
|
2003-10-25 12:35:27 +04:00
|
|
|
user_memcpy(parameters, _parameters, parametersSize);
|
2003-10-24 13:37:20 +04:00
|
|
|
else
|
|
|
|
return B_NO_MEMORY;
|
|
|
|
}
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
2007-10-06 02:39:52 +04:00
|
|
|
status_t error = partition ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND;
|
2003-10-24 13:37:20 +04:00
|
|
|
if (!error) {
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check parameters
|
|
|
|
error = validate_set_partition_content_parameters(partition,
|
|
|
|
changeCounter, parameters);
|
|
|
|
if (!error) {
|
|
|
|
// set name
|
|
|
|
error = partition->SetContentParameters(parameters);
|
|
|
|
if (!error) {
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_CONTENT_PARAMETERS);
|
|
|
|
// implicit content disk system changes
|
|
|
|
error = partition->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition, NULL, B_PARTITION_SET_CONTENT_PARAMETERS);
|
2003-10-24 13:37:20 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(partition);
|
|
|
|
return error;
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_initialize_partition
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_initialize_partition(partition_id partitionID, int32* changeCounter,
|
|
|
|
const char* diskSystemName, const char* name, const char* parameters,
|
2007-10-06 02:39:52 +04:00
|
|
|
size_t parametersSize)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2007-10-06 03:25:58 +04:00
|
|
|
if (!_diskSystemName || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|
2003-07-25 02:58:06 +04:00
|
|
|
return B_BAD_VALUE;
|
2007-10-06 03:25:58 +04:00
|
|
|
|
|
|
|
// copy disk system name
|
2003-10-28 03:13:11 +03:00
|
|
|
char diskSystemName[B_DISK_SYSTEM_NAME_LENGTH];
|
2007-10-06 02:39:52 +04:00
|
|
|
status_t error = ddm_strlcpy(diskSystemName, _diskSystemName,
|
|
|
|
B_DISK_SYSTEM_NAME_LENGTH);
|
2007-10-06 03:25:58 +04:00
|
|
|
|
|
|
|
// copy name
|
|
|
|
char name[B_DISK_DEVICE_NAME_LENGTH];
|
|
|
|
if (!error && _name)
|
2003-10-28 03:13:11 +03:00
|
|
|
error = ddm_strlcpy(name, _name, B_DISK_DEVICE_NAME_LENGTH);
|
2007-10-06 03:25:58 +04:00
|
|
|
|
2003-10-25 03:09:43 +04:00
|
|
|
if (error)
|
|
|
|
return error;
|
2007-10-06 03:25:58 +04:00
|
|
|
|
|
|
|
// copy parameters
|
|
|
|
MemoryDeleter parameterDeleter;
|
|
|
|
char *parameters = NULL;
|
2003-10-24 13:37:20 +04:00
|
|
|
if (_parameters) {
|
2003-10-25 12:35:27 +04:00
|
|
|
parameters = static_cast<char*>(malloc(parametersSize));
|
2007-10-06 03:25:58 +04:00
|
|
|
if (!parameters)
|
2003-10-24 13:37:20 +04:00
|
|
|
return B_NO_MEMORY;
|
2007-10-06 03:25:58 +04:00
|
|
|
parameterDeleter.SetTo(parameters);
|
|
|
|
|
|
|
|
if (user_memcpy(parameters, _parameters, parametersSize) != B_OK)
|
|
|
|
return B_BAD_ADDRESS;
|
2003-10-24 13:37:20 +04:00
|
|
|
}
|
2007-10-06 03:25:58 +04:00
|
|
|
|
2003-07-25 02:58:06 +04:00
|
|
|
// get the partition
|
2007-10-06 03:25:58 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
2003-07-25 02:58:06 +04:00
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
2007-10-06 03:25:58 +04:00
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
|
|
|
|
// get the disk system
|
|
|
|
KDiskSystem *diskSystem = manager->LoadDiskSystem(diskSystemName);
|
|
|
|
if (!diskSystem)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
DiskSystemLoader loader(diskSystem, true);
|
|
|
|
|
|
|
|
// check parameters
|
|
|
|
char proposedName[B_DISK_DEVICE_NAME_LENGTH];
|
|
|
|
if (_name)
|
|
|
|
strcpy(proposedName, name);
|
|
|
|
|
|
|
|
error = validate_initialize_partition(partition, changeCounter,
|
|
|
|
diskSystemName, _name ? proposedName : NULL, parameters);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
if (_name && strcmp(name, proposedName) != 0)
|
|
|
|
return B_BAD_VALUE;
|
|
|
|
|
|
|
|
// unitialize the partition's contents and set the new
|
|
|
|
// parameters
|
|
|
|
if ((error = partition->UninitializeContents(true)) != B_OK)
|
|
|
|
return error;
|
|
|
|
|
|
|
|
partition->SetDiskSystem(diskSystem);
|
|
|
|
|
|
|
|
if ((error = partition->SetContentName(_name ? name : NULL)) != B_OK)
|
|
|
|
return error;
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_CONTENT_NAME);
|
|
|
|
|
|
|
|
if ((error = partition->SetContentParameters(parameters)) != B_OK)
|
|
|
|
return error;
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_CONTENT_PARAMETERS);
|
|
|
|
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_INITIALIZATION);
|
|
|
|
|
|
|
|
// implicit content disk system changes
|
|
|
|
return partition->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition, NULL, B_PARTITION_INITIALIZE);
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_uninitialize_partition
|
2003-09-21 23:13:54 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_uninitialize_partition(partition_id partitionID, int32* changeCounter)
|
2003-09-21 23:13:54 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-09-21 23:13:54 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// unitialize the partition's contents and set the new parameters
|
2003-09-28 23:31:49 +04:00
|
|
|
return partition->UninitializeContents(true);
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-09-21 23:13:54 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2004-10-29 05:38:17 +04:00
|
|
|
// _user_create_child_partition
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_create_child_partition(partition_id partitionID, int32* changeCounter,
|
|
|
|
off_t offset, off_t size, const char* type, const char* name,
|
|
|
|
const char* parameters, size_t parametersSize, partition_id* childID,
|
|
|
|
int32* childChangeCounter)
|
|
|
|
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-10-27 11:10:52 +03:00
|
|
|
if (!_type || parametersSize > B_DISK_DEVICE_MAX_PARAMETER_SIZE)
|
2003-07-25 02:58:06 +04:00
|
|
|
return B_BAD_VALUE;
|
2003-10-28 03:13:11 +03:00
|
|
|
char type[B_DISK_DEVICE_TYPE_LENGTH];
|
2003-10-24 13:37:20 +04:00
|
|
|
char *parameters = NULL;
|
2003-10-28 03:13:11 +03:00
|
|
|
status_t error = ddm_strlcpy(type, _type, B_DISK_DEVICE_TYPE_LENGTH);
|
2003-10-25 03:09:43 +04:00
|
|
|
if (error)
|
|
|
|
return error;
|
2003-10-24 13:37:20 +04:00
|
|
|
if (_parameters) {
|
2003-10-25 12:35:27 +04:00
|
|
|
parameters = static_cast<char*>(malloc(parametersSize));
|
2003-10-24 13:37:20 +04:00
|
|
|
if (parameters)
|
2003-10-25 12:35:27 +04:00
|
|
|
user_memcpy(parameters, _parameters, parametersSize);
|
2003-10-24 13:37:20 +04:00
|
|
|
else
|
|
|
|
return B_NO_MEMORY;
|
|
|
|
}
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
2007-10-06 02:39:52 +04:00
|
|
|
error = partition ? (status_t)B_OK : (status_t)B_ENTRY_NOT_FOUND;
|
2003-10-24 13:37:20 +04:00
|
|
|
if (!error) {
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check the parameters
|
|
|
|
off_t proposedOffset = offset;
|
|
|
|
off_t proposedSize = size;
|
|
|
|
int32 index = 0;
|
|
|
|
error = validate_create_child_partition(partition, changeCounter,
|
|
|
|
&proposedOffset, &proposedSize, type, parameters, &index);
|
|
|
|
if (!error) {
|
|
|
|
error = (proposedOffset == offset && proposedSize == size)
|
|
|
|
? B_OK : B_BAD_VALUE;
|
|
|
|
if (!error) {
|
|
|
|
// create the child
|
|
|
|
KPartition *child = NULL;
|
|
|
|
error = partition->CreateChild(-1, index, &child);
|
|
|
|
if (!error) {
|
|
|
|
partition->Changed(B_PARTITION_CHANGED_CHILDREN);
|
|
|
|
if (_childID) {
|
|
|
|
partition_id childID = child->ID();
|
|
|
|
user_memcpy(_childID, &childID, sizeof(childID));
|
|
|
|
}
|
|
|
|
// set the parameters
|
|
|
|
child->SetOffset(offset);
|
2007-10-07 19:39:35 +04:00
|
|
|
child->SetSize(size);
|
2003-10-24 13:37:20 +04:00
|
|
|
error = child->SetType(type);
|
|
|
|
}
|
|
|
|
if (!error) {
|
2007-10-07 19:39:35 +04:00
|
|
|
error = child->SetParameters(parameters);
|
2003-10-24 13:37:20 +04:00
|
|
|
}
|
|
|
|
if (!error) {
|
|
|
|
// implicit partitioning system changes
|
|
|
|
error = partition->DiskSystem()->ShadowPartitionChanged(
|
2007-10-07 19:39:35 +04:00
|
|
|
partition, child, B_PARTITION_CREATE_CHILD);
|
2003-10-24 13:37:20 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
free(parameters);
|
|
|
|
return error;
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|
|
|
|
|
2007-10-06 02:39:52 +04:00
|
|
|
|
2007-11-01 00:16:22 +03:00
|
|
|
// _user_delete_child_partition
|
2003-07-21 02:39:37 +04:00
|
|
|
status_t
|
2007-11-01 00:16:22 +03:00
|
|
|
_user_delete_child_partition(partition_id partitionID, int32* changeCounter,
|
|
|
|
partition_id childID, int32 childChangeCounter)
|
2003-07-21 02:39:37 +04:00
|
|
|
{
|
2007-11-01 00:16:22 +03:00
|
|
|
#if 0
|
2003-07-25 02:58:06 +04:00
|
|
|
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
|
|
|
// get the partition
|
|
|
|
KPartition *partition = manager->WriteLockPartition(partitionID);
|
|
|
|
if (!partition)
|
|
|
|
return B_ENTRY_NOT_FOUND;
|
|
|
|
PartitionRegistrar registrar1(partition, true);
|
|
|
|
PartitionRegistrar registrar2(partition->Device(), true);
|
|
|
|
DeviceWriteLocker locker(partition->Device(), true);
|
|
|
|
// check whether delete the child is OK
|
|
|
|
status_t error = validate_delete_child_partition(partition, changeCounter);
|
|
|
|
if (error != B_OK)
|
|
|
|
return error;
|
|
|
|
// delete the child
|
|
|
|
KPartition *parent = partition->Parent();
|
|
|
|
if (!parent->RemoveChild(partition))
|
|
|
|
return B_ERROR;
|
|
|
|
parent->Changed(B_PARTITION_CHANGED_CHILDREN);
|
|
|
|
return B_OK;
|
2007-11-01 00:16:22 +03:00
|
|
|
#endif
|
|
|
|
return B_BAD_VALUE;
|
2003-07-21 02:39:37 +04:00
|
|
|
}
|