root/headers/private/fs_shell/fssh_disk_device_manager.h
/*
 * Copyright 2003-2007, Haiku, Inc. All Rights Reserved.
 * Distributed under the terms of the MIT License.
 */
#ifndef _FSSH_DISK_DEVICE_MANAGER_H
#define _FSSH_DISK_DEVICE_MANAGER_H


#include "fssh_disk_device_defs.h"
#include "fssh_drivers.h"


#ifdef __cplusplus
extern "C" {
#endif

// C API partition representation
// Fields marked [sys] are set by the system and are not to be changed by
// the disk system modules.
typedef struct fssh_partition_data {
        fssh_partition_id       id;                             // [sys]
        fssh_off_t                      offset;
        fssh_off_t                      size;
        fssh_off_t                      content_size;
        uint32_t                        block_size;
        int32_t                         child_count;
        int32_t                         index;                  // [sys]
        uint32_t                        status;
        uint32_t                        flags;
        fssh_dev_t                      volume;                 // [sys]
        void                            *mount_cookie;  // [sys] 
        char                            *name;                  // max: B_OS_NAME_LENGTH
        char                            *content_name;  //
        char                            *type;                  //
        const char                      *content_type;  // [sys]
        char                            *parameters;
        char                            *content_parameters;
        void                            *cookie;
        void                            *content_cookie;
} fssh_partition_data;

// C API disk device representation
typedef struct fssh_disk_device_data {
        fssh_partition_id               id;                             // equal to that of the root partition
        uint32_t                                flags;
        char                                    *path;
        fssh_device_geometry    geometry;
} fssh_disk_device_data;

// C API partitionable space representation
typedef struct fssh_partitionable_space_data {
        fssh_off_t      offset;
        fssh_off_t      size;
} fssh_partitionable_space_data;

// operations on partitions
enum {
        FSSH_B_PARTITION_DEFRAGMENT,
        FSSH_B_PARTITION_REPAIR,
        FSSH_B_PARTITION_RESIZE,
        FSSH_B_PARTITION_RESIZE_CHILD,
        FSSH_B_PARTITION_MOVE,
        FSSH_B_PARTITION_MOVE_CHILD,
        FSSH_B_PARTITION_SET_NAME,
        FSSH_B_PARTITION_SET_CONTENT_NAME,
        FSSH_B_PARTITION_SET_TYPE,
        FSSH_B_PARTITION_SET_PARAMETERS,
        FSSH_B_PARTITION_SET_CONTENT_PARAMETERS,
        FSSH_B_PARTITION_INITIALIZE,
        FSSH_B_PARTITION_CREATE_CHILD,
        FSSH_B_PARTITION_DELETE_CHILD,
};

// disk device job cancel status
enum {
        FSSH_B_DISK_DEVICE_JOB_CONTINUE,
        FSSH_B_DISK_DEVICE_JOB_CANCEL,
        FSSH_B_DISK_DEVICE_JOB_REVERSE,
};

// disk device locking
fssh_disk_device_data*  fssh_write_lock_disk_device(
                                                                fssh_partition_id partitionID);
void                                    fssh_write_unlock_disk_device(
                                                                fssh_partition_id partitionID);
fssh_disk_device_data*  fssh_read_lock_disk_device(
                                                                fssh_partition_id partitionID);
void                                    fssh_read_unlock_disk_device(
                                                                fssh_partition_id partitionID);
        // parameter is the ID of any partition on the device

// getting disk devices/partitions by path
// (no locking required)
int32_t fssh_find_disk_device(const char *path);
int32_t fssh_find_partition(const char *path);

// disk device/partition read access
// (read lock required)
fssh_disk_device_data*  fssh_get_disk_device(fssh_partition_id partitionID);
fssh_partition_data*    fssh_get_partition(fssh_partition_id partitionID);
fssh_partition_data*    fssh_get_parent_partition(
                                                                fssh_partition_id partitionID);
fssh_partition_data*    fssh_get_child_partition(fssh_partition_id partitionID,
                                                                int32_t index);

// partition write access
// (write lock required)
fssh_partition_data*    fssh_create_child_partition(
                                                                fssh_partition_id partitionID, int32_t index,
                                                                fssh_partition_id childID);
        // childID is an optional input parameter -- -1 to be ignored
bool                                    fssh_delete_partition(fssh_partition_id partitionID);
void                                    fssh_partition_modified(fssh_partition_id partitionID);
        // tells the disk device manager, that the parition has been modified

fssh_status_t fssh_scan_partition(fssh_partition_id partitionID);
        // Service method for disks systems: Synchronously scans the partition.
        // Device must not be locked.

// disk systems
fssh_disk_system_id             fssh_find_disk_system(const char *name);

// jobs
bool            fssh_update_disk_device_job_progress(fssh_disk_job_id jobID,
                                        float progress);
bool            fssh_update_disk_device_job_extra_progress(fssh_disk_job_id jobID,
                                        const char *info);
bool            fssh_set_disk_device_job_error_message(fssh_disk_job_id jobID,
                                        const char *message);
uint32_t        fssh_update_disk_device_job_interrupt_properties(
                                        fssh_disk_job_id jobID, uint32_t interruptProperties);
        // returns one of B_DISK_DEVICE_JOB_{CONTINUE,CANCEL,REVERSE}

#ifdef __cplusplus
}
#endif

#endif  // _FSSH_DISK_DEVICE_MANAGER_H