* Added shadow_id field to user_partition_data.
* Implemented several new syscalls (_kern_find_{disk_device,partition}(), {prepare,cancel}_disk_device_modifications(), [un]register_file_device()), git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3982 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
7fcdfb5fb8
commit
1ff134b901
@ -3,24 +3,92 @@
|
||||
#include <KDiskDevice.h>
|
||||
#include <KDiskDeviceManager.h>
|
||||
#include <KDiskDeviceUtils.h>
|
||||
#include <KFileDiskDevice.h>
|
||||
#include <KDiskSystem.h>
|
||||
|
||||
#include "ddm_userland_interface.h"
|
||||
#include "UserDataWriter.h"
|
||||
|
||||
// get_current_team
|
||||
team_id
|
||||
get_current_team()
|
||||
{
|
||||
// TODO: There must be a straighter way in kernelland.
|
||||
thread_info info;
|
||||
get_thread_info(find_thread(NULL), &info);
|
||||
return info.team;
|
||||
}
|
||||
|
||||
// _kern_get_next_disk_device_id
|
||||
partition_id
|
||||
_kern_get_next_disk_device_id(int32 *cookie, size_t *neededSize)
|
||||
{
|
||||
if (!cookie)
|
||||
return B_BAD_VALUE;
|
||||
partition_id id = B_ERROR;
|
||||
partition_id id = B_ENTRY_NOT_FOUND;
|
||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||
// get the next device
|
||||
if (KDiskDevice *device = manager->RegisterNextDevice(cookie)) {
|
||||
PartitionRegistrar _(device, true);
|
||||
id = device->ID();
|
||||
if (neededSize) {
|
||||
if (DeviceReadLocker locker = device) {
|
||||
// get the needed size
|
||||
UserDataWriter writer;
|
||||
device->WriteUserData(writer, false);
|
||||
*neededSize = writer.AllocatedSize();
|
||||
} else
|
||||
return B_ERROR;
|
||||
}
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
// _kern_find_disk_device
|
||||
partition_id
|
||||
_kern_find_disk_device(const char *filename, size_t *neededSize)
|
||||
{
|
||||
if (!filename)
|
||||
return B_BAD_VALUE;
|
||||
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;
|
||||
device->WriteUserData(writer, false);
|
||||
*neededSize = writer.AllocatedSize();
|
||||
} else
|
||||
return B_ERROR;
|
||||
}
|
||||
}
|
||||
return id;
|
||||
}
|
||||
|
||||
// _kern_find_partition
|
||||
partition_id
|
||||
_kern_find_partition(const char *filename, size_t *neededSize)
|
||||
{
|
||||
if (!filename)
|
||||
return B_BAD_VALUE;
|
||||
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
|
||||
UserDataWriter writer;
|
||||
device->WriteUserData(writer, false);
|
||||
*neededSize = writer.AllocatedSize();
|
||||
@ -33,27 +101,57 @@ _kern_get_next_disk_device_id(int32 *cookie, size_t *neededSize)
|
||||
|
||||
// _kern_get_disk_device_data
|
||||
status_t
|
||||
_kern_get_disk_device_data(partition_id deviceID, bool shadow,
|
||||
_kern_get_disk_device_data(partition_id id, bool deviceOnly, bool shadow,
|
||||
user_disk_device_data *buffer, size_t bufferSize,
|
||||
size_t *neededSize)
|
||||
{
|
||||
if (!buffer && bufferSize > 0)
|
||||
return B_BAD_VALUE;
|
||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||
if (KDiskDevice *device = manager->RegisterDevice(deviceID)) {
|
||||
// get the device
|
||||
if (KDiskDevice *device = manager->RegisterDevice(id, deviceOnly)) {
|
||||
PartitionRegistrar _(device, true);
|
||||
if (DeviceReadLocker locker = device) {
|
||||
// write the device data into the buffer
|
||||
UserDataWriter writer(buffer, bufferSize);
|
||||
device->WriteUserData(writer, shadow);
|
||||
if (neededSize)
|
||||
*neededSize = writer.AllocatedSize();
|
||||
if (writer.AllocatedSize() <= bufferSize)
|
||||
return B_OK;
|
||||
return B_BUFFER_OVERFLOW;
|
||||
}
|
||||
}
|
||||
return B_ENTRY_NOT_FOUND;
|
||||
}
|
||||
|
||||
// _kern_register_file_device
|
||||
partition_id
|
||||
_kern_register_file_device(const char *filename)
|
||||
{
|
||||
if (!filename)
|
||||
return B_BAD_VALUE;
|
||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||
if (ManagerLocker locker = manager) {
|
||||
if (KFileDiskDevice *device = manager->FindFileDevice(filename))
|
||||
return device->ID();
|
||||
return manager->CreateFileDevice(filename);
|
||||
}
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
// _kern_unregister_file_device
|
||||
status_t
|
||||
_kern_unregister_file_device(partition_id deviceID, const char *filename)
|
||||
{
|
||||
if (deviceID < 0 && !filename)
|
||||
return B_BAD_VALUE;
|
||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||
if (deviceID >= 0)
|
||||
return manager->DeleteFileDevice(deviceID);
|
||||
return manager->DeleteFileDevice(filename);
|
||||
}
|
||||
|
||||
// _kern_get_disk_system_info
|
||||
status_t
|
||||
_kern_get_disk_system_info(disk_system_id id, user_disk_system_info *info)
|
||||
@ -105,3 +203,56 @@ _kern_find_disk_system(const char *name, user_disk_system_info *info)
|
||||
return B_ENTRY_NOT_FOUND;
|
||||
}
|
||||
|
||||
// _kern_prepare_disk_device_modifications
|
||||
status_t
|
||||
_kern_prepare_disk_device_modifications(partition_id deviceID)
|
||||
{
|
||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||
// get the device
|
||||
if (KDiskDevice *device = manager->RegisterDevice(deviceID, true)) {
|
||||
PartitionRegistrar _(device, true);
|
||||
if (DeviceWriteLocker locker = device) {
|
||||
if (device->ShadowOwner() >= 0)
|
||||
return B_BUSY;
|
||||
// create shadow device
|
||||
return device->CreateShadowDevice(get_current_team());
|
||||
}
|
||||
}
|
||||
return B_ENTRY_NOT_FOUND;
|
||||
}
|
||||
|
||||
// _kern_commit_disk_device_modifications
|
||||
status_t
|
||||
_kern_commit_disk_device_modifications(partition_id deviceID, port_id port,
|
||||
int32 token, bool completeProgress)
|
||||
{
|
||||
// not implemented
|
||||
return B_ERROR;
|
||||
}
|
||||
|
||||
// _kern_cancel_disk_device_modifications
|
||||
status_t
|
||||
_kern_cancel_disk_device_modifications(partition_id deviceID)
|
||||
{
|
||||
KDiskDeviceManager *manager = KDiskDeviceManager::Default();
|
||||
// get the device
|
||||
if (KDiskDevice *device = manager->RegisterDevice(deviceID, true)) {
|
||||
PartitionRegistrar _(device, true);
|
||||
if (DeviceWriteLocker locker = device) {
|
||||
if (device->ShadowOwner() != get_current_team())
|
||||
return B_BAD_VALUE;
|
||||
// delete shadow device
|
||||
return device->DeleteShadowDevice();
|
||||
}
|
||||
}
|
||||
return B_ENTRY_NOT_FOUND;
|
||||
}
|
||||
|
||||
// _kern_is_disk_device_modified
|
||||
bool
|
||||
_kern_is_disk_device_modified(partition_id device)
|
||||
{
|
||||
// not implemented
|
||||
return false;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user