Headers for the disk device manager. Very early state.

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3454 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2003-06-09 23:04:54 +00:00
parent bef8916ea6
commit 4c212afefb
12 changed files with 1047 additions and 0 deletions
@@ -0,0 +1,56 @@
// KDiskDevice.h
#ifndef _K_DISK_DEVICE_H
#define _K_DISK_DEVICE_H
#include <OS.h>
#include "KPartition.h"
namespace BPrivate {
namespace DiskDevice {
class KDiskDevice : public KPartition {
KDiskDevice(partition_id id = -1);
virtual ~KDiskDevice();
// A read lock owner can be sure that the device (incl. all of its
// partitions won't be changed).
// A write lock owner is moreover allowed to make changes.
// The hierarchy is additionally protected by the disk device manager's
// lock -- only a device write lock owner is allowed to change it, but
// manager lock owners can be sure, that it won't change.
bool ReadLock();
void ReadUnlock();
bool WriteLock();
void WriteUnlock();
void SetDeviceFlags(uint32 flags); // comprises the ones below
uint32 DeviceFlags() const;
bool IsRemovable() const;
bool HasMedia() const;
status_t SetPath(const char *path);
virtual status_t GetPath(char *path) const;
// File descriptor: Set only from a kernel thread, valid only for
// kernel threads.
void SetFD(int fd);
int FD() const;
// access to C style device data
disk_device_data *DeviceData();
const disk_device_data *DeviceData() const;
virtual KPartition *CreateShadowPartition();
void SetShadowOwner(team_id team);
team_id ShadowOwner() const;
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KDiskDevice;
#endif // _K_DISK_DEVICE_H
@@ -0,0 +1,57 @@
// KDiskDeviceJob.h
#ifndef _K_DISK_DEVICE_JOB_H
#define _K_DISK_DEVICE_JOB_H
#include "disk_device_manager.h"
struct user_disk_device_job_info;
namespace BPrivate {
namespace DiskDevice {
class KDiskDeviceJob {
public:
KDiskDeviceJob(partition_id partition, partition_id scope = -1);
virtual ~KDiskDeviceJob();
disk_job_id ID() const;
void SetStatus(uint32 status);
uint32 Status() const;
void SetDescription(const char *description);
const char *Description() const;
// Maybe better just a virtual void GetDescription(char*)?
void SetPartitionID(partition_id partitionID);
// Probably not needed, since passed to the constructor.
partition_id PartitionID() const;
partition_id ScopeID() const;
virtual void UpdateProgress(float progress);
// may trigger a notification
// virtual, since some jobs are composed of several tasks (e.g. Move).
// We might want to explicitly support subtasks in the base class, or
// even in the userland API.
void UpdateExtraProgress(const char *info);
// triggers a notification
float Progress() const;
status_t GetInfo(user_disk_device_job_info *info);
virtual status_t Do();
// TODO: Do we want to add a Cancel() here? We probably can't tell the
// disk system directly anyway. That is, if the job is in progress,
// the disk system would have to check the job status periodically
// to find out, if the job had been canceled. But then a
// SetStatus(B_DISK_DEVICE_JOB_CANCELED) would be sufficient.
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KDiskDeviceJob;
#endif // _DISK_DEVICE_JOB_H
@@ -0,0 +1,44 @@
// KDiskDeviceJob.h
#ifndef _K_DISK_DEVICE_JOB_FACTORY_H
#define _K_DISK_DEVICE_JOB_FACTORY_H
#include "disk_device_manager.h"
namespace BPrivate {
namespace DiskDevice {
class KDiskDeviceJob;
class KDiskDeviceJobFactory {
public:
KDiskDeviceJobFactory();
~KDiskDeviceJobFactory();
KDiskDeviceJob *CreateCreateChildJob(partition_id partition,
partition_id child, off_t offset,
off_t size, const char *parameters);
KDiskDeviceJob *CreateDefragmentJob(partition_id partition);
KDiskDeviceJob *CreateDeleteChildJob(partition_id parent,
partition_id partition);
KDiskDeviceJob *CreateScanPartitionJob(partition_id partition);
KDiskDeviceJob *CreateInitializeJob(partition_id partition,
disk_system_id diskSystemID,
const char *parameters);
KDiskDeviceJob *CreateMoveJob(partition_id parent, partition_id partition,
off_t offset);
KDiskDeviceJob *CreateRepairJob(partition_id partition);
KDiskDeviceJob *CreateResizeJob(partition_id parent,
partition_id partition, off_t size);
KDiskDeviceJob *CreateSetParametersJob(partition_id parent,
partition_id partition,
const char *parameters,
const char *contentParameters);
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KDiskDeviceJobQueue;
#endif // _K_DISK_DEVICE_JOB_FACTORY_H
@@ -0,0 +1,39 @@
// KDiskDeviceJobQueue.h
#ifndef _K_DISK_DEVICE_JOB_QUEUE_H
#define _K_DISK_DEVICE_JOB_QUEUE_H
#include "disk_device_manager.h"
namespace BPrivate {
namespace DiskDevice {
class KDiskDevice;
class KDiskDeviceJob;
class KDiskDeviceJobQueue {
public:
KDiskDeviceJobQueue();
~KDiskDeviceJobQueue();
void SetDevice(KDiskDevice *device);
KDiskDevice *Device() const;
KDiskDeviceJob *ActiveJob() const; // is not in list of scheduled jobs
// list of scheduled jobs
bool AddJob(KDiskDeviceJob *job);
KDiskDeviceJob *RemoveJob(int32 index);
bool RemoveJob(KDiskDeviceJob *job);
KDiskDeviceJob *JobAt(int32 index) const;
int32 CountJobs() const;
void Execute();
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KDiskDeviceJobQueue;
#endif // _K_DISK_DEVICE_JOB_QUEUE_H
@@ -0,0 +1,77 @@
// KDiskDeviceManager.h
#ifndef _K_DISK_DEVICE_MANAGER_H
#define _K_DISK_DEVICE_MANAGER_H
#include "disk_device_manager.h"
namespace BPrivate {
namespace DiskDevice {
class KDiskDevice;
class KDiskDeviceJob;
class KDiskDeviceJobQueue;
class KDiskSystem;
class KPartition;
class KDiskDeviceManager {
KDiskDeviceManager();
~KDiskDeviceManager();
// Singleton Creation, Deletion, and Access
static status_t CreateDefault();
static void DeleteDefault();
static KDiskDeviceManager *Default();
// Locking
bool Lock();
void Unlock();
// Disk Device / Partition Management
KDiskDevice *RegisterDevice(const char *path, bool noShadow = true);
KDiskDevice *RegisterDevice(partition_id id, bool noShadow = true);
KPartition *RegisterPartition(const char *path, bool noShadow = true);
KPartition *RegisterPartition(partition_id id, bool noShadow = true);
// manager must be locked
int32 CountDiskDevices() const;
KDiskDevice *DiskDeviceAt(int32 index) const;
void PartitionAdded(KPartition *partition); // implementation internal
void PartitionRemoved(KPartition *partition); //
// Jobs
// manager must be locked
KDiskDeviceJob *JobWithID(disk_job_id id) const;
int32 CountJobs() const;
KDiskDeviceJob *JobAt(int32 index) const;
// manager must be locked
bool AddJobQueue(KDiskDeviceJobQueue *jobQueue) const;
int32 CountJobQueues() const;
KDiskDeviceJobQueue *JobQueueAt(int32 index) const;
// Disk Systems
// manager must be locked
KDiskSystem *DiskSystemWithName(const char *name);
KDiskSystem *DiskSystemWithID(disk_system_id id);
int32 CountDiskSystems() const;
KDiskSystem *DiskSystemAt(int32 index) const;
// Watching
// TODO: Watching service for the kernel. The userland watching is handled
// by the registrar.
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KDiskDeviceManager;
#endif // _K_DISK_DEVICE_MANAGER_H
@@ -0,0 +1,113 @@
// KDiskSystem.h
#ifndef _K_DISK_DEVICE_SYSTEM_H
#define _K_DISK_DEVICE_SYSTEM_H
#include "disk_device_manager.h"
namespace BPrivate {
namespace DiskDevice {
class KDiskDeviceJob;
class KPartition;
class KDiskSystem {
KDiskSystem(const char *name);
virtual ~KDiskSystem();
void SetID(disk_system_id id);
disk_system_id ID() const;
const char *Name() const;
// We might want to introduce another name -- a more user friendly one.
// This one is the name of the partition module/FS add-on, e.g.
// "intel/extended", "bfs".
virtual bool IsFileSystem() const;
bool IsPartitioningSystem() const;
virtual status_t Load(); // load/unload -- can be nested
virtual status_t Unload(); //
virtual bool IsLoaded() const;
// Scanning
// Device must be write locked.
virtual float Identify(KPartition *partition, void **cookie);
virtual status_t Scan(KPartition *partition, void *cookie);
virtual void FreeIdentifyCookie(KPartition *partition, void *cookie);
virtual void FreeCookie(KPartition *partition);
virtual void FreeContentCookie(KPartition *partition);
// Querying
// Device must be read locked.
virtual bool SupportsDefragmenting(KPartition *partition,
bool *whileMounted);
virtual bool SupportsRepairing(KPartition *partition, bool checkOnly,
bool *whileMounted);
virtual bool SupportsResizing(KPartition *partition, bool *whileMounted);
virtual bool SupportsResizingChild(KPartition *child);
virtual bool SupportsMoving(KPartition *partition, bool *whileMounted);
virtual bool SupportsMovingChild(KPartition *child);
virtual bool SupportsParentSystem(KDiskSystem *system);
virtual bool SupportsChildSystem(KDiskSystem *system);
virtual bool ValidateResize(KPartition *partition, off_t *size);
virtual bool ValidateMove(KPartition *partition, off_t *start);
virtual bool ValidateResizeChild(KPartition *partition, off_t *size);
virtual bool ValidateMoveChild(KPartition *partition, off_t *start);
virtual bool ValidateCreateChild(KPartition *partition, off_t *start,
off_t *size, const char *parameters);
virtual bool ValidateInitialize(KPartition *partition,
const char *parameters);
virtual bool ValidateSetParameters(KPartition *partition,
const char *parameters);
virtual bool ValidateSetContentParameters(KPartition *child,
const char *parameters);
virtual int32 CountPartitionableSpaces(KPartition *partition);
virtual bool GetPartitionableSpaces(KPartition *partition,
partitionable_space_data *spaces,
int32 count,
int32 *actualCount = NULL);
// Writing
// Device should not be locked.
virtual status_t Defragment(KPartition *partition, KDiskDeviceJob *job);
virtual status_t Repair(KPartition *partition, bool checkOnly,
KDiskDeviceJob *job);
virtual status_t Resize(KPartition *partition, off_t size,
KDiskDeviceJob *job);
virtual status_t ResizeChild(KPartition *child, off_t size,
KDiskDeviceJob *job);
virtual status_t Move(KPartition *partition, off_t offset,
KDiskDeviceJob *job);
virtual status_t MoveChild(KPartition *child, off_t offset,
KDiskDeviceJob *job);
virtual status_t CreateChild(KPartition *partition, off_t offset,
off_t size, const char *parameters,
KDiskDeviceJob *job,
KPartition **child = NULL,
partition_id childID = -1);
// optional childID parameter or allow setting the ID later?
virtual status_t DeleteChild(KPartition *child, KDiskDeviceJob *job);
virtual status_t Initialize(KPartition *partition, const char *parameters,
KDiskDeviceJob *job);
virtual status_t SetParameters(KPartition *partition,
const char *parameters,
KDiskDeviceJob *job);
virtual status_t SetContentParameters(KPartition *partition,
const char *parameters,
KDiskDeviceJob *job);
// The KPartition* parameters for the writing methods are a bit `volatile',
// since the device will not be locked, when they are called. The KPartition
// is registered though, so that it is at least guaranteed that the object
// won't go away.
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KDiskSystem;
#endif // _K_DISK_DEVICE_SYSTEM_H
@@ -0,0 +1,70 @@
// KFileSystem.h
//
// KFileSystem implements the KDiskSystem interface for file systems.
// It works with the FS API.
#ifndef _K_FILE_DISK_DEVICE_SYSTEM_H
#define _K_FILE_DISK_DEVICE_SYSTEM_H
#include "KDiskSystem.h"
namespace BPrivate {
namespace DiskDevice {
class KFileSystem {
KFileSystem(const char *name);
virtual ~KFileSystem();
virtual bool IsFileSystem() const;
virtual status_t Load(); // load/unload -- can be nested
virtual status_t Unload(); //
virtual bool IsLoaded() const;
// Scanning
virtual float Identify(KPartition *partition, void **cookie);
virtual status_t Scan(KPartition *partition, void *cookie);
virtual void FreeIdentifyCookie(KPartition *partition, void *cookie);
virtual void FreeContentCookie(KPartition *partition);
// Querying
virtual bool SupportsDefragmenting(KPartition *partition,
bool *whileMounted);
virtual bool SupportsRepairing(KPartition *partition, bool checkOnly,
bool *whileMounted);
virtual bool SupportsResizing(KPartition *partition, bool *whileMounted);
virtual bool SupportsMoving(KPartition *partition, bool *whileMounted);
virtual bool SupportsParentSystem(KDiskSystem *system);
virtual bool ValidateResize(KPartition *partition, off_t *size);
virtual bool ValidateMove(KPartition *partition, off_t *start);
virtual bool ValidateInitialize(KPartition *partition,
const char *parameters);
virtual bool ValidateSetContentParameters(KPartition *child,
const char *parameters);
// Writing
virtual status_t Defragment(KPartition *partition, KDiskDeviceJob *job);
virtual status_t Repair(KPartition *partition, bool checkOnly,
KDiskDeviceJob *job);
virtual status_t Resize(KPartition *partition, off_t size,
KDiskDeviceJob *job);
virtual status_t Move(KPartition *partition, off_t offset,
KDiskDeviceJob *job);
virtual status_t Initialize(KPartition *partition, const char *parameters,
KDiskDeviceJob *job);
virtual status_t SetContentParameters(KPartition *partition,
const char *parameters,
KDiskDeviceJob *job);
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KFileSystem;
#endif // _K_FILE_DISK_DEVICE_SYSTEM_H
@@ -0,0 +1,157 @@
// KPartition.h
#ifndef _K_DISK_DEVICE_PARTITION_H
#define _K_DISK_DEVICE_PARTITION_H
#include "disk_device_manager.h"
#include "List.h"
namespace BPrivate {
namespace DiskDevice {
class KDiskDevice;
class KDiskSystem;
// partition flags
// TODO: move to another header (must be accessible from userland API impl.)
enum {
B_PARTITION_IS_DEVICE = 0x01,
B_PARTITION_MOUNTABLE = 0x02,
B_PARTITION_PARTITIONABLE = 0x04,
B_PARTITION_READ_ONLY = 0x08,
B_PARTITION_MOUNTED = 0x10, // needed?
B_PARTITION_BUSY = 0x20,
B_PARTITION_DESCENDANT_BUSY = 0x40,
};
class KPartition {
KPartition(partition_id id = -1);
virtual ~KPartition();
// Reference counting. As long as there's at least one referrer, the
// object won't be deleted.
// manager must be locked
bool Register();
bool Unregister();
int32 CountReferences() const;
void SetBusy(bool busy);
bool IsBusy() const;
// == jobs which may affect this partition are scheduled/in progress
void SetDescendantBusy(bool busy);
bool IsDescendantBusy() const;
// == jobs which may affect a descendant of this partition are
// scheduled/in progress; IsBusy() => IsDescendantBusy()
// In the userland API, both can probably mapped to one flag.
void SetOffset(off_t offset);
off_t Offset() const; // 0 for devices
void SetSize(off_t size);
off_t Size() const;
void SetBlockSize(uint32 blockSize);
uint32 BlockSize() const;
void SetIndex(int32 index);
int32 Index() const; // 0 for devices
void SetStatus(uint32 status);
uint32 Status() const;
void SetFlags(uint32 flags); // comprises the ones below
uint32 Flags() const;
bool IsMountable() const;
bool IsPartitionable() const;
bool IsReadOnly() const;
bool IsMounted() const;
bool IsDevice() const;
status_t SetName(const char *name);
const char *Name() const;
status_t SetContentName(const char *name);
const char *ContentName() const;
status_t SetType(const char *type);
const char *Type() const;
status_t SetContentType(const char *type);
const char *ContentType() const;
// access to C style partition data
partition_data *PartitionData();
const partition_data *PartitionData() const;
void SetID(partition_id id);
partition_id ID() const;
int32 ChangeCounter() const;
virtual status_t GetPath(char *path) const;
// no setter (see BDiskDevice) -- built on the fly
void SetVolumeID(dev_t volumeID);
dev_t VolumeID() const;
status_t Mount(uint32 mountFlags, const char *parameters);
status_t Unmount();
// Parameters
status_t SetParameters(const char *parameters);
const char *Parameters() const;
status_t SetContentParameters(const char *parameters);
const char *ContentParameters() const;
// Hierarchy
void SetDevice(KDiskDevice *device);
KDiskDevice *Device() const;
void SetParent(KPartition *parent);
KPartition *Parent() const;
status_t AddChild(KPartition *partition, int32 index = -1);
KPartition *RemoveChild(int32 index);
KPartition *ChildAt(int32 index) const;
int32 CountChildren() const;
// Shadow Partition
virtual KPartition *CreateShadowPartition(); // creates a complete tree
void DeleteShadowPartition(); // deletes ...
KPartition *ShadowPartition() const;
bool IsShadowPartition() const;
// DiskSystem
void SetDiskSystem(KDiskSystem *diskSystem);
KDiskSystem *DiskSystem() const;
void SetParentDiskSystem(KDiskSystem *diskSystem);
KDiskSystem *ParentDiskSystem() const;
void SetCookie(void *cookie);
void *Cookie() const;
void SetContentCookie(void *cookie);
void *ContentCookie() const;
protected:
partition_data fPartitionData;
List<KPartition*> fChildren;
KDiskDevice *fDevice;
KPartition *fParent;
KDiskSystem *fDiskSystem;
KDiskSystem *fParentDiskSystem;
int32 fReferenceCount;
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KPartition;
#endif // _K_DISK_DEVICE_PARTITION_H
@@ -0,0 +1,90 @@
// KPartitioningSystem.h
#ifndef _K_PARTITIONING_DISK_DEVICE_SYSTEM_H
#define _K_PARTITIONING_DISK_DEVICE_SYSTEM_H
#include "KDiskSystem.h"
namespace BPrivate {
namespace DiskDevice {
class KPartitioningSystem {
KPartitioningSystem(const char *name);
virtual ~KPartitioningSystem();
virtual bool IsFileSystem() const;
virtual status_t Load(); // load/unload -- can be nested
virtual status_t Unload(); //
virtual bool IsLoaded() const;
// Scanning
virtual float Identify(KPartition *partition, void **cookie);
virtual status_t Scan(KPartition *partition, void *cookie);
virtual void FreeIdentifyCookie(KPartition *partition, void *cookie);
virtual void FreeCookie(KPartition *partition);
virtual void FreeContentCookie(KPartition *partition);
// Querying
virtual bool SupportsRepairing(KPartition *partition, bool checkOnly,
bool *whileMounted);
// Does that makes sense for partitioning systems?
virtual bool SupportsResizing(KPartition *partition, bool *whileMounted);
virtual bool SupportsResizingChild(KPartition *child);
virtual bool SupportsMoving(KPartition *partition, bool *whileMounted);
virtual bool SupportsMovingChild(KPartition *child);
virtual bool SupportsParentSystem(KDiskSystem *system);
virtual bool SupportsChildSystem(KDiskSystem *system);
virtual bool ValidateResize(KPartition *partition, off_t *size);
virtual bool ValidateMove(KPartition *partition, off_t *start);
virtual bool ValidateResizeChild(KPartition *partition, off_t *size);
virtual bool ValidateMoveChild(KPartition *partition, off_t *start);
virtual bool ValidateCreateChild(KPartition *partition, off_t *start,
off_t *size, const char *parameters);
virtual bool ValidateInitialize(KPartition *partition,
const char *parameters);
virtual bool ValidateSetParameters(KPartition *partition,
const char *parameters);
virtual bool ValidateSetContentParameters(KPartition *child,
const char *parameters);
virtual bool GetPartitionableSpaces(KPartition *partition,
partitionable_space_data **spaces,
int32 *count);
// Writing
virtual status_t Repair(KPartition *partition, bool checkOnly,
KDiskDeviceJob *job);
virtual status_t Resize(KPartition *partition, off_t size,
KDiskDeviceJob *job);
virtual status_t ResizeChild(KPartition *child, off_t size,
KDiskDeviceJob *job);
virtual status_t Move(KPartition *partition, off_t offset,
KDiskDeviceJob *job);
virtual status_t MoveChild(KPartition *child, off_t offset,
KDiskDeviceJob *job);
virtual status_t CreateChild(KPartition *partition, off_t offset,
off_t size, const char *parameters,
KDiskDeviceJob *job,
KPartition **child = NULL,
partition_id childID = -1);
virtual status_t DeleteChild(KPartition *child, KDiskDeviceJob *job);
virtual status_t Initialize(KPartition *partition, const char *parameters,
KDiskDeviceJob *job);
virtual status_t SetParameters(KPartition *partition,
const char *parameters,
KDiskDeviceJob *job);
virtual status_t SetContentParameters(KPartition *partition,
const char *parameters,
KDiskDeviceJob *job);
};
} // namespace DiskDevice
} // namespace BPrivate
using BPrivate::DiskDevice::KPartitioningSystem;
#endif // _K_PARTITIONING_DISK_DEVICE_SYSTEM_H
@@ -0,0 +1,140 @@
// ddm_modules.h
//
// Interfaces to be implemented by partition modules/FS add-ons.
// For better readibility this is not yet a module interface, but just a
// listing of functions.
#ifndef _K_DISK_DEVICE_MODULES_H
#define _K_DISK_DEVICE_MODULES_H
#include <SupportDefs.h>
// partition module interface
// scanning
// (the device is write locked)
float identify_partition(int deviceFD, partition_data *partition,
void **cookie);
status_t scan_partition(int deviceFD, partition_data *partition,
void *identifyCookie);
void free_identify_partition_cookie(partition_data *partition, void *cookie);
void free_partition_cookie(partition_data *partition);
void free_partition_content_cookie(partition_data *partition);
// querying
// (the device is read locked)
bool supports_reparing_partition(partition_data *partition, bool checkOnly,
bool *whileMounted);
bool supports_resizing_partition(partition_data *partition,
bool *whileMounted);
bool supports_resizing_child_partition(partition_data *partition,
partition_data *child);
bool supports_moving_partition(partition_data *partition, bool *whileMounted);
bool supports_moving_child_partition(partition_data *partition,
partition_data *child);
bool supports_parent_system(const char *system);
bool supports_child_system(const char *system);
bool validate_resize_partition(partition_data *partition, off_t *size);
bool validate_move_partition(partition_data *partition, off_t *start);
bool validate_resize_child_partition(partition_data *partition,
partition_data *child, off_t *size);
bool validate_move_child_partition(partition_data *partition,
partition_data *child, off_t *start);
bool validate_create_child_partition(partition_data *partition,
partition_data *child, off_t *start,
off_t *size, const char *parameters);
bool validate_initialize_partition(partition_data *partition,
const char *parameters);
bool validate_set_partition_parameters(partition_data *partition,
const char *parameters);
bool validate_set_partition_content_parameters(partition_data *partition,
const char *parameters);
bool get_partitionable_spaces(partition_data *partition,
partitionable_space_data *spaces,
int32 count, int32 *actualCount);
// When not implemented, a standard algorithm is used.
// Alternatively we can multiplex the supports_*()/validate_*() hooks
// (see supports_validates_parameters.h for parameters):
bool supports_partition_operation(uint32 operation, void *parameters);
bool validate_partition_operation(uint32 operation, void *parameters);
// (same holds for the FS add-on API, of course)
// writing
// (device is NOT locked)
status_t repair_partition(int deviceFD, partition_id partition,
bool checkOnly, disk_job_id job);
status_t resize_partition(int deviceFD, partition_id partition, off_t size,
disk_job_id job);
status_t resize_child_partition(int deviceFD, partition_id partition,
off_t size, disk_job_id job);
status_t move_partition(int deviceFD, partition_id partition, off_t offset,
disk_job_id job);
status_t move_child_partition(int deviceFD, partition_id partition,
partition_id child, off_t offset,
disk_job_id job);
status_t create_child_partition(int deviceFD, partition_id partition,
off_t offset, off_t size,
const char *parameters, disk_job_id job,
partition_id *childID);
// childID is used for the return value, but is also an optional input
// parameter -- -1 to be ignored
status_t delete_child_partition(int deviceFD, partition_id partition,
partition_id child, disk_job_id job);
status_t initialize_partition(int deviceFD, partition_id partition,
const char *parameters, disk_job_id job);
status_t set_parameters_partition(int deviceFD, partition_id partition,
const char *parameters, disk_job_id job);
status_t set_partition_content_parameters(int deviceFD, partition_id partition,
const char *parameters,
disk_job_id job);
// FS add-on interface
// scanning
// (the device is write locked)
float identify_partition(const char *partitionPath, partition_data *partition,
void **cookie);
status_t scan_partition(const char *partitionPath, partition_data *partition,
void *identifyCookie);
void free_identify_partition_cookie(partition_data *partition, void *cookie);
void free_partition_content_cookie(partition_data *partition, void *cookie);
// querying
// (the device is read locked)
bool supports_defragmenting_partition(partition_data *partition,
bool *whileMounted);
bool supports_reparing_partition(partition_data *partition, bool checkOnly,
bool *whileMounted);
bool supports_resizing_partition(partition_data *partition,
bool *whileMounted);
bool supports_moving_partition(partition_data *partition, bool *whileMounted);
bool supports_parent_system(const char *system);
bool validate_resize_partition(partition_data *partition, off_t *size);
bool validate_move_partition(partition_data *partition, off_t *start);
bool validate_initialize_partition(partition_data *partition,
const char *parameters);
bool validate_set_partition_content_parameters(partition_data *partition,
const char *parameters);
// writing
// (the device is NOT locked)
status_t defragment_partition(int fd, partition_id partition, disk_job_id job);
status_t repair_partition(int fd, partition_id partition, bool checkOnly,
disk_job_id job);
status_t resize_partition(int fd, partition_id partition, off_t size,
disk_job_id job);
status_t move_partition(int fd, partition_id partition, off_t offset,
disk_job_id job);
status_t initialize_partition(const char *partition, const char *parameters,
disk_job_id job);
// This is pretty close to how the hook in R5 looked. Save the job ID, of
// course and that the parameters were given as (void*, size_t) pair.
status_t set_partition_content_parameters(int fd, partition_id partition,
const char *parameters,
disk_job_id job);
#endif // _K_DISK_DEVICE_MODULES_H
@@ -0,0 +1,114 @@
// ddm_userland_interface.h
#ifndef _DISK_DEVICE_MANAGER_USERLAND_INTERFACE_H
#define _DISK_DEVICE_MANAGER_USERLAND_INTERFACE_H
#include "disk_device_manager.h"
// userland partition representation
struct user_partition_data {
partition_id id;
off_t offset;
off_t size;
uint32 block_size;
uint32 status;
uint32 flags;
dev_t volume;
int32 change_counter; // needed?
char *name;
char *content_name;
char *type;
char *content_type;
char *parameters;
char *content_parameters;
void *user_data;
int32 child_count;
user_partition_data *children[1];
};
// userland disk device representation
struct user_disk_device_data {
uint32 device_flags;
char *path;
user_partition_data device_partition_data;
};
// userland partitionable space representation
struct user_partitionable_space_data {
off_t offset;
off_t size;
};
// userland disk device job representation
struct user_disk_device_job_info {
disk_job_id id;
uint32 type;
partition_id partition;
char desription[256];
};
// iterating, retrieving device/partition data
partition_id get_next_disk_device_id(int32 *cookie, size_t neededSize = NULL);
status_t get_disk_device_data(partition_id deviceID, bool shadow,
user_disk_device_data *buffer,
size_t bufferSize, size_t *neededSize);
status_t get_partition_data(partition_id partitionID, bool shadow,
user_partition_data *buffer,
size_t bufferSize, size_t *neededSize);
// Dangerous?!
status_t get_partitionable_spaces(partition_id partitionID, bool shadow,
user_partitionable_space_data *buffer,
size_t bufferSize, size_t *neededSize);
// Pass the partition change counter? If GetPartitionInfo() is only
// allowed, when the device is locked, then we wouldn't need it.
// disk systems
status_t find_disk_system(const char *name, disk_system_id *id);
status_t get_next_disk_system(disk_system_id *id, char *name, int32 *cookie);
bool supports_partition_operation(uint32 operation, void *parameters);
bool validate_partition_operation(uint32 operation, void *parameters);
// TODO: Sorry, I was too lazy: supports_validates_parameters.h is only
// for kernel internal use. There needs to be something similar for these
// functions.
// partition modification
status_t prepare_disk_device_modifications(partition_id device);
status_t commit_disk_device_modifications(partition_id device, port_id port,
int32 token, bool completeProgress);
status_t cancel_disk_device_modifications(partition_id device);
bool is_disk_device_modified(partition_id device);
status_t defragment_partition(partition_id partition);
status_t repair_partition(partition_id partition, bool checkOnly);
status_t resize_partition(partition_id partition, off_t size);
status_t move_partition(partition_id partition, off_t offset);
status_t set_partition_parameters(partition_id partition,
const char *parameters,
const char *contentParameters);
status_t initialize_partition(partition_id partition, const char *diskSystem,
const char *parameters);
// Note: There is also fs_initialize_volume(), which is not compatible
// with this function, for it is more general with respect to how the
// volume to be initialized is specified (though this might be solved
// by providing an API for registering files as disk devices), and more
// specific regarding the other parameters (flags and volumeName).
status_t create_child_partition(partition_id partition, off_t offset,
off_t size, const char *parameters,
partition_id *child);
status_t delete_partition(partition_id partition);
// jobs
status_t get_next_disk_device_job_info(user_disk_device_job_info *info,
int32 *cookie);
status_t get_disk_device_job_info(disk_job_id id,
user_disk_device_job_info *info);
status_t get_disk_device_job_status(disk_job_id id, uint32 *status,
float *progress);
// watching
status_t start_disk_device_watching(port_id, int32 token, uint32 flags);
status_t start_disk_device_job_watching(disk_job_id job, port_id, int32 token,
uint32 flags);
status_t stop_disk_device_watching(port_id, int32 token);
#endif // _DISK_DEVICE_MANAGER_USERLAND_INTERFACE_H
@@ -0,0 +1,90 @@
// disk_device_manager.h
//
// C API exported by the disk device manager.
// Currently only functions of interest for partition modules/FS add-ons
// are considered.
#ifndef _DISK_DEVICE_MANAGER_H
#define _DISK_DEVICE_MANAGER_H
#include <SupportDefs.h>
// TODO: These don't belong here. partition_id and disk_job_id are
// public (exposed by the userland API), while disk_system_id is at least
// known to the userland API, but probably exposed as well, as type of a
// private member variable of BDiskSystem.
typedef int32 partition_id;
typedef int32 disk_system_id;
typedef int32 disk_job_id;
// C API partition representation
typedef struct partition_data {
partition_id id;
off_t offset;
off_t size;
uint32 block_size;
int32 child_count;
int32 index; // needed?
uint32 status;
uint32 flags;
dev_t volume;
char *name; // max: B_FILE_NAME_LENGTH
char *content_name; //
char *type; //
char *content_type; //
char *parameters;
char *content_parameters;
void *cookie;
void *content_cookie;
} partition_data;
// C API disk device representation
typedef struct disk_device_data {
partition_id id; // equal to that of the root partition
uint32 flags;
char *path;
} disk_device_data;
// C API partitionable space representation
typedef struct partitionable_space_data {
off_t offset;
off_t size;
} partitionable_space_data;
// disk device locking
disk_device_data *write_lock_disk_device(partition_id partition);
void write_unlock_disk_device(partition_id partition);
disk_device_data *read_lock_disk_device(partition_id partition);
void read_unlock_disk_device(partition_id partition);
// parameter is the ID of any partition on the device
// getting disk devices/partitions by path
// (no locking required)
int32 find_disk_device(const char *path);
int32 find_partition(const char *path);
// disk device/partition read access
// (read lock required)
disk_device_data *get_disk_device(partition_id partition);
partition_data *get_partition(partition_id partition);
partition_data *get_parent_partition(partition_id partition);
partition_data *get_child_partition(partition_id partition, int32 index);
// partition write access
// (write lock required)
partition_data *create_child_partition(partition_id partition, int32 index,
partition_id *childID);
// childID is used for the return value, but is also an optional input
// parameter -- -1 to be ignored
bool delete_partition(partition_id partition);
void partition_modified(partition_id partition);
// tells the disk device manager, that the parition has been modified
// jobs
bool set_disk_device_job_status(disk_job_id job, uint32 status);
// probably not needed
uint32 get_disk_device_job_status(disk_job_id job);
bool update_disk_device_job_progress(disk_job_id job, float progress);
bool update_disk_device_job_extra_progress(disk_job_id job, const char *info);
#endif // _DISK_DEVICE_MANAGER_H