cpukit/libblock: reformat style

Fixes #5445.
This commit is contained in:
Gedare Bloom
2026-02-05 09:29:52 -06:00
committed by Kinsey Moore
parent 3b08664764
commit 938915c1ad
36 changed files with 5482 additions and 5063 deletions
+60 -72
View File
@@ -235,8 +235,7 @@ extern "C" {
* </tr>
* </table>
*/
typedef enum
{
typedef enum {
/**
* @brief Free.
*/
@@ -305,35 +304,33 @@ typedef struct rtems_bdbuf_group rtems_bdbuf_group;
* speed-up buffer lookup descriptors are organized in AVL-Tree. The fields
* 'dd' and 'block' are search keys.
*/
typedef struct rtems_bdbuf_buffer
{
rtems_chain_node link; /**< Link the BD onto a number of lists. */
typedef struct rtems_bdbuf_buffer {
rtems_chain_node link; /**< Link the BD onto a number of lists. */
struct rtems_bdbuf_avl_node
{
struct rtems_bdbuf_buffer* left; /**< Left Child */
struct rtems_bdbuf_buffer* right; /**< Right Child */
signed char cache; /**< Cache */
signed char bal; /**< The balance of the sub-tree */
struct rtems_bdbuf_avl_node {
struct rtems_bdbuf_buffer *left; /**< Left Child */
struct rtems_bdbuf_buffer *right; /**< Right Child */
signed char cache; /**< Cache */
signed char bal; /**< The balance of the sub-tree */
} avl;
rtems_disk_device *dd; /**< disk device */
rtems_disk_device *dd; /**< disk device */
rtems_blkdev_bnum block; /**< block number on the device */
rtems_blkdev_bnum block; /**< block number on the device */
unsigned char* buffer; /**< Pointer to the buffer memory area */
unsigned char *buffer; /**< Pointer to the buffer memory area */
rtems_bdbuf_buf_state state; /**< State of the buffer. */
rtems_bdbuf_buf_state state; /**< State of the buffer. */
uint32_t waiters; /**< The number of threads waiting on this
uint32_t waiters; /**< The number of threads waiting on this
* buffer. */
rtems_bdbuf_group* group; /**< Pointer to the group of BDs this BD is
rtems_bdbuf_group *group; /**< Pointer to the group of BDs this BD is
* part of. */
uint32_t hold_timer; /**< Timer to indicate how long a buffer
uint32_t hold_timer; /**< Timer to indicate how long a buffer
* has been held in the cache modified. */
int references; /**< Allow reference counting by owner. */
void* user; /**< User data. */
int references; /**< Allow reference counting by owner. */
void *user; /**< User data. */
} rtems_bdbuf_buffer;
/**
@@ -343,15 +340,14 @@ typedef struct rtems_bdbuf_buffer
* buffers in the group, if there are more than 1 will also be that size. The
* number of buffers in a group is a multiple of 2, ie 1, 2, 4, 8, etc.
*/
struct rtems_bdbuf_group
{
struct rtems_bdbuf_group {
rtems_chain_node link; /**< Link the groups on a LRU list if they
* have no buffers in use. */
size_t bds_per_group; /**< The number of BD allocated to this
* group. This value must be a multiple of
* 2. */
uint32_t users; /**< How many users the block has. */
rtems_bdbuf_buffer* bdbuf; /**< First BD this block covers. */
rtems_bdbuf_buffer *bdbuf; /**< First BD this block covers. */
};
/**
@@ -373,15 +369,15 @@ typedef struct rtems_bdbuf_config {
* task. */
rtems_task_priority swapout_worker_priority; /**< Priority of the swap out
* task. */
size_t task_stack_size; /**< Task stack size for swap-out
size_t task_stack_size; /**< Task stack size for swap-out
* task and worker threads. */
size_t size; /**< Size of memory in the
size_t size; /**< Size of memory in the
* cache */
uint32_t buffer_min; /**< Minimum buffer size. */
uint32_t buffer_max; /**< Maximum buffer size
uint32_t buffer_min; /**< Minimum buffer size. */
uint32_t buffer_max; /**< Maximum buffer size
* supported. It is also the
* allocation size. */
rtems_task_priority read_ahead_priority; /**< Priority of the read-ahead
rtems_task_priority read_ahead_priority; /**< Priority of the read-ahead
* task. */
} rtems_bdbuf_config;
@@ -396,17 +392,17 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
* The default value for the maximum read-ahead blocks disables the read-ahead
* feature.
*/
#define RTEMS_BDBUF_MAX_READ_AHEAD_BLOCKS_DEFAULT 0
#define RTEMS_BDBUF_MAX_READ_AHEAD_BLOCKS_DEFAULT 0
/**
* Default maximum number of blocks to write at once.
*/
#define RTEMS_BDBUF_MAX_WRITE_BLOCKS_DEFAULT 16
#define RTEMS_BDBUF_MAX_WRITE_BLOCKS_DEFAULT 16
/**
* Default swap-out task priority.
*/
#define RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT 15
#define RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT 15
/**
* Default swap-out task swap period in milli seconds.
@@ -416,18 +412,18 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
/**
* Default swap-out task block hold time in milli seconds.
*/
#define RTEMS_BDBUF_SWAPOUT_TASK_BLOCK_HOLD_DEFAULT 1000
#define RTEMS_BDBUF_SWAPOUT_TASK_BLOCK_HOLD_DEFAULT 1000
/**
* Default swap-out worker tasks. Currently disabled.
*/
#define RTEMS_BDBUF_SWAPOUT_WORKER_TASKS_DEFAULT 0
#define RTEMS_BDBUF_SWAPOUT_WORKER_TASKS_DEFAULT 0
/**
* Default swap-out worker task priority. The same as the swap-out task.
*/
#define RTEMS_BDBUF_SWAPOUT_WORKER_TASK_PRIORITY_DEFAULT \
RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT
RTEMS_BDBUF_SWAPOUT_TASK_PRIORITY_DEFAULT
/**
* Default read-ahead task priority. The same as the swap-out task.
@@ -443,17 +439,17 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
/**
* Default size of memory allocated to the cache.
*/
#define RTEMS_BDBUF_CACHE_MEMORY_SIZE_DEFAULT (64 * 512)
#define RTEMS_BDBUF_CACHE_MEMORY_SIZE_DEFAULT ( 64 * 512 )
/**
* Default minimum size of buffers.
*/
#define RTEMS_BDBUF_BUFFER_MIN_SIZE_DEFAULT (512)
#define RTEMS_BDBUF_BUFFER_MIN_SIZE_DEFAULT ( 512 )
/**
* Default maximum size of buffers.
*/
#define RTEMS_BDBUF_BUFFER_MAX_SIZE_DEFAULT (4096)
#define RTEMS_BDBUF_BUFFER_MAX_SIZE_DEFAULT ( 4096 )
/**
* Prepare buffering layer to work - initialize buffer descritors and (if it is
@@ -467,8 +463,7 @@ extern const rtems_bdbuf_config rtems_bdbuf_configuration;
* @retval RTEMS_RESOURCE_IN_USE Already initialized.
* @retval RTEMS_UNSATISFIED Not enough resources.
*/
rtems_status_code
rtems_bdbuf_init (void);
rtems_status_code rtems_bdbuf_init( void );
/**
* Get block buffer for data to be written into. The buffers is set to the
@@ -498,11 +493,10 @@ rtems_bdbuf_init (void);
* @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_INVALID_ID Invalid block number.
*/
rtems_status_code
rtems_bdbuf_get (
rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer** bd
rtems_status_code rtems_bdbuf_get(
rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd
);
/**
@@ -532,11 +526,10 @@ rtems_bdbuf_get (
* @retval RTEMS_INVALID_ID Invalid block number.
* @retval RTEMS_IO_ERROR IO error.
*/
rtems_status_code
rtems_bdbuf_read (
rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer** bd
rtems_status_code rtems_bdbuf_read(
rtems_disk_device *dd,
rtems_blkdev_bnum block,
rtems_bdbuf_buffer **bd
);
/**
@@ -555,11 +548,10 @@ rtems_bdbuf_read (
* @param block [in] Linear media block number.
* @param nr_blocks [in] Number of consecutive blocks that can be pre-fetched.
*/
void
rtems_bdbuf_peek (
void rtems_bdbuf_peek(
rtems_disk_device *dd,
rtems_blkdev_bnum block,
uint32_t nr_blocks
rtems_blkdev_bnum block,
uint32_t nr_blocks
);
/**
@@ -581,8 +573,7 @@ rtems_bdbuf_peek (
* @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_INVALID_ADDRESS The reference is NULL.
*/
rtems_status_code
rtems_bdbuf_release (rtems_bdbuf_buffer* bd);
rtems_status_code rtems_bdbuf_release( rtems_bdbuf_buffer *bd );
/**
* Release the buffer allocated with a get or read call placing it on the
@@ -605,8 +596,7 @@ rtems_bdbuf_release (rtems_bdbuf_buffer* bd);
* @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_INVALID_ADDRESS The reference is NULL.
*/
rtems_status_code
rtems_bdbuf_release_modified (rtems_bdbuf_buffer* bd);
rtems_status_code rtems_bdbuf_release_modified( rtems_bdbuf_buffer *bd );
/**
* Release the buffer as modified and wait until it has been synchronized with
@@ -628,8 +618,7 @@ rtems_bdbuf_release_modified (rtems_bdbuf_buffer* bd);
* @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_INVALID_ADDRESS The reference is NULL.
*/
rtems_status_code
rtems_bdbuf_sync (rtems_bdbuf_buffer* bd);
rtems_status_code rtems_bdbuf_sync( rtems_bdbuf_buffer *bd );
/**
* Synchronize all modified buffers for this device with the disk and wait
@@ -648,8 +637,7 @@ rtems_bdbuf_sync (rtems_bdbuf_buffer* bd);
*
* @retval RTEMS_SUCCESSFUL Successful operation.
*/
rtems_status_code
rtems_bdbuf_syncdev (rtems_disk_device *dd);
rtems_status_code rtems_bdbuf_syncdev( rtems_disk_device *dd );
/**
* @brief Purges all buffers corresponding to the disk device @a dd.
@@ -662,8 +650,7 @@ rtems_bdbuf_syncdev (rtems_disk_device *dd);
*
* @param dd [in] The disk device.
*/
void
rtems_bdbuf_purge_dev (rtems_disk_device *dd);
void rtems_bdbuf_purge_dev( rtems_disk_device *dd );
/**
* @brief Sets the block size of a disk device.
@@ -689,23 +676,24 @@ rtems_bdbuf_purge_dev (rtems_disk_device *dd);
* @retval RTEMS_SUCCESSFUL Successful operation.
* @retval RTEMS_INVALID_NUMBER Invalid block size.
*/
rtems_status_code
rtems_bdbuf_set_block_size (rtems_disk_device *dd,
uint32_t block_size,
bool sync);
rtems_status_code rtems_bdbuf_set_block_size(
rtems_disk_device *dd,
uint32_t block_size,
bool sync
);
/**
* @brief Returns the block device statistics.
*/
void
rtems_bdbuf_get_device_stats (const rtems_disk_device *dd,
rtems_blkdev_stats *stats);
void rtems_bdbuf_get_device_stats(
const rtems_disk_device *dd,
rtems_blkdev_stats *stats
);
/**
* @brief Resets the block device statistics.
*/
void
rtems_bdbuf_reset_device_stats (rtems_disk_device *dd);
void rtems_bdbuf_reset_device_stats( rtems_disk_device *dd );
/** @} */
+28 -27
View File
@@ -226,17 +226,17 @@ typedef union {
* format recognized on the disk will be stored in @a format.
*/
rtems_status_code rtems_bdpart_read(
const char *disk_name,
rtems_bdpart_format *format,
const char *disk_name,
rtems_bdpart_format *format,
rtems_bdpart_partition *partitions,
size_t *count
size_t *count
);
/**
* @brief Sorts the partition table @a partitions with @a count partitions to
* have ascending begin blocks
*/
void rtems_bdpart_sort( rtems_bdpart_partition *partitions, size_t count);
void rtems_bdpart_sort( rtems_bdpart_partition *partitions, size_t count );
/**
* @brief Writes the partition table to the physical disk device with name
@@ -252,10 +252,10 @@ void rtems_bdpart_sort( rtems_bdpart_partition *partitions, size_t count);
* disk. Depending on the output format there are additional constrains.
*/
rtems_status_code rtems_bdpart_write(
const char *disk_name,
const rtems_bdpart_format *format,
const char *disk_name,
const rtems_bdpart_format *format,
const rtems_bdpart_partition *partitions,
size_t count
size_t count
);
/**
@@ -269,11 +269,11 @@ rtems_status_code rtems_bdpart_write(
* with respect to the output format in @a format.
*/
rtems_status_code rtems_bdpart_create(
const char *disk_name,
const char *disk_name,
const rtems_bdpart_format *format,
rtems_bdpart_partition *partitions,
const unsigned *distribution,
size_t count
rtems_bdpart_partition *partitions,
const unsigned *distribution,
size_t count
);
/**
@@ -288,9 +288,9 @@ rtems_status_code rtems_bdpart_create(
* @see rtems_blkdev_create_partition().
*/
rtems_status_code rtems_bdpart_register(
const char *disk_name,
const char *disk_name,
const rtems_bdpart_partition *partitions,
size_t count
size_t count
);
/**
@@ -299,7 +299,7 @@ rtems_status_code rtems_bdpart_register(
*
* @see rtems_bdpart_register() and rtems_fsmount().
*/
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name);
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name );
/**
* @brief Deletes the logical disks associated with the partitions of the disk
@@ -310,22 +310,25 @@ rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name);
* rtems_bdpart_read().
*/
rtems_status_code rtems_bdpart_unregister(
const char *disk_name,
const char *disk_name,
const rtems_bdpart_partition *partitions,
size_t count
size_t count
);
/**
* @brief Prints the partition table @a partitions with @a count partitions to
* standard output.
*/
void rtems_bdpart_dump( const rtems_bdpart_partition *partitions, size_t count);
void rtems_bdpart_dump(
const rtems_bdpart_partition *partitions,
size_t count
);
/**
* @brief Returns the partition type for the MBR partition type value
* @a mbr_type in @a type.
*/
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type);
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type );
/**
* @brief Converts the partition type in @a type to the MBR partition type.
@@ -336,7 +339,7 @@ void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type);
*/
bool rtems_bdpart_to_mbr_partition_type(
const uuid_t type,
uint8_t *mbr_type
uint8_t *mbr_type
);
/** @} */
@@ -352,7 +355,7 @@ bool rtems_bdpart_to_mbr_partition_type(
#define RTEMS_BDPART_MBR_OFFSET_TABLE_0 446
#define RTEMS_BDPART_MBR_OFFSET_TABLE_1 \
(RTEMS_BDPART_MBR_OFFSET_TABLE_0 + RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE)
( RTEMS_BDPART_MBR_OFFSET_TABLE_0 + RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE )
#define RTEMS_BDPART_MBR_OFFSET_DISK_ID 440
@@ -372,18 +375,16 @@ bool rtems_bdpart_to_mbr_partition_type(
#define RTEMS_BDPART_MBR_OFFSET_FLAGS 0
static inline uint8_t rtems_bdpart_mbr_partition_type(
const uuid_t type
)
static inline uint8_t rtems_bdpart_mbr_partition_type( const uuid_t type )
{
return type [0];
return type[ 0 ];
}
rtems_status_code rtems_bdpart_get_disk_data(
const char *disk_name,
int *fd_ptr,
const char *disk_name,
int *fd_ptr,
rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
rtems_blkdev_bnum *disk_end
);
#ifdef __cplusplus
+80 -87
View File
@@ -47,9 +47,9 @@ extern "C" {
* to avoid requests looping for ever.
*/
typedef enum rtems_blkdev_request_op {
RTEMS_BLKDEV_REQ_READ, /**< Read the requested blocks of data. */
RTEMS_BLKDEV_REQ_WRITE, /**< Write the requested blocks of data. */
RTEMS_BLKDEV_REQ_SYNC /**< Sync any data with the media. */
RTEMS_BLKDEV_REQ_READ, /**< Read the requested blocks of data. */
RTEMS_BLKDEV_REQ_WRITE, /**< Write the requested blocks of data. */
RTEMS_BLKDEV_REQ_SYNC /**< Sync any data with the media. */
} rtems_blkdev_request_op;
struct rtems_blkdev_request;
@@ -57,9 +57,9 @@ struct rtems_blkdev_request;
/**
* @brief Block device request done callback function type.
*/
typedef void (*rtems_blkdev_request_cb)(
typedef void ( *rtems_blkdev_request_cb )(
struct rtems_blkdev_request *req,
rtems_status_code status
rtems_status_code status
);
/**
@@ -142,7 +142,7 @@ typedef struct rtems_blkdev_request {
/**
* List of scatter or gather buffers.
*/
rtems_blkdev_sg_buffer bufs[RTEMS_ZERO_LENGTH_ARRAY];
rtems_blkdev_sg_buffer bufs[ RTEMS_ZERO_LENGTH_ARRAY ];
} rtems_blkdev_request;
/**
@@ -158,10 +158,10 @@ typedef struct rtems_blkdev_request {
*/
static inline void rtems_blkdev_request_done(
rtems_blkdev_request *req,
rtems_status_code status
rtems_status_code status
)
{
(*req->done)(req, status);
( *req->done )( req, status );
}
/**
@@ -170,83 +170,83 @@ static inline void rtems_blkdev_request_done(
* Only valid if the driver has returned the
* @ref RTEMS_BLKDEV_CAP_MULTISECTOR_CONT capability.
*/
#define RTEMS_BLKDEV_START_BLOCK(req) (req->bufs[0].block)
#define RTEMS_BLKDEV_START_BLOCK( req ) ( req->bufs[ 0 ].block )
/**
* @name IO Control Request Codes
*/
/**@{**/
#define RTEMS_BLKIO_REQUEST _IOWR('B', 1, rtems_blkdev_request)
#define RTEMS_BLKIO_GETMEDIABLKSIZE _IOR('B', 2, uint32_t)
#define RTEMS_BLKIO_GETBLKSIZE _IOR('B', 3, uint32_t)
#define RTEMS_BLKIO_SETBLKSIZE _IOW('B', 4, uint32_t)
#define RTEMS_BLKIO_GETSIZE _IOR('B', 5, rtems_blkdev_bnum)
#define RTEMS_BLKIO_SYNCDEV _IO('B', 6)
#define RTEMS_BLKIO_DELETED _IO('B', 7)
#define RTEMS_BLKIO_CAPABILITIES _IO('B', 8)
#define RTEMS_BLKIO_GETDISKDEV _IOR('B', 9, rtems_disk_device *)
#define RTEMS_BLKIO_PURGEDEV _IO('B', 10)
#define RTEMS_BLKIO_GETDEVSTATS _IOR('B', 11, rtems_blkdev_stats *)
#define RTEMS_BLKIO_RESETDEVSTATS _IO('B', 12)
#define RTEMS_BLKIO_REQUEST _IOWR( 'B', 1, rtems_blkdev_request )
#define RTEMS_BLKIO_GETMEDIABLKSIZE _IOR( 'B', 2, uint32_t )
#define RTEMS_BLKIO_GETBLKSIZE _IOR( 'B', 3, uint32_t )
#define RTEMS_BLKIO_SETBLKSIZE _IOW( 'B', 4, uint32_t )
#define RTEMS_BLKIO_GETSIZE _IOR( 'B', 5, rtems_blkdev_bnum )
#define RTEMS_BLKIO_SYNCDEV _IO( 'B', 6 )
#define RTEMS_BLKIO_DELETED _IO( 'B', 7 )
#define RTEMS_BLKIO_CAPABILITIES _IO( 'B', 8 )
#define RTEMS_BLKIO_GETDISKDEV _IOR( 'B', 9, rtems_disk_device * )
#define RTEMS_BLKIO_PURGEDEV _IO( 'B', 10 )
#define RTEMS_BLKIO_GETDEVSTATS _IOR( 'B', 11, rtems_blkdev_stats * )
#define RTEMS_BLKIO_RESETDEVSTATS _IO( 'B', 12 )
/** @} */
static inline int rtems_disk_fd_get_media_block_size(
int fd,
int fd,
uint32_t *media_block_size
)
{
return ioctl(fd, RTEMS_BLKIO_GETMEDIABLKSIZE, media_block_size);
return ioctl( fd, RTEMS_BLKIO_GETMEDIABLKSIZE, media_block_size );
}
static inline int rtems_disk_fd_get_block_size(int fd, uint32_t *block_size)
static inline int rtems_disk_fd_get_block_size( int fd, uint32_t *block_size )
{
return ioctl(fd, RTEMS_BLKIO_GETBLKSIZE, block_size);
return ioctl( fd, RTEMS_BLKIO_GETBLKSIZE, block_size );
}
static inline int rtems_disk_fd_set_block_size(int fd, uint32_t block_size)
static inline int rtems_disk_fd_set_block_size( int fd, uint32_t block_size )
{
return ioctl(fd, RTEMS_BLKIO_SETBLKSIZE, &block_size);
return ioctl( fd, RTEMS_BLKIO_SETBLKSIZE, &block_size );
}
static inline int rtems_disk_fd_get_block_count(
int fd,
int fd,
rtems_blkdev_bnum *block_count
)
{
return ioctl(fd, RTEMS_BLKIO_GETSIZE, block_count);
return ioctl( fd, RTEMS_BLKIO_GETSIZE, block_count );
}
static inline int rtems_disk_fd_get_disk_device(
int fd,
int fd,
rtems_disk_device **dd_ptr
)
{
return ioctl(fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr);
return ioctl( fd, RTEMS_BLKIO_GETDISKDEV, dd_ptr );
}
static inline int rtems_disk_fd_sync(int fd)
static inline int rtems_disk_fd_sync( int fd )
{
return ioctl(fd, RTEMS_BLKIO_SYNCDEV);
return ioctl( fd, RTEMS_BLKIO_SYNCDEV );
}
static inline int rtems_disk_fd_purge(int fd)
static inline int rtems_disk_fd_purge( int fd )
{
return ioctl(fd, RTEMS_BLKIO_PURGEDEV);
return ioctl( fd, RTEMS_BLKIO_PURGEDEV );
}
static inline int rtems_disk_fd_get_device_stats(
int fd,
int fd,
rtems_blkdev_stats *stats
)
{
return ioctl(fd, RTEMS_BLKIO_GETDEVSTATS, stats);
return ioctl( fd, RTEMS_BLKIO_GETDEVSTATS, stats );
}
static inline int rtems_disk_fd_reset_device_stats(int fd)
static inline int rtems_disk_fd_reset_device_stats( int fd )
{
return ioctl(fd, RTEMS_BLKIO_RESETDEVSTATS);
return ioctl( fd, RTEMS_BLKIO_RESETDEVSTATS );
}
/**
@@ -261,14 +261,14 @@ static inline int rtems_disk_fd_reset_device_stats(int fd)
* inorder so the ATA multi-sector command for example can be used. This is a
* hack to work around the current ATA driver.
*/
#define RTEMS_BLKDEV_CAP_MULTISECTOR_CONT (1 << 0)
#define RTEMS_BLKDEV_CAP_MULTISECTOR_CONT ( 1 << 0 )
/**
* @brief The driver will accept a sync call.
*
* A sync call is made to a driver after a bdbuf cache sync has finished.
*/
#define RTEMS_BLKDEV_CAP_SYNC (1 << 1)
#define RTEMS_BLKDEV_CAP_SYNC ( 1 << 1 )
/** @} */
@@ -278,8 +278,7 @@ static inline int rtems_disk_fd_reset_device_stats(int fd)
* Use this in all block devices to handle the common set of IO control
* requests.
*/
int
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
int rtems_blkdev_ioctl( rtems_disk_device *dd, uint32_t req, void *argp );
/**
* @brief Creates a block device.
@@ -302,11 +301,11 @@ rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
* rtems_blkdev_request.
*/
rtems_status_code rtems_blkdev_create(
const char *device,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
const char *device,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
rtems_block_device_ioctl handler,
void *driver_data
void *driver_data
);
/**
@@ -335,8 +334,8 @@ rtems_status_code rtems_blkdev_create(
* @see rtems_blkdev_create() and rtems_bdbuf_set_block_size().
*/
rtems_status_code rtems_blkdev_create_partition(
const char *partition,
const char *parent_block_device,
const char *partition,
const char *parent_block_device,
rtems_blkdev_bnum media_block_begin,
rtems_blkdev_bnum media_block_count
);
@@ -346,10 +345,10 @@ rtems_status_code rtems_blkdev_create_partition(
*/
void rtems_blkdev_print_stats(
const rtems_blkdev_stats *stats,
uint32_t media_block_size,
uint32_t media_block_count,
uint32_t block_size,
const rtems_printer* printer
uint32_t media_block_size,
uint32_t media_block_count,
uint32_t block_size,
const rtems_printer *printer
);
/**
@@ -357,8 +356,8 @@ void rtems_blkdev_print_stats(
*/
void rtems_blkstats(
const rtems_printer *printer,
const char *device,
bool reset
const char *device,
bool reset
);
/** @} */
@@ -380,55 +379,49 @@ void rtems_blkstats(
* driver should provide an initialize entry point, which registers the
* appropriate IO control handler.
*/
#define RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES \
rtems_blkdev_generic_open, \
rtems_blkdev_generic_close, \
rtems_blkdev_generic_read, \
rtems_blkdev_generic_write, \
rtems_blkdev_generic_ioctl
#define RTEMS_GENERIC_BLOCK_DEVICE_DRIVER_ENTRIES \
rtems_blkdev_generic_open, rtems_blkdev_generic_close, \
rtems_blkdev_generic_read, rtems_blkdev_generic_write, \
rtems_blkdev_generic_ioctl
/* Use rtems_blkdev_create() instead */
RTEMS_DEPRECATED rtems_device_driver
rtems_blkdev_generic_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_read(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
);
/* Use rtems_blkdev_create() instead */
RTEMS_DEPRECATED rtems_device_driver
rtems_blkdev_generic_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_write(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
);
/* Use rtems_blkdev_create() instead */
RTEMS_DEPRECATED rtems_device_driver
rtems_blkdev_generic_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
);
/* Use rtems_blkdev_create() instead */
RTEMS_DEPRECATED rtems_device_driver
rtems_blkdev_generic_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_close(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
);
/* Use rtems_blkdev_create() instead */
RTEMS_DEPRECATED rtems_device_driver
rtems_blkdev_generic_ioctl(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg
RTEMS_DEPRECATED rtems_device_driver rtems_blkdev_generic_ioctl(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
);
/* Use rtems_blkdev_create() instead */
RTEMS_DEPRECATED extern const rtems_driver_address_table rtems_blkdev_generic_ops;
RTEMS_DEPRECATED extern const rtems_driver_address_table
rtems_blkdev_generic_ops;
/** @} */
+33 -39
View File
@@ -47,21 +47,21 @@ typedef uint32_t rtems_blkdev_bnum;
/**
* @brief Block device IO control handler type.
*/
typedef int (*rtems_block_device_ioctl)(
typedef int ( *rtems_block_device_ioctl )(
rtems_disk_device *dd,
uint32_t req,
void *argp
uint32_t req,
void *argp
);
/**
* @brief Trigger value to disable further read-ahead requests.
*/
#define RTEMS_DISK_READ_AHEAD_NO_TRIGGER ((rtems_blkdev_bnum) -1)
#define RTEMS_DISK_READ_AHEAD_NO_TRIGGER ( ( rtems_blkdev_bnum ) - 1 )
/**
* @brief Size value to set number of blocks based on config and disk size.
*/
#define RTEMS_DISK_READ_AHEAD_SIZE_AUTO (0)
#define RTEMS_DISK_READ_AHEAD_SIZE_AUTO ( 0 )
/**
* @brief Block device read-ahead control.
@@ -306,24 +306,20 @@ RTEMS_DEPRECATED static inline dev_t rtems_disk_get_device_identifier(
}
/* Use fstat() instead */
RTEMS_DEPRECATED static inline rtems_device_major_number rtems_disk_get_major_number(
const rtems_disk_device *dd
)
RTEMS_DEPRECATED static inline rtems_device_major_number
rtems_disk_get_major_number( const rtems_disk_device *dd )
{
return rtems_filesystem_dev_major_t(dd->dev);
return rtems_filesystem_dev_major_t( dd->dev );
}
/* Use fstat() instead */
RTEMS_DEPRECATED static inline rtems_device_minor_number rtems_disk_get_minor_number(
const rtems_disk_device *dd
)
RTEMS_DEPRECATED static inline rtems_device_minor_number
rtems_disk_get_minor_number( const rtems_disk_device *dd )
{
return rtems_filesystem_dev_minor_t(dd->dev);
return rtems_filesystem_dev_minor_t( dd->dev );
}
static inline void *rtems_disk_get_driver_data(
const rtems_disk_device *dd
)
static inline void *rtems_disk_get_driver_data( const rtems_disk_device *dd )
{
return dd->driver_data;
}
@@ -335,9 +331,7 @@ static inline uint32_t rtems_disk_get_media_block_size(
return dd->media_block_size;
}
static inline uint32_t rtems_disk_get_block_size(
const rtems_disk_device *dd
)
static inline uint32_t rtems_disk_get_block_size( const rtems_disk_device *dd )
{
return dd->block_size;
}
@@ -365,40 +359,40 @@ static inline rtems_blkdev_bnum rtems_disk_get_block_count(
/* Use rtems_blkdev_create() instead */
RTEMS_DEPRECATED rtems_status_code rtems_disk_create_phys(
dev_t dev,
uint32_t block_size,
rtems_blkdev_bnum block_count,
dev_t dev,
uint32_t block_size,
rtems_blkdev_bnum block_count,
rtems_block_device_ioctl handler,
void *driver_data,
const char *name
void *driver_data,
const char *name
);
/* Use rtems_blkdev_create_partition() instead */
RTEMS_DEPRECATED rtems_status_code rtems_disk_create_log(
dev_t dev,
dev_t phys,
dev_t dev,
dev_t phys,
rtems_blkdev_bnum block_begin,
rtems_blkdev_bnum block_count,
const char *name
const char *name
);
/*
* Use rtems_blkdev_create() or rtems_blkdev_create_partition and unlink()
* instead.
*/
RTEMS_DEPRECATED rtems_status_code rtems_disk_delete(dev_t dev);
RTEMS_DEPRECATED rtems_status_code rtems_disk_delete( dev_t dev );
/*
* Use rtems_blkdev_create() or rtems_blkdev_create_partition and open()
* instead.
*/
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_obtain(dev_t dev);
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_obtain( dev_t dev );
/*
* Use rtems_blkdev_create() or rtems_blkdev_create_partition and close()
* instead.
*/
RTEMS_DEPRECATED rtems_status_code rtems_disk_release(rtems_disk_device *dd);
RTEMS_DEPRECATED rtems_status_code rtems_disk_release( rtems_disk_device *dd );
/** @} */
@@ -408,10 +402,10 @@ RTEMS_DEPRECATED rtems_status_code rtems_disk_release(rtems_disk_device *dd);
/**@{**/
/* Just remove calls to this function */
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_initialize(void);
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_initialize( void );
/* Just remove calls to this function */
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_done(void);
RTEMS_DEPRECATED rtems_status_code rtems_disk_io_done( void );
/** @} */
@@ -421,23 +415,23 @@ RTEMS_DEPRECATED rtems_status_code rtems_disk_io_done(void);
* This functionality no longer available. There is no global registration for
* disk devices.
*/
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_next(dev_t dev);
RTEMS_DEPRECATED rtems_disk_device *rtems_disk_next( dev_t dev );
/* Internal function, do not use */
rtems_status_code rtems_disk_init_phys(
rtems_disk_device *dd,
uint32_t block_size,
rtems_blkdev_bnum block_count,
rtems_disk_device *dd,
uint32_t block_size,
rtems_blkdev_bnum block_count,
rtems_block_device_ioctl handler,
void *driver_data
void *driver_data
);
/* Internal function, do not use */
rtems_status_code rtems_disk_init_log(
rtems_disk_device *dd,
rtems_disk_device *phys_dd,
rtems_blkdev_bnum block_begin,
rtems_blkdev_bnum block_count
rtems_blkdev_bnum block_begin,
rtems_blkdev_bnum block_count
);
#ifdef __cplusplus
+57 -63
View File
@@ -57,42 +57,40 @@
#include <rtems/seterr.h>
/* Minor base number for all logical devices */
#define RTEMS_IDE_SECTOR_BITS 9
#define RTEMS_IDE_SECTOR_SIZE 512
#define RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE 16
#define RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER 63
#define RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER 4
#define RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX 16
#define RTEMS_IDE_SECTOR_BITS 9
#define RTEMS_IDE_SECTOR_SIZE 512
#define RTEMS_IDE_PARTITION_DESCRIPTOR_SIZE 16
#define RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER 63
#define RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER 4
#define RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX 16
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA1 0x55
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA2 0xaa
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_OFFSET 0x1fe
#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be
#define RTEMS_IDE_PARTITION_TABLE_SIZE (4 * 16)
#define RTEMS_IDE_PARTITION_BOOTABLE_OFFSET 0
#define RTEMS_IDE_PARTITION_SYS_TYPE_OFFSET 4
#define RTEMS_IDE_PARTITION_START_OFFSET 8
#define RTEMS_IDE_PARTITION_SIZE_OFFSET 12
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA1 0x55
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_DATA2 0xaa
#define RTEMS_IDE_PARTITION_MSDOS_SIGNATURE_OFFSET 0x1fe
#define RTEMS_IDE_PARTITION_TABLE_OFFSET 0x1be
#define RTEMS_IDE_PARTITION_TABLE_SIZE ( 4 * 16 )
#define RTEMS_IDE_PARTITION_BOOTABLE_OFFSET 0
#define RTEMS_IDE_PARTITION_SYS_TYPE_OFFSET 4
#define RTEMS_IDE_PARTITION_START_OFFSET 8
#define RTEMS_IDE_PARTITION_SIZE_OFFSET 12
/*
* Conversion from and to little-endian byte order. (no-op on i386/i486)
*/
#define LE_TO_CPU_U16(v) le16toh(v)
#define LE_TO_CPU_U32(v) le32toh(v)
#define CPU_TO_LE_U16(v) htole16(v)
#define CPU_TO_LE_U32(v) htole32(v)
#define LE_TO_CPU_U16( v ) le16toh( v )
#define LE_TO_CPU_U32( v ) le32toh( v )
#define CPU_TO_LE_U16( v ) htole16( v )
#define CPU_TO_LE_U32( v ) htole32( v )
/*
* sector_data_t --
* corresponds to the sector on the device
*/
typedef struct rtems_sector_data_s
{
uint32_t sector_num; /* sector number on the device */
uint8_t data[RTEMS_ZERO_LENGTH_ARRAY]; /* raw sector data */
typedef struct rtems_sector_data_s {
uint32_t sector_num; /* sector number on the device */
uint8_t data[ RTEMS_ZERO_LENGTH_ARRAY ]; /* raw sector data */
} rtems_sector_data_t;
/*
* Enum partition types
* see list at http://ata-atapi.com/hiwtab.htm
@@ -100,24 +98,23 @@ typedef struct rtems_sector_data_s
* @todo Should these have RTEMS before them.
*/
enum {
EMPTY_PARTITION = 0x00,
DOS_FAT12_PARTITION = 0x01,
DOS_FAT16_PARTITION = 0x04,
EXTENDED_PARTITION = 0x05,
DOS_P32MB_PARTITION = 0x06,
FAT32_PARTITION = 0x0B,
FAT32_LBA_PARTITION = 0x0C,
FAT16_LBA_PARTITION = 0x0E,
DM6_PARTITION = 0x54,
EZD_PARTITION = 0x55,
DM6_AUX1PARTITION = 0x51,
DM6_AUX3PARTITION = 0x53,
LINUX_SWAP = 0x82,
LINUX_NATIVE = 0x83,
LINUX_EXTENDED = 0x85
EMPTY_PARTITION = 0x00,
DOS_FAT12_PARTITION = 0x01,
DOS_FAT16_PARTITION = 0x04,
EXTENDED_PARTITION = 0x05,
DOS_P32MB_PARTITION = 0x06,
FAT32_PARTITION = 0x0B,
FAT32_LBA_PARTITION = 0x0C,
FAT16_LBA_PARTITION = 0x0E,
DM6_PARTITION = 0x54,
EZD_PARTITION = 0x55,
DM6_AUX1PARTITION = 0x51,
DM6_AUX3PARTITION = 0x53,
LINUX_SWAP = 0x82,
LINUX_NATIVE = 0x83,
LINUX_EXTENDED = 0x85
};
/* Forward declaration */
struct rtems_disk_desc_s;
@@ -126,35 +123,34 @@ struct rtems_disk_desc_s;
* contains all neccessary information about partition
*/
typedef struct rtems_part_desc_s {
uint8_t bootable; /* is the partition active */
uint8_t sys_type; /* type of partition */
uint8_t log_id; /* logical number of partition */
uint32_t start; /* first partition sector, in absolute
uint8_t bootable; /* is the partition active */
uint8_t sys_type; /* type of partition */
uint8_t log_id; /* logical number of partition */
uint32_t start; /* first partition sector, in absolute
* numeration */
uint32_t size; /* size in sectors */
uint32_t end; /* last partition sector, end = start + size - 1 */
struct rtems_disk_desc_s *disk_desc; /* descriptor of disk, partition
uint32_t size; /* size in sectors */
uint32_t end; /* last partition sector, end = start + size - 1 */
struct rtems_disk_desc_s *disk_desc; /* descriptor of disk, partition
* contains in */
struct rtems_part_desc_s *ext_part; /* extended partition containing this
struct rtems_part_desc_s *ext_part; /* extended partition containing this
* one */
/* partitions, containing in this one */
struct rtems_part_desc_s *sub_part[RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER];
/* partitions, containing in this one */
struct rtems_part_desc_s
*sub_part[ RTEMS_IDE_PARTITION_MAX_SUB_PARTITION_NUMBER ];
} rtems_part_desc_t;
typedef struct rtems_disk_desc_s {
/* device name in /dev filesystem */
char dev_name[RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX];
/* device name in /dev filesystem */
char dev_name[ RTEMS_IDE_PARTITION_DEV_NAME_LENGTH_MAX ];
uint32_t sector_size; /* size of sector */
uint32_t sector_bits; /* the base-2 logarithm of sector_size */
uint32_t lba_size; /* total amount of sectors in lba address mode */
int last_log_id; /* used for logical disks enumerating */
uint32_t sector_size; /* size of sector */
uint32_t sector_bits; /* the base-2 logarithm of sector_size */
uint32_t lba_size; /* total amount of sectors in lba address mode */
int last_log_id; /* used for logical disks enumerating */
/* primary partition descriptors */
rtems_part_desc_t *partitions[RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER];
/* primary partition descriptors */
rtems_part_desc_t *partitions[ RTEMS_IDE_PARTITION_MAX_PARTITION_NUMBER ];
} rtems_disk_desc_t;
#ifdef __cplusplus
@@ -178,7 +174,6 @@ void rtems_ide_part_table_free(
rtems_disk_desc_t *disk_desc
) RTEMS_DEPRECATED;
/*
* rtems_ide_part_table_get --
* reads partition table structure from the device
@@ -195,11 +190,10 @@ void rtems_ide_part_table_free(
* @deprecated Use the @ref rtems_bdpart "block device partition module" instead.
*/
rtems_status_code rtems_ide_part_table_get(
const char *dev_name,
const char *dev_name,
rtems_disk_desc_t *disk_desc
) RTEMS_DEPRECATED;
/*
* rtems_ide_part_table_initialize --
* initializes logical devices on the physical IDE drive
+14 -18
View File
@@ -12,7 +12,6 @@
#ifndef _RTEMS_RAMDISK_H
#define _RTEMS_RAMDISK_H
#include <rtems.h>
#include <rtems/blkdev.h>
@@ -60,7 +59,7 @@ typedef struct rtems_ramdisk_config {
*
* The configuration table is provided by the application.
*/
extern rtems_ramdisk_config rtems_ramdisk_configuration [];
extern rtems_ramdisk_config rtems_ramdisk_configuration[];
/**
* @brief External reference the size of the RAM disk configuration table
@@ -74,19 +73,16 @@ extern size_t rtems_ramdisk_configuration_size;
* @brief RAM disk driver initialization entry point.
*/
rtems_device_driver ramdisk_initialize(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
);
/**
* RAM disk driver table entry.
*/
#define RAMDISK_DRIVER_TABLE_ENTRY \
{ \
ramdisk_initialize, \
NULL, NULL, NULL, NULL, NULL \
}
{ ramdisk_initialize, NULL, NULL, NULL, NULL, NULL }
#define RAMDISK_DEVICE_BASE_NAME "/dev/rd"
@@ -137,7 +133,7 @@ typedef struct ramdisk {
bool free_at_delete_request;
} ramdisk;
int ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
int ramdisk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp );
/**
* @brief Allocates and initializes a RAM disk descriptor.
@@ -182,15 +178,15 @@ int ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp);
* @endcode
*/
ramdisk *ramdisk_allocate(
void *area_begin,
uint32_t media_block_size,
void *area_begin,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
bool trace
bool trace
);
void ramdisk_free(ramdisk *rd);
void ramdisk_free( ramdisk *rd );
static inline void ramdisk_enable_free_at_delete_request(ramdisk *rd)
static inline void ramdisk_enable_free_at_delete_request( ramdisk *rd )
{
rd->free_at_delete_request = true;
}
@@ -207,10 +203,10 @@ static inline void ramdisk_enable_free_at_delete_request(ramdisk *rd)
* @retval RTEMS_UNSATISFIED Something is wrong.
*/
rtems_status_code ramdisk_register(
uint32_t media_block_size,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
bool trace,
const char *disk
bool trace,
const char *disk
);
/** @} */
+1276 -1249
View File
File diff suppressed because it is too large Load Diff
+34 -33
View File
@@ -41,66 +41,67 @@
#include <rtems/bdpart.h>
rtems_status_code rtems_bdpart_create(
const char *disk_name,
const char *disk_name,
const rtems_bdpart_format *format,
rtems_bdpart_partition *pt,
const unsigned *dist,
size_t count
rtems_bdpart_partition *pt,
const unsigned *dist,
size_t count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
bool dos_compatibility = format != NULL &&
format->type == RTEMS_BDPART_FORMAT_MBR &&
format->mbr.dos_compatibility;
rtems_blkdev_bnum disk_end = 0;
rtems_blkdev_bnum pos = 0;
rtems_blkdev_bnum dist_sum = 0;
rtems_blkdev_bnum record_space =
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
rtems_blkdev_bnum record_space = dos_compatibility
? RTEMS_BDPART_MBR_CYLINDER_SIZE
: 1;
rtems_blkdev_bnum overhead = 0;
rtems_blkdev_bnum free_space = 0;
size_t i = 0;
size_t i = 0;
/* Check if we have something to do */
if (count == 0) {
if ( count == 0 ) {
/* Nothing to do */
return RTEMS_SUCCESSFUL;
}
/* Check parameter */
if (format == NULL || pt == NULL || dist == NULL) {
if ( format == NULL || pt == NULL || dist == NULL ) {
return RTEMS_INVALID_ADDRESS;
}
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, NULL, NULL, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_get_disk_data( disk_name, NULL, NULL, &disk_end );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
/* Get distribution sum and check for overflow */
for (i = 0; i < count; ++i) {
for ( i = 0; i < count; ++i ) {
unsigned prev_sum = dist_sum;
dist_sum += dist [i];
dist_sum += dist[ i ];
if (dist_sum < prev_sum) {
if ( dist_sum < prev_sum ) {
return RTEMS_INVALID_NUMBER;
}
if (dist [i] == 0) {
if ( dist[ i ] == 0 ) {
return RTEMS_INVALID_NUMBER;
}
}
/* Check format */
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
if ( format->type != RTEMS_BDPART_FORMAT_MBR ) {
return RTEMS_NOT_IMPLEMENTED;
}
/* Align end of disk on cylinder boundary if necessary */
if (dos_compatibility) {
disk_end -= (disk_end % record_space);
if ( dos_compatibility ) {
disk_end -= ( disk_end % record_space );
}
/*
@@ -113,20 +114,20 @@ rtems_status_code rtems_bdpart_create(
* In case we need an extended partition and logical partitions we have to
* account for the space of each EBR.
*/
if (count > 4) {
overhead += (count - 3) * record_space;
if ( count > 4 ) {
overhead += ( count - 3 ) * record_space;
}
/*
* Account space to align every partition on cylinder boundaries if
* necessary.
*/
if (dos_compatibility) {
overhead += (count - 1) * record_space;
if ( dos_compatibility ) {
overhead += ( count - 1 ) * record_space;
}
/* Check disk space */
if ((overhead + count) > disk_end) {
if ( ( overhead + count ) > disk_end ) {
return RTEMS_IO_ERROR;
}
@@ -136,27 +137,27 @@ rtems_status_code rtems_bdpart_create(
/* Space for partitions */
free_space = disk_end - overhead;
for (i = 0; i < count; ++i) {
for ( i = 0; i < count; ++i ) {
rtems_bdpart_partition *p = pt + i;
/* Partition size */
rtems_blkdev_bnum s = free_space * dist [i];
if (s < free_space || s < dist [i]) {
rtems_blkdev_bnum s = free_space * dist[ i ];
if ( s < free_space || s < dist[ i ] ) {
/* TODO: Calculate without overflow */
return RTEMS_INVALID_NUMBER;
}
s /= dist_sum;
/* Ensure that the partition is not empty */
if (s == 0) {
if ( s == 0 ) {
s = 1;
}
/* Align partition upwards */
s += record_space - (s % record_space);
s += record_space - ( s % record_space );
/* Reserve space for the EBR if necessary */
if (count > 4 && i > 2) {
if ( count > 4 && i > 2 ) {
pos += record_space;
}
@@ -167,7 +168,7 @@ rtems_status_code rtems_bdpart_create(
}
/* Expand the last partition to the disk end */
pt [count - 1].end = disk_end;
pt[ count - 1 ].end = disk_end;
return RTEMS_SUCCESSFUL;
}
+19 -15
View File
@@ -43,15 +43,12 @@
#include <rtems.h>
#include <rtems/bdpart.h>
static void rtems_bdpart_type_to_string(
const uuid_t type,
char str [37]
)
static void rtems_bdpart_type_to_string( const uuid_t type, char str[ 37 ] )
{
uuid_unparse_lower( type, str);
uuid_unparse_lower( type, str );
}
void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count )
{
size_t i = 0;
@@ -63,14 +60,14 @@ void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
"------------+------------+-----------------------------------------------------\n"
);
for (i = 0; i < count; ++i) {
for ( i = 0; i < count; ++i ) {
const rtems_bdpart_partition *p = pt + i;
const char *type = NULL;
char type_buffer [52];
uint8_t type_mbr = 0;
const char *type = NULL;
char type_buffer[ 52 ];
uint8_t type_mbr = 0;
if (rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr)) {
switch (type_mbr) {
if ( rtems_bdpart_to_mbr_partition_type( p->type, &type_mbr ) ) {
switch ( type_mbr ) {
case RTEMS_BDPART_MBR_FAT_12:
type = "FAT 12";
break;
@@ -90,12 +87,17 @@ void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
type = "DATA";
break;
default:
snprintf( type_buffer, sizeof( type_buffer), "0x%02" PRIx8, type_mbr);
snprintf(
type_buffer,
sizeof( type_buffer ),
"0x%02" PRIx8,
type_mbr
);
type = type_buffer;
break;
}
} else {
rtems_bdpart_type_to_string( p->type, type_buffer);
rtems_bdpart_type_to_string( p->type, type_buffer );
type = type_buffer;
}
@@ -107,5 +109,7 @@ void rtems_bdpart_dump( const rtems_bdpart_partition *pt, size_t count)
);
}
puts( "------------+------------+-----------------------------------------------------");
puts(
"------------+------------+-----------------------------------------------------"
);
}
+122 -112
View File
@@ -46,64 +46,71 @@
#include <rtems/bdpart.h>
#include <rtems/endian.h>
#define RTEMS_BDPART_MBR_PARTITION_TYPE( type) \
{ \
(type), 0xa2U, 0x2eU, 0x38U, \
0x38U, 0xb5U, 0xdeU, 0x11U, \
0xbcU, 0x13U, 0x00U, 0x1dU, \
0x09U, 0xb0U, 0x5fU, 0xa4U \
}
#define RTEMS_BDPART_MBR_PARTITION_TYPE( type ) \
{ ( type ), \
0xa2U, \
0x2eU, \
0x38U, \
0x38U, \
0xb5U, \
0xdeU, \
0x11U, \
0xbcU, \
0x13U, \
0x00U, \
0x1dU, \
0x09U, \
0xb0U, \
0x5fU, \
0xa4U }
static const uuid_t RTEMS_BDPART_MBR_MASTER_TYPE =
RTEMS_BDPART_MBR_PARTITION_TYPE( RTEMS_BDPART_MBR_EMPTY);
RTEMS_BDPART_MBR_PARTITION_TYPE( RTEMS_BDPART_MBR_EMPTY );
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type)
void rtems_bdpart_to_partition_type( uint8_t mbr_type, uuid_t type )
{
type [0] = mbr_type;
memcpy( type + 1, RTEMS_BDPART_MBR_MASTER_TYPE + 1, sizeof( uuid_t) - 1);
type[ 0 ] = mbr_type;
memcpy( type + 1, RTEMS_BDPART_MBR_MASTER_TYPE + 1, sizeof( uuid_t ) - 1 );
}
bool rtems_bdpart_to_mbr_partition_type(
const uuid_t type,
uint8_t *mbr_type
)
bool rtems_bdpart_to_mbr_partition_type( const uuid_t type, uint8_t *mbr_type )
{
*mbr_type = rtems_bdpart_mbr_partition_type( type);
*mbr_type = rtems_bdpart_mbr_partition_type( type );
return memcmp(
type + 1,
RTEMS_BDPART_MBR_MASTER_TYPE + 1,
sizeof( uuid_t) - 1
) == 0;
type + 1,
RTEMS_BDPART_MBR_MASTER_TYPE + 1,
sizeof( uuid_t ) - 1
) == 0;
}
/*
* FIXME: This code should the deviceio interface and not the bdbug interface.
*/
rtems_status_code rtems_bdpart_get_disk_data(
const char *disk_name,
int *fd_ptr,
const char *disk_name,
int *fd_ptr,
rtems_disk_device **dd_ptr,
rtems_blkdev_bnum *disk_end
rtems_blkdev_bnum *disk_end
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
int rv = 0;
int fd;
rtems_status_code sc = RTEMS_SUCCESSFUL;
int rv = 0;
int fd;
rtems_disk_device *dd = NULL;
rtems_blkdev_bnum disk_begin = 0;
rtems_blkdev_bnum block_size = 0;
rtems_blkdev_bnum disk_begin = 0;
rtems_blkdev_bnum block_size = 0;
/* Open device file */
fd = open( disk_name, O_RDWR);
if (fd < 0) {
fd = open( disk_name, O_RDWR );
if ( fd < 0 ) {
sc = RTEMS_INVALID_NAME;
goto out;
}
/* Get disk handle */
rv = rtems_disk_fd_get_disk_device( fd, &dd);
if (rv != 0) {
rv = rtems_disk_fd_get_disk_device( fd, &dd );
if ( rv != 0 ) {
sc = RTEMS_INVALID_NAME;
goto error;
}
@@ -114,45 +121,46 @@ rtems_status_code rtems_bdpart_get_disk_data(
block_size = dd->block_size;
/* Check block size */
if (block_size < RTEMS_BDPART_BLOCK_SIZE) {
if ( block_size < RTEMS_BDPART_BLOCK_SIZE ) {
sc = RTEMS_IO_ERROR;
goto error;
}
/* Check that we have do not have a logical disk */
if (disk_begin != 0) {
if ( disk_begin != 0 ) {
sc = RTEMS_IO_ERROR;
goto error;
}
error:
if (sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL) {
if ( sc == RTEMS_SUCCESSFUL && fd_ptr != NULL && dd_ptr != NULL ) {
*fd_ptr = fd;
*dd_ptr = dd;
} else {
close( fd);
close( fd );
}
out:
return sc;
}
static bool rtems_bdpart_is_valid_record( const uint8_t *data)
static bool rtems_bdpart_is_valid_record( const uint8_t *data )
{
return data [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0]
== RTEMS_BDPART_MBR_SIGNATURE_0
&& data [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1]
== RTEMS_BDPART_MBR_SIGNATURE_1;
return data[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0 ] ==
RTEMS_BDPART_MBR_SIGNATURE_0 &&
data[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1 ] ==
RTEMS_BDPART_MBR_SIGNATURE_1;
}
static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data)
static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data )
{
rtems_blkdev_bnum begin =
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
rtems_blkdev_bnum begin = rtems_uint32_from_little_endian(
data + RTEMS_BDPART_MBR_OFFSET_BEGIN
);
uint8_t type = data[ RTEMS_BDPART_MBR_OFFSET_TYPE ];
if (type == RTEMS_BDPART_MBR_EXTENDED) {
if ( type == RTEMS_BDPART_MBR_EXTENDED ) {
return begin;
} else {
return 0;
@@ -160,65 +168,67 @@ static rtems_blkdev_bnum rtems_bdpart_next_ebr( const uint8_t *data)
}
static rtems_status_code rtems_bdpart_read_mbr_partition(
const uint8_t *data,
rtems_bdpart_partition **p,
const uint8_t *data,
rtems_bdpart_partition **p,
const rtems_bdpart_partition *p_end,
rtems_blkdev_bnum *ep_begin
rtems_blkdev_bnum *ep_begin
)
{
rtems_blkdev_bnum begin =
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
rtems_blkdev_bnum size =
rtems_uint32_from_little_endian( data + RTEMS_BDPART_MBR_OFFSET_SIZE);
rtems_blkdev_bnum begin = rtems_uint32_from_little_endian(
data + RTEMS_BDPART_MBR_OFFSET_BEGIN
);
rtems_blkdev_bnum size = rtems_uint32_from_little_endian(
data + RTEMS_BDPART_MBR_OFFSET_SIZE
);
rtems_blkdev_bnum end = begin + size;
uint8_t type = data [RTEMS_BDPART_MBR_OFFSET_TYPE];
uint8_t type = data[ RTEMS_BDPART_MBR_OFFSET_TYPE ];
if (type == RTEMS_BDPART_MBR_EMPTY) {
if ( type == RTEMS_BDPART_MBR_EMPTY ) {
return RTEMS_SUCCESSFUL;
} else if (*p == p_end) {
} else if ( *p == p_end ) {
return RTEMS_TOO_MANY;
} else if (begin >= end) {
} else if ( begin >= end ) {
return RTEMS_IO_ERROR;
} else if (type == RTEMS_BDPART_MBR_EXTENDED) {
if (ep_begin != NULL) {
} else if ( type == RTEMS_BDPART_MBR_EXTENDED ) {
if ( ep_begin != NULL ) {
*ep_begin = begin;
}
} else {
/* Increment partition index */
++(*p);
++( *p );
/* Clear partition */
memset( *p, 0, sizeof( rtems_bdpart_partition));
memset( *p, 0, sizeof( rtems_bdpart_partition ) );
/* Set values */
(*p)->begin = begin;
(*p)->end = end;
rtems_bdpart_to_partition_type( type, (*p)->type);
(*p)->flags = data [RTEMS_BDPART_MBR_OFFSET_FLAGS];
( *p )->begin = begin;
( *p )->end = end;
rtems_bdpart_to_partition_type( type, ( *p )->type );
( *p )->flags = data[ RTEMS_BDPART_MBR_OFFSET_FLAGS ];
}
return RTEMS_SUCCESSFUL;
}
static rtems_status_code rtems_bdpart_read_record(
rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_bdbuf_buffer **block
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
/* Release previous block if necessary */
if (*block != NULL) {
sc = rtems_bdbuf_release( *block);
if (sc != RTEMS_SUCCESSFUL) {
if ( *block != NULL ) {
sc = rtems_bdbuf_release( *block );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
}
/* Read the record block */
sc = rtems_bdbuf_read( dd, index, block);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdbuf_read( dd, index, block );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
@@ -228,7 +238,7 @@ static rtems_status_code rtems_bdpart_read_record(
}
/* Check MBR signature */
if (!rtems_bdpart_is_valid_record( (*block)->buffer)) {
if ( !rtems_bdpart_is_valid_record( ( *block )->buffer ) ) {
return RTEMS_IO_ERROR;
}
@@ -236,27 +246,27 @@ static rtems_status_code rtems_bdpart_read_record(
}
rtems_status_code rtems_bdpart_read(
const char *disk_name,
rtems_bdpart_format *format,
const char *disk_name,
rtems_bdpart_format *format,
rtems_bdpart_partition *pt,
size_t *count
size_t *count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
rtems_bdpart_partition *p = pt - 1;
const rtems_bdpart_partition *p_end = pt + (count != NULL ? *count : 0);
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
rtems_blkdev_bnum disk_end = 0;
size_t i = 0;
const uint8_t *data = NULL;
int fd = -1;
rtems_disk_device *dd = NULL;
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_bdbuf_buffer *block = NULL;
rtems_bdpart_partition *p = pt - 1;
const rtems_bdpart_partition *p_end = pt + ( count != NULL ? *count : 0 );
rtems_blkdev_bnum ep_begin = 0; /* Extended partition begin */
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
rtems_blkdev_bnum disk_end = 0;
size_t i = 0;
const uint8_t *data = NULL;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Check parameter */
if (format == NULL || pt == NULL || count == NULL) {
if ( format == NULL || pt == NULL || count == NULL ) {
return RTEMS_INVALID_ADDRESS;
}
@@ -264,28 +274,28 @@ rtems_status_code rtems_bdpart_read(
*count = 0;
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
/* Read MBR */
sc = rtems_bdpart_read_record( dd, 0, &block);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_read_record( dd, 0, &block );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
/* Read the first partition entry */
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
/* Determine if we have a MBR or GPT format */
if (rtems_bdpart_mbr_partition_type( p->type) == RTEMS_BDPART_MBR_GPT) {
if ( rtems_bdpart_mbr_partition_type( p->type ) == RTEMS_BDPART_MBR_GPT ) {
esc = RTEMS_NOT_IMPLEMENTED;
goto cleanup;
}
@@ -298,11 +308,11 @@ rtems_status_code rtems_bdpart_read(
format->mbr.dos_compatibility = true;
/* Iterate through the rest of the primary partition table */
for (i = 1; i < 4; ++i) {
for ( i = 1; i < 4; ++i ) {
data += RTEMS_BDPART_MBR_TABLE_ENTRY_SIZE;
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_read_mbr_partition( data, &p, p_end, &ep_begin );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
@@ -310,12 +320,12 @@ rtems_status_code rtems_bdpart_read(
/* Iterate through the logical partitions within the extended partition */
ebr = ep_begin;
while (ebr != 0) {
while ( ebr != 0 ) {
rtems_blkdev_bnum tmp = 0;
/* Read EBR */
sc = rtems_bdpart_read_record( dd, ebr, &block);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_read_record( dd, ebr, &block );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
@@ -327,14 +337,14 @@ rtems_status_code rtems_bdpart_read(
p_end,
NULL
);
if (sc != RTEMS_SUCCESSFUL) {
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
/* Adjust partition begin */
tmp = p->begin + ebr;
if (tmp > p->begin) {
if ( tmp > p->begin ) {
p->begin = tmp;
} else {
esc = RTEMS_IO_ERROR;
@@ -343,7 +353,7 @@ rtems_status_code rtems_bdpart_read(
/* Adjust partition end */
tmp = p->end + ebr;
if (tmp > p->end) {
if ( tmp > p->end ) {
p->end = tmp;
} else {
esc = RTEMS_IO_ERROR;
@@ -354,10 +364,10 @@ rtems_status_code rtems_bdpart_read(
ebr = rtems_bdpart_next_ebr(
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_1
);
if (ebr != 0) {
if ( ebr != 0 ) {
/* Adjust partition EBR block index */
tmp = ebr + ep_begin;
if (tmp > ebr) {
if ( tmp > ebr ) {
ebr = tmp;
} else {
esc = RTEMS_IO_ERROR;
@@ -367,16 +377,16 @@ rtems_status_code rtems_bdpart_read(
}
/* Return partition count */
*count = (size_t) (p - pt + 1);
*count = (size_t) ( p - pt + 1 );
cleanup:
if (fd >= 0) {
close( fd);
if ( fd >= 0 ) {
close( fd );
}
if (block != NULL) {
rtems_bdbuf_release( block);
if ( block != NULL ) {
rtems_bdbuf_release( block );
}
return esc;
+57 -55
View File
@@ -45,14 +45,16 @@
#include <rtems.h>
#include <rtems/bdpart.h>
static char *create_logical_disk_name( const char *disk_name, char **marker)
static char *create_logical_disk_name( const char *disk_name, char **marker )
{
size_t disk_name_size = strlen( disk_name);
char *logical_disk_name = malloc( disk_name_size + RTEMS_BDPART_NUMBER_SIZE);
size_t disk_name_size = strlen( disk_name );
char *logical_disk_name = malloc(
disk_name_size + RTEMS_BDPART_NUMBER_SIZE
);
if (logical_disk_name != NULL) {
if ( logical_disk_name != NULL ) {
/* The string is NUL terminated by (A) ... */
memcpy( logical_disk_name, disk_name, disk_name_size);
memcpy( logical_disk_name, disk_name, disk_name_size );
*marker = logical_disk_name + disk_name_size;
}
@@ -60,16 +62,16 @@ static char *create_logical_disk_name( const char *disk_name, char **marker)
}
static rtems_status_code update_logical_disk_name(
char *logical_disk_marker,
char *logical_disk_marker,
size_t i
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
int rv = 0;
int rv = 0;
/* ... (A) */
rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1);
if (rv >= RTEMS_BDPART_NUMBER_SIZE) {
rv = snprintf( logical_disk_marker, RTEMS_BDPART_NUMBER_SIZE, "%zu", i + 1 );
if ( rv >= RTEMS_BDPART_NUMBER_SIZE ) {
sc = RTEMS_INVALID_NAME;
}
@@ -77,23 +79,23 @@ static rtems_status_code update_logical_disk_name(
}
rtems_status_code rtems_bdpart_register(
const char *disk_name,
const char *disk_name,
const rtems_bdpart_partition *pt,
size_t count
size_t count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_blkdev_bnum disk_end = 0;
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
size_t i = 0;
int fd = -1;
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_blkdev_bnum disk_end = 0;
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
size_t i = 0;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
@@ -102,18 +104,18 @@ rtems_status_code rtems_bdpart_register(
disk_name,
&logical_disk_marker
);
if (logical_disk_name == NULL) {
if ( logical_disk_name == NULL ) {
esc = sc;
goto cleanup;
}
/* Create a logical disk for each partition */
for (i = 0; i < count; ++i) {
for ( i = 0; i < count; ++i ) {
const rtems_bdpart_partition *p = pt + i;
/* Set partition number for logical disk name */
sc = update_logical_disk_name( logical_disk_marker, i);
if (sc != RTEMS_SUCCESSFUL) {
sc = update_logical_disk_name( logical_disk_marker, i );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
@@ -125,7 +127,7 @@ rtems_status_code rtems_bdpart_register(
p->begin,
p->end - p->begin
);
if (sc != RTEMS_SUCCESSFUL) {
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
@@ -133,47 +135,47 @@ rtems_status_code rtems_bdpart_register(
cleanup:
free( logical_disk_name);
close( fd);
free( logical_disk_name );
close( fd );
return esc;
}
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name)
rtems_status_code rtems_bdpart_register_from_disk( const char *disk_name )
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdpart_format format;
rtems_bdpart_partition pt [RTEMS_BDPART_PARTITION_NUMBER_HINT];
size_t count = RTEMS_BDPART_PARTITION_NUMBER_HINT;
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_bdpart_format format;
rtems_bdpart_partition pt[ RTEMS_BDPART_PARTITION_NUMBER_HINT ];
size_t count = RTEMS_BDPART_PARTITION_NUMBER_HINT;
/* Read partitions */
sc = rtems_bdpart_read( disk_name, &format, pt, &count);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_read( disk_name, &format, pt, &count );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
/* Register partitions */
return rtems_bdpart_register( disk_name, pt, count);
return rtems_bdpart_register( disk_name, pt, count );
}
rtems_status_code rtems_bdpart_unregister(
const char *disk_name,
const char *disk_name,
const rtems_bdpart_partition *pt RTEMS_UNUSED,
size_t count
size_t count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_blkdev_bnum disk_end = 0;
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
size_t i = 0;
int fd = -1;
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
rtems_blkdev_bnum disk_end = 0;
char *logical_disk_name = NULL;
char *logical_disk_marker = NULL;
size_t i = 0;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
@@ -182,25 +184,25 @@ rtems_status_code rtems_bdpart_unregister(
disk_name,
&logical_disk_marker
);
if (logical_disk_name == NULL) {
if ( logical_disk_name == NULL ) {
esc = sc;
goto cleanup;
}
/* Delete the logical disk for each partition */
for (i = 0; i < count; ++i) {
for ( i = 0; i < count; ++i ) {
int rv = 0;
/* Set partition number for logical disk name */
sc = update_logical_disk_name( logical_disk_marker, i);
if (sc != RTEMS_SUCCESSFUL) {
sc = update_logical_disk_name( logical_disk_marker, i );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
/* Delete logical disk */
rv = unlink( logical_disk_name);
if (rv != 0) {
rv = unlink( logical_disk_name );
if ( rv != 0 ) {
esc = sc;
goto cleanup;
}
@@ -212,9 +214,9 @@ cleanup:
* When we get here, logical_disk_name is guaranteed to be non-NULL
* but fd may be -1. Coverity flagged passing a bad value to close().
*/
free( logical_disk_name);
if (fd >= 0) {
close( fd);
free( logical_disk_name );
if ( fd >= 0 ) {
close( fd );
}
return esc;
+5 -5
View File
@@ -42,21 +42,21 @@
#include <rtems.h>
#include <rtems/bdpart.h>
static int rtems_bdpart_partition_compare( const void *aa, const void *bb)
static int rtems_bdpart_partition_compare( const void *aa, const void *bb )
{
const rtems_bdpart_partition *a = aa;
const rtems_bdpart_partition *b = bb;
if (a->begin < b->begin) {
if ( a->begin < b->begin ) {
return -1;
} else if (a->begin == b->begin) {
} else if ( a->begin == b->begin ) {
return 0;
} else {
return 1;
}
}
void rtems_bdpart_sort( rtems_bdpart_partition *pt, size_t count)
void rtems_bdpart_sort( rtems_bdpart_partition *pt, size_t count )
{
qsort( pt, count, sizeof( *pt), rtems_bdpart_partition_compare);
qsort( pt, count, sizeof( *pt ), rtems_bdpart_partition_compare );
}
+64 -63
View File
@@ -48,35 +48,35 @@ static void rtems_bdpart_write_mbr_partition(
uint8_t *data,
uint32_t begin,
uint32_t size,
uint8_t type,
uint8_t flags
uint8_t type,
uint8_t flags
)
{
rtems_uint32_to_little_endian( begin, data + RTEMS_BDPART_MBR_OFFSET_BEGIN);
rtems_uint32_to_little_endian( size, data + RTEMS_BDPART_MBR_OFFSET_SIZE);
data [RTEMS_BDPART_MBR_OFFSET_TYPE] = type;
data [RTEMS_BDPART_MBR_OFFSET_FLAGS] = flags;
rtems_uint32_to_little_endian( begin, data + RTEMS_BDPART_MBR_OFFSET_BEGIN );
rtems_uint32_to_little_endian( size, data + RTEMS_BDPART_MBR_OFFSET_SIZE );
data[ RTEMS_BDPART_MBR_OFFSET_TYPE ] = type;
data[ RTEMS_BDPART_MBR_OFFSET_FLAGS ] = flags;
}
static rtems_status_code rtems_bdpart_new_record(
rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_disk_device *dd,
rtems_blkdev_bnum index,
rtems_bdbuf_buffer **block
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
/* Synchronize previous block if necessary */
if (*block != NULL) {
sc = rtems_bdbuf_sync( *block);
if (sc != RTEMS_SUCCESSFUL) {
if ( *block != NULL ) {
sc = rtems_bdbuf_sync( *block );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
}
/* Read the new record block (this accounts for disk block sizes > 512) */
sc = rtems_bdbuf_read( dd, index, block);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdbuf_read( dd, index, block );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
@@ -86,86 +86,87 @@ static rtems_status_code rtems_bdpart_new_record(
}
/* Clear record */
memset( (*block)->buffer, 0, RTEMS_BDPART_BLOCK_SIZE);
memset( ( *block )->buffer, 0, RTEMS_BDPART_BLOCK_SIZE );
/* Write signature */
(*block)->buffer [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0] =
( *block )->buffer[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_0 ] =
RTEMS_BDPART_MBR_SIGNATURE_0;
(*block)->buffer [RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1] =
( *block )->buffer[ RTEMS_BDPART_MBR_OFFSET_SIGNATURE_1 ] =
RTEMS_BDPART_MBR_SIGNATURE_1;
return RTEMS_SUCCESSFUL;
}
rtems_status_code rtems_bdpart_write(
const char *disk_name,
const rtems_bdpart_format *format,
const char *disk_name,
const rtems_bdpart_format *format,
const rtems_bdpart_partition *pt,
size_t count
size_t count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code esc = RTEMS_SUCCESSFUL;
bool dos_compatibility = format != NULL
&& format->type == RTEMS_BDPART_FORMAT_MBR
&& format->mbr.dos_compatibility;
bool dos_compatibility = format != NULL &&
format->type == RTEMS_BDPART_FORMAT_MBR &&
format->mbr.dos_compatibility;
rtems_bdbuf_buffer *block = NULL;
rtems_blkdev_bnum disk_end = 0;
rtems_blkdev_bnum record_space =
dos_compatibility ? RTEMS_BDPART_MBR_CYLINDER_SIZE : 1;
size_t ppc = 0; /* Primary partition count */
size_t i = 0;
uint8_t *data = NULL;
int fd = -1;
rtems_disk_device *dd = NULL;
rtems_blkdev_bnum disk_end = 0;
rtems_blkdev_bnum record_space = dos_compatibility
? RTEMS_BDPART_MBR_CYLINDER_SIZE
: 1;
size_t ppc = 0; /* Primary partition count */
size_t i = 0;
uint8_t *data = NULL;
int fd = -1;
rtems_disk_device *dd = NULL;
/* Check if we have something to do */
if (count == 0) {
if ( count == 0 ) {
/* Nothing to do */
return RTEMS_SUCCESSFUL;
}
/* Check parameter */
if (format == NULL || pt == NULL) {
if ( format == NULL || pt == NULL ) {
return RTEMS_INVALID_ADDRESS;
}
/* Get disk data */
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_get_disk_data( disk_name, &fd, &dd, &disk_end );
if ( sc != RTEMS_SUCCESSFUL ) {
return sc;
}
/* Align end of disk on cylinder boundary if necessary */
if (dos_compatibility) {
disk_end -= (disk_end % record_space);
if ( dos_compatibility ) {
disk_end -= ( disk_end % record_space );
}
/* Check that we have a consistent partition table */
for (i = 0; i < count; ++i) {
for ( i = 0; i < count; ++i ) {
const rtems_bdpart_partition *p = pt + i;
/* Check that begin and end are proper within the disk */
if (p->begin >= disk_end || p->end > disk_end) {
if ( p->begin >= disk_end || p->end > disk_end ) {
esc = RTEMS_INVALID_NUMBER;
goto cleanup;
}
/* Check that begin and end are valid */
if (p->begin >= p->end) {
if ( p->begin >= p->end ) {
esc = RTEMS_INVALID_NUMBER;
goto cleanup;
}
/* Check that partitions do not overlap */
if (i > 0 && pt [i - 1].end > p->begin) {
if ( i > 0 && pt[ i - 1 ].end > p->begin ) {
esc = RTEMS_INVALID_NUMBER;
goto cleanup;
}
}
/* Check format */
if (format->type != RTEMS_BDPART_FORMAT_MBR) {
if ( format->type != RTEMS_BDPART_FORMAT_MBR ) {
esc = RTEMS_NOT_IMPLEMENTED;
goto cleanup;
}
@@ -182,7 +183,7 @@ rtems_status_code rtems_bdpart_write(
* Check that the first primary partition starts at head one and sector one
* under the virtual one head and 63 sectors geometry if necessary.
*/
if (dos_compatibility && pt [0].begin != RTEMS_BDPART_MBR_CYLINDER_SIZE) {
if ( dos_compatibility && pt[ 0 ].begin != RTEMS_BDPART_MBR_CYLINDER_SIZE ) {
esc = RTEMS_INVALID_NUMBER;
goto cleanup;
}
@@ -196,27 +197,27 @@ rtems_status_code rtems_bdpart_write(
* compatibility resides between the partitions. So there have to be gaps of
* the appropriate size between the partitions.
*/
for (i = ppc; i < count; ++i) {
if ((pt [i].begin - pt [i - 1].end) < record_space) {
for ( i = ppc; i < count; ++i ) {
if ( ( pt[ i ].begin - pt[ i - 1 ].end ) < record_space ) {
esc = RTEMS_INVALID_NUMBER;
goto cleanup;
}
}
/* Check that we can convert the parition descriptions to the MBR format */
for (i = 0; i < count; ++i) {
for ( i = 0; i < count; ++i ) {
uint8_t type = 0;
const rtems_bdpart_partition *p = pt + i;
/* Check type */
if (!rtems_bdpart_to_mbr_partition_type( p->type, &type)) {
esc = RTEMS_INVALID_ID;
if ( !rtems_bdpart_to_mbr_partition_type( p->type, &type ) ) {
esc = RTEMS_INVALID_ID;
goto cleanup;
}
/* Check flags */
if (p->flags > 0xffU) {
if ( p->flags > 0xffU ) {
esc = RTEMS_INVALID_ID;
goto cleanup;
}
@@ -226,8 +227,8 @@ rtems_status_code rtems_bdpart_write(
}
/* New MBR */
sc = rtems_bdpart_new_record( dd, 0, &block);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_new_record( dd, 0, &block );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
@@ -240,7 +241,7 @@ rtems_status_code rtems_bdpart_write(
/* Write primary partition table */
data = block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0;
for (i = 0; i < ppc; ++i) {
for ( i = 0; i < ppc; ++i ) {
const rtems_bdpart_partition *p = pt + i;
/* Write partition entry */
@@ -248,7 +249,7 @@ rtems_status_code rtems_bdpart_write(
data,
p->begin,
p->end - p->begin,
rtems_bdpart_mbr_partition_type( p->type),
rtems_bdpart_mbr_partition_type( p->type ),
(uint8_t) p->flags
);
@@ -256,11 +257,11 @@ rtems_status_code rtems_bdpart_write(
}
/* Write extended partition with logical partitions if necessary */
if (ppc != count) {
if ( ppc != count ) {
rtems_blkdev_bnum ebr = 0; /* Extended boot record block index */
/* Begin of extended partition */
rtems_blkdev_bnum ep_begin = pt [ppc].begin - record_space;
rtems_blkdev_bnum ep_begin = pt[ ppc ].begin - record_space;
/* Write extended partition */
rtems_bdpart_write_mbr_partition(
@@ -272,11 +273,11 @@ rtems_status_code rtems_bdpart_write(
);
/* Write logical partitions */
for (i = ppc; i < count; ++i) {
for ( i = ppc; i < count; ++i ) {
const rtems_bdpart_partition *p = pt + i;
/* Write second partition entry */
if (i > ppc) {
if ( i > ppc ) {
rtems_blkdev_bnum begin = p->begin - record_space;
rtems_bdpart_write_mbr_partition(
@@ -290,8 +291,8 @@ rtems_status_code rtems_bdpart_write(
/* New EBR */
ebr = p->begin - record_space;
sc = rtems_bdpart_new_record( dd, ebr, &block);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_bdpart_new_record( dd, ebr, &block );
if ( sc != RTEMS_SUCCESSFUL ) {
esc = sc;
goto cleanup;
}
@@ -301,7 +302,7 @@ rtems_status_code rtems_bdpart_write(
block->buffer + RTEMS_BDPART_MBR_OFFSET_TABLE_0,
record_space,
p->end - p->begin,
rtems_bdpart_mbr_partition_type( p->type),
rtems_bdpart_mbr_partition_type( p->type ),
(uint8_t) p->flags
);
}
@@ -309,12 +310,12 @@ rtems_status_code rtems_bdpart_write(
cleanup:
if (fd >= 0) {
close( fd);
if ( fd >= 0 ) {
close( fd );
}
if (block != NULL) {
rtems_bdbuf_sync( block);
if ( block != NULL ) {
rtems_bdbuf_sync( block );
}
return esc;
+42 -26
View File
@@ -45,34 +45,42 @@
#include <errno.h>
#include <string.h>
void rtems_blkstats(const rtems_printer* printer, const char *device, bool reset)
void rtems_blkstats(
const rtems_printer *printer,
const char *device,
bool reset
)
{
int fd = open(device, O_RDONLY);
int fd = open( device, O_RDONLY );
if (fd >= 0) {
if ( fd >= 0 ) {
struct stat st;
int rv;
int rv;
rv = fstat(fd, &st);
if (rv == 0) {
if (S_ISBLK(st.st_mode)) {
if (reset) {
rv = rtems_disk_fd_reset_device_stats(fd);
if (rv != 0) {
rtems_printf(printer, "error: reset stats: %s\n", strerror(errno));
rv = fstat( fd, &st );
if ( rv == 0 ) {
if ( S_ISBLK( st.st_mode ) ) {
if ( reset ) {
rv = rtems_disk_fd_reset_device_stats( fd );
if ( rv != 0 ) {
rtems_printf(
printer,
"error: reset stats: %s\n",
strerror( errno )
);
}
} else {
uint32_t media_block_size = 0;
uint32_t media_block_count = 0;
uint32_t block_size = 0;
uint32_t media_block_size = 0;
uint32_t media_block_count = 0;
uint32_t block_size = 0;
rtems_blkdev_stats stats;
rtems_disk_fd_get_media_block_size(fd, &media_block_size);
rtems_disk_fd_get_block_count(fd, &media_block_count);
rtems_disk_fd_get_block_size(fd, &block_size);
rtems_disk_fd_get_media_block_size( fd, &media_block_size );
rtems_disk_fd_get_block_count( fd, &media_block_count );
rtems_disk_fd_get_block_size( fd, &block_size );
rv = rtems_disk_fd_get_device_stats(fd, &stats);
if (rv == 0) {
rv = rtems_disk_fd_get_device_stats( fd, &stats );
if ( rv == 0 ) {
rtems_blkdev_print_stats(
&stats,
media_block_size,
@@ -81,21 +89,29 @@ void rtems_blkstats(const rtems_printer* printer, const char *device, bool reset
printer
);
} else {
rtems_printf(printer, "error: get stats: %s\n", strerror(errno));
rtems_printf(
printer,
"error: get stats: %s\n",
strerror( errno )
);
}
}
} else {
rtems_printf(printer, "error: not a block device\n");
rtems_printf( printer, "error: not a block device\n" );
}
} else {
rtems_printf(printer, "error: get file stats: %s\n", strerror(errno));
rtems_printf(
printer,
"error: get file stats: %s\n",
strerror( errno )
);
}
rv = close(fd);
if (rv != 0) {
rtems_printf(printer, "error: close device: %s\n", strerror(errno));
rv = close( fd );
if ( rv != 0 ) {
rtems_printf( printer, "error: close device: %s\n", strerror( errno ) );
}
} else {
rtems_printf(printer, "error: open device: %s\n", strerror(errno));
rtems_printf( printer, "error: open device: %s\n", strerror( errno ) );
}
}
+108 -110
View File
@@ -49,40 +49,40 @@
typedef struct {
rtems_disk_device dd;
int fd;
int fd;
} rtems_blkdev_imfs_context;
static ssize_t rtems_blkdev_imfs_read(
rtems_libio_t *iop,
void *buffer,
size_t count
void *buffer,
size_t count
)
{
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
ssize_t block_offset = (ssize_t) (offset % block_size);
char *dst = buffer;
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size( dd );
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( offset / block_size );
ssize_t block_offset = (ssize_t) ( offset % block_size );
char *dst = buffer;
while (remaining > 0) {
while ( remaining > 0 ) {
rtems_bdbuf_buffer *bd;
rtems_status_code sc = rtems_bdbuf_read(dd, block, &bd);
rtems_status_code sc = rtems_bdbuf_read( dd, block, &bd );
if (sc == RTEMS_SUCCESSFUL) {
if ( sc == RTEMS_SUCCESSFUL ) {
ssize_t copy = block_size - block_offset;
if (copy > remaining) {
if ( copy > remaining ) {
copy = remaining;
}
memcpy(dst, (char *) bd->buffer + block_offset, (size_t) copy);
memcpy( dst, (char *) bd->buffer + block_offset, (size_t) copy );
sc = rtems_bdbuf_release(bd);
if (sc == RTEMS_SUCCESSFUL) {
sc = rtems_bdbuf_release( bd );
if ( sc == RTEMS_SUCCESSFUL ) {
block_offset = 0;
remaining -= copy;
dst += copy;
@@ -95,7 +95,7 @@ static ssize_t rtems_blkdev_imfs_read(
}
}
if (remaining >= 0) {
if ( remaining >= 0 ) {
iop->offset += count;
rv = (ssize_t) count;
} else {
@@ -108,41 +108,41 @@ static ssize_t rtems_blkdev_imfs_read(
static ssize_t rtems_blkdev_imfs_write(
rtems_libio_t *iop,
const void *buffer,
size_t count
const void *buffer,
size_t count
)
{
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size(dd);
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (offset / block_size);
ssize_t block_offset = (ssize_t) (offset % block_size);
const char *src = buffer;
int rv;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
rtems_disk_device *dd = &ctx->dd;
ssize_t remaining = (ssize_t) count;
off_t offset = iop->offset;
ssize_t block_size = (ssize_t) rtems_disk_get_block_size( dd );
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( offset / block_size );
ssize_t block_offset = (ssize_t) ( offset % block_size );
const char *src = buffer;
while (remaining > 0) {
rtems_status_code sc;
while ( remaining > 0 ) {
rtems_status_code sc;
rtems_bdbuf_buffer *bd;
if (block_offset == 0 && remaining >= block_size) {
sc = rtems_bdbuf_get(dd, block, &bd);
if ( block_offset == 0 && remaining >= block_size ) {
sc = rtems_bdbuf_get( dd, block, &bd );
} else {
sc = rtems_bdbuf_read(dd, block, &bd);
sc = rtems_bdbuf_read( dd, block, &bd );
}
if (sc == RTEMS_SUCCESSFUL) {
if ( sc == RTEMS_SUCCESSFUL ) {
ssize_t copy = block_size - block_offset;
if (copy > remaining) {
if ( copy > remaining ) {
copy = remaining;
}
memcpy((char *) bd->buffer + block_offset, src, (size_t) copy);
memcpy( (char *) bd->buffer + block_offset, src, (size_t) copy );
sc = rtems_bdbuf_release_modified(bd);
if (sc == RTEMS_SUCCESSFUL) {
sc = rtems_bdbuf_release_modified( bd );
if ( sc == RTEMS_SUCCESSFUL ) {
block_offset = 0;
remaining -= copy;
src += copy;
@@ -155,7 +155,7 @@ static ssize_t rtems_blkdev_imfs_write(
}
}
if (remaining >= 0) {
if ( remaining >= 0 ) {
iop->offset += count;
rv = (ssize_t) count;
} else {
@@ -167,18 +167,18 @@ static ssize_t rtems_blkdev_imfs_write(
}
static int rtems_blkdev_imfs_ioctl(
rtems_libio_t *iop,
rtems_libio_t *iop,
ioctl_command_t request,
void *buffer
void *buffer
)
{
int rv = 0;
if (request != RTEMS_BLKIO_REQUEST) {
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
if ( request != RTEMS_BLKIO_REQUEST ) {
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
rtems_disk_device *dd = &ctx->dd;
rv = (*dd->ioctl)(dd, request, buffer);
rv = ( *dd->ioctl )( dd, request, buffer );
} else {
/*
* It is not allowed to directly access the driver circumventing the cache.
@@ -192,35 +192,33 @@ static int rtems_blkdev_imfs_ioctl(
static int rtems_blkdev_imfs_fstat(
const rtems_filesystem_location_info_t *loc,
struct stat *buf
struct stat *buf
)
{
rtems_blkdev_imfs_context *ctx;
rtems_disk_device *dd;
IMFS_jnode_t *node;
rtems_disk_device *dd;
IMFS_jnode_t *node;
ctx = IMFS_generic_get_context_by_location(loc);
ctx = IMFS_generic_get_context_by_location( loc );
dd = &ctx->dd;
buf->st_blksize = rtems_disk_get_block_size(dd);
buf->st_blocks = rtems_disk_get_block_count(dd);
buf->st_blksize = rtems_disk_get_block_size( dd );
buf->st_blocks = rtems_disk_get_block_count( dd );
node = loc->node_access;
buf->st_rdev = IMFS_generic_get_device_identifier_by_node(node);
buf->st_rdev = IMFS_generic_get_device_identifier_by_node( node );
return IMFS_stat(loc, buf);
return IMFS_stat( loc, buf );
}
static int rtems_blkdev_imfs_fsync_or_fdatasync(
rtems_libio_t *iop
)
static int rtems_blkdev_imfs_fsync_or_fdatasync( rtems_libio_t *iop )
{
int rv = 0;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop(iop);
rtems_disk_device *dd = &ctx->dd;
rtems_status_code sc = rtems_bdbuf_syncdev(dd);
int rv = 0;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_iop( iop );
rtems_disk_device *dd = &ctx->dd;
rtems_status_code sc = rtems_bdbuf_syncdev( dd );
if (sc != RTEMS_SUCCESSFUL) {
if ( sc != RTEMS_SUCCESSFUL ) {
errno = EIO;
rv = -1;
}
@@ -249,65 +247,65 @@ static const rtems_filesystem_file_handlers_r rtems_blkdev_imfs_node = {
static IMFS_jnode_t *rtems_blkdev_imfs_initialize(
IMFS_jnode_t *node,
void *arg
void *arg
)
{
rtems_blkdev_imfs_context *ctx;
rtems_disk_device *dd;
rtems_disk_device *dd;
node = IMFS_node_initialize_generic(node, arg);
node = IMFS_node_initialize_generic( node, arg );
ctx = IMFS_generic_get_context_by_node(node);
ctx = IMFS_generic_get_context_by_node( node );
dd = &ctx->dd;
dd->dev = IMFS_generic_get_device_identifier_by_node(node);
dd->dev = IMFS_generic_get_device_identifier_by_node( node );
return node;
}
static void rtems_blkdev_imfs_destroy(IMFS_jnode_t *node)
static void rtems_blkdev_imfs_destroy( IMFS_jnode_t *node )
{
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_node(node);
rtems_disk_device *dd = &ctx->dd;
rtems_blkdev_imfs_context *ctx = IMFS_generic_get_context_by_node( node );
rtems_disk_device *dd = &ctx->dd;
(void) rtems_bdbuf_syncdev(dd);
rtems_bdbuf_purge_dev(dd);
(void) rtems_bdbuf_syncdev( dd );
rtems_bdbuf_purge_dev( dd );
if (ctx->fd >= 0) {
close(ctx->fd);
if ( ctx->fd >= 0 ) {
close( ctx->fd );
} else {
(*dd->ioctl)(dd, RTEMS_BLKIO_DELETED, NULL);
( *dd->ioctl )( dd, RTEMS_BLKIO_DELETED, NULL );
}
free(ctx);
free( ctx );
IMFS_node_destroy_default(node);
IMFS_node_destroy_default( node );
}
static const IMFS_node_control rtems_blkdev_imfs_control =
IMFS_GENERIC_INITIALIZER(
static const IMFS_node_control
rtems_blkdev_imfs_control = IMFS_GENERIC_INITIALIZER(
&rtems_blkdev_imfs_node,
rtems_blkdev_imfs_initialize,
rtems_blkdev_imfs_destroy
);
rtems_status_code rtems_blkdev_create(
const char *device,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
const char *device,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
rtems_block_device_ioctl handler,
void *driver_data
void *driver_data
)
{
rtems_status_code sc;
rtems_status_code sc;
rtems_blkdev_imfs_context *ctx;
sc = rtems_bdbuf_init();
if (sc != RTEMS_SUCCESSFUL) {
if ( sc != RTEMS_SUCCESSFUL ) {
return RTEMS_INCORRECT_STATE;
}
ctx = malloc(sizeof(*ctx));
if (ctx != NULL) {
ctx = malloc( sizeof( *ctx ) );
if ( ctx != NULL ) {
sc = rtems_disk_init_phys(
&ctx->dd,
media_block_size,
@@ -318,7 +316,7 @@ rtems_status_code rtems_blkdev_create(
ctx->fd = -1;
if (sc == RTEMS_SUCCESSFUL) {
if ( sc == RTEMS_SUCCESSFUL ) {
int rv = IMFS_make_generic_node(
device,
S_IFBLK | S_IRWXU | S_IRWXG | S_IRWXO,
@@ -326,12 +324,12 @@ rtems_status_code rtems_blkdev_create(
ctx
);
if (rv != 0) {
free(ctx);
if ( rv != 0 ) {
free( ctx );
sc = RTEMS_UNSATISFIED;
}
} else {
free(ctx);
free( ctx );
}
} else {
sc = RTEMS_NO_MEMORY;
@@ -341,28 +339,28 @@ rtems_status_code rtems_blkdev_create(
}
rtems_status_code rtems_blkdev_create_partition(
const char *partition,
const char *parent_block_device,
const char *partition,
const char *parent_block_device,
rtems_blkdev_bnum media_block_begin,
rtems_blkdev_bnum media_block_count
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
int fd = open(parent_block_device, O_RDWR);
int fd = open( parent_block_device, O_RDWR );
if (fd >= 0) {
int rv;
if ( fd >= 0 ) {
int rv;
struct stat st;
rv = fstat(fd, &st);
if (rv == 0 && S_ISBLK(st.st_mode)) {
rv = fstat( fd, &st );
if ( rv == 0 && S_ISBLK( st.st_mode ) ) {
rtems_disk_device *phys_dd;
rv = rtems_disk_fd_get_disk_device(fd, &phys_dd);
if (rv == 0) {
rtems_blkdev_imfs_context *ctx = malloc(sizeof(*ctx));
rv = rtems_disk_fd_get_disk_device( fd, &phys_dd );
if ( rv == 0 ) {
rtems_blkdev_imfs_context *ctx = malloc( sizeof( *ctx ) );
if (ctx != NULL) {
if ( ctx != NULL ) {
sc = rtems_disk_init_log(
&ctx->dd,
phys_dd,
@@ -370,7 +368,7 @@ rtems_status_code rtems_blkdev_create_partition(
media_block_count
);
if (sc == RTEMS_SUCCESSFUL) {
if ( sc == RTEMS_SUCCESSFUL ) {
ctx->fd = fd;
rv = IMFS_make_generic_node(
@@ -380,12 +378,12 @@ rtems_status_code rtems_blkdev_create_partition(
ctx
);
if (rv != 0) {
free(ctx);
if ( rv != 0 ) {
free( ctx );
sc = RTEMS_UNSATISFIED;
}
} else {
free(ctx);
free( ctx );
}
} else {
sc = RTEMS_NO_MEMORY;
@@ -397,8 +395,8 @@ rtems_status_code rtems_blkdev_create_partition(
sc = RTEMS_INVALID_NODE;
}
if (sc != RTEMS_SUCCESSFUL) {
close(fd);
if ( sc != RTEMS_SUCCESSFUL ) {
close( fd );
}
} else {
sc = RTEMS_INVALID_ID;
+45 -47
View File
@@ -20,63 +20,61 @@
#include <rtems/blkdev.h>
#include <rtems/bdbuf.h>
int
rtems_blkdev_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
int rtems_blkdev_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
{
rtems_status_code sc;
int rc = 0;
rtems_status_code sc;
int rc = 0;
switch (req)
{
case RTEMS_BLKIO_GETMEDIABLKSIZE:
*(uint32_t *) argp = dd->media_block_size;
break;
switch ( req ) {
case RTEMS_BLKIO_GETMEDIABLKSIZE:
*(uint32_t *) argp = dd->media_block_size;
break;
case RTEMS_BLKIO_GETBLKSIZE:
*(uint32_t *) argp = dd->block_size;
break;
case RTEMS_BLKIO_GETBLKSIZE:
*(uint32_t *) argp = dd->block_size;
break;
case RTEMS_BLKIO_SETBLKSIZE:
sc = rtems_bdbuf_set_block_size(dd, *(uint32_t *) argp, true);
if (sc != RTEMS_SUCCESSFUL) {
errno = EIO;
rc = -1;
}
break;
case RTEMS_BLKIO_SETBLKSIZE:
sc = rtems_bdbuf_set_block_size( dd, *(uint32_t *) argp, true );
if ( sc != RTEMS_SUCCESSFUL ) {
errno = EIO;
rc = -1;
}
break;
case RTEMS_BLKIO_GETSIZE:
*(rtems_blkdev_bnum *) argp = dd->size;
break;
case RTEMS_BLKIO_GETSIZE:
*(rtems_blkdev_bnum *) argp = dd->size;
break;
case RTEMS_BLKIO_SYNCDEV:
sc = rtems_bdbuf_syncdev(dd);
if (sc != RTEMS_SUCCESSFUL) {
errno = EIO;
rc = -1;
}
break;
case RTEMS_BLKIO_SYNCDEV:
sc = rtems_bdbuf_syncdev( dd );
if ( sc != RTEMS_SUCCESSFUL ) {
errno = EIO;
rc = -1;
}
break;
case RTEMS_BLKIO_GETDISKDEV:
*(rtems_disk_device **) argp = dd;
break;
case RTEMS_BLKIO_GETDISKDEV:
*(rtems_disk_device **) argp = dd;
break;
case RTEMS_BLKIO_PURGEDEV:
rtems_bdbuf_purge_dev(dd);
break;
case RTEMS_BLKIO_PURGEDEV:
rtems_bdbuf_purge_dev( dd );
break;
case RTEMS_BLKIO_GETDEVSTATS:
rtems_bdbuf_get_device_stats(dd, (rtems_blkdev_stats *) argp);
break;
case RTEMS_BLKIO_GETDEVSTATS:
rtems_bdbuf_get_device_stats( dd, (rtems_blkdev_stats *) argp );
break;
case RTEMS_BLKIO_RESETDEVSTATS:
rtems_bdbuf_reset_device_stats(dd);
break;
case RTEMS_BLKIO_RESETDEVSTATS:
rtems_bdbuf_reset_device_stats( dd );
break;
default:
errno = EINVAL;
rc = -1;
break;
}
default:
errno = EINVAL;
rc = -1;
break;
}
return rc;
return rc;
}
+6 -6
View File
@@ -38,10 +38,10 @@
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
const rtems_driver_address_table rtems_blkdev_generic_ops = {
.initialization_entry = NULL,
.open_entry = rtems_blkdev_generic_open,
.close_entry = rtems_blkdev_generic_close,
.read_entry = rtems_blkdev_generic_read,
.write_entry = rtems_blkdev_generic_write,
.control_entry = rtems_blkdev_generic_ioctl
.initialization_entry = NULL,
.open_entry = rtems_blkdev_generic_open,
.close_entry = rtems_blkdev_generic_close,
.read_entry = rtems_blkdev_generic_read,
.write_entry = rtems_blkdev_generic_write,
.control_entry = rtems_blkdev_generic_ioctl
};
+33 -33
View File
@@ -43,41 +43,41 @@
void rtems_blkdev_print_stats(
const rtems_blkdev_stats *stats,
uint32_t media_block_size,
uint32_t media_block_count,
uint32_t block_size,
const rtems_printer* printer
uint32_t media_block_size,
uint32_t media_block_count,
uint32_t block_size,
const rtems_printer *printer
)
{
rtems_printf(
printer,
"-------------------------------------------------------------------------------\n"
" DEVICE STATISTICS\n"
"----------------------+--------------------------------------------------------\n"
" MEDIA BLOCK SIZE | %" PRIu32 "\n"
" MEDIA BLOCK COUNT | %" PRIu32 "\n"
" BLOCK SIZE | %" PRIu32 "\n"
" READ HITS | %" PRIu32 "\n"
" READ MISSES | %" PRIu32 "\n"
" READ AHEAD TRANSFERS | %" PRIu32 "\n"
" READ AHEAD PEEKS | %" PRIu32 "\n"
" READ BLOCKS | %" PRIu32 "\n"
" READ ERRORS | %" PRIu32 "\n"
" WRITE TRANSFERS | %" PRIu32 "\n"
" WRITE BLOCKS | %" PRIu32 "\n"
" WRITE ERRORS | %" PRIu32 "\n"
"----------------------+--------------------------------------------------------\n",
media_block_size,
media_block_count,
block_size,
stats->read_hits,
stats->read_misses,
stats->read_ahead_transfers,
stats->read_ahead_peeks,
stats->read_blocks,
stats->read_errors,
stats->write_transfers,
stats->write_blocks,
stats->write_errors
printer,
"-------------------------------------------------------------------------------\n"
" DEVICE STATISTICS\n"
"----------------------+--------------------------------------------------------\n"
" MEDIA BLOCK SIZE | %" PRIu32 "\n"
" MEDIA BLOCK COUNT | %" PRIu32 "\n"
" BLOCK SIZE | %" PRIu32 "\n"
" READ HITS | %" PRIu32 "\n"
" READ MISSES | %" PRIu32 "\n"
" READ AHEAD TRANSFERS | %" PRIu32 "\n"
" READ AHEAD PEEKS | %" PRIu32 "\n"
" READ BLOCKS | %" PRIu32 "\n"
" READ ERRORS | %" PRIu32 "\n"
" WRITE TRANSFERS | %" PRIu32 "\n"
" WRITE BLOCKS | %" PRIu32 "\n"
" WRITE ERRORS | %" PRIu32 "\n"
"----------------------+--------------------------------------------------------\n",
media_block_size,
media_block_count,
block_size,
stats->read_hits,
stats->read_misses,
stats->read_ahead_transfers,
stats->read_ahead_peeks,
stats->read_blocks,
stats->read_errors,
stats->write_transfers,
stats->write_blocks,
stats->write_errors
);
}
+115 -115
View File
@@ -31,139 +31,144 @@
* Generic block device read primitive. Implemented using block device
* buffer management primitives.
*/
rtems_device_driver
rtems_blkdev_generic_read(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void * arg)
rtems_device_driver rtems_blkdev_generic_read(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void *arg
)
{
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
uint32_t block_size = dd->block_size;
char *buf = args->buffer;
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
uint32_t blkofs = (uint32_t) (args->offset % block_size);
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
uint32_t block_size = dd->block_size;
char *buf = args->buffer;
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( args->offset / block_size );
uint32_t blkofs = (uint32_t) ( args->offset % block_size );
args->bytes_moved = 0;
args->bytes_moved = 0;
while (count > 0)
{
rtems_bdbuf_buffer *diskbuf;
uint32_t copy;
while ( count > 0 ) {
rtems_bdbuf_buffer *diskbuf;
uint32_t copy;
rc = rtems_bdbuf_read(dd, block, &diskbuf);
if (rc != RTEMS_SUCCESSFUL)
break;
copy = block_size - blkofs;
if (copy > count)
copy = count;
memcpy(buf, (char *)diskbuf->buffer + blkofs, copy);
rc = rtems_bdbuf_release(diskbuf);
args->bytes_moved += copy;
if (rc != RTEMS_SUCCESSFUL)
break;
count -= copy;
buf += copy;
blkofs = 0;
block++;
rc = rtems_bdbuf_read( dd, block, &diskbuf );
if ( rc != RTEMS_SUCCESSFUL ) {
break;
}
copy = block_size - blkofs;
if ( copy > count ) {
copy = count;
}
memcpy( buf, (char *) diskbuf->buffer + blkofs, copy );
rc = rtems_bdbuf_release( diskbuf );
args->bytes_moved += copy;
if ( rc != RTEMS_SUCCESSFUL ) {
break;
}
count -= copy;
buf += copy;
blkofs = 0;
block++;
}
return rc;
return rc;
}
/* rtems_blkdev_generic_write --
* Generic block device write primitive. Implemented using block device
* buffer management primitives.
*/
rtems_device_driver
rtems_blkdev_generic_write(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void * arg)
rtems_device_driver rtems_blkdev_generic_write(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void *arg
)
{
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
uint32_t block_size = dd->block_size;
char *buf = args->buffer;
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) (args->offset / block_size);
uint32_t blkofs = (uint32_t) (args->offset % block_size);
rtems_status_code rc = RTEMS_SUCCESSFUL;
rtems_libio_rw_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
uint32_t block_size = dd->block_size;
char *buf = args->buffer;
uint32_t count = args->count;
rtems_blkdev_bnum block = (rtems_blkdev_bnum) ( args->offset / block_size );
uint32_t blkofs = (uint32_t) ( args->offset % block_size );
args->bytes_moved = 0;
args->bytes_moved = 0;
while (count > 0)
{
rtems_bdbuf_buffer *diskbuf;
uint32_t copy;
while ( count > 0 ) {
rtems_bdbuf_buffer *diskbuf;
uint32_t copy;
if ((blkofs == 0) && (count >= block_size))
rc = rtems_bdbuf_get(dd, block, &diskbuf);
else
rc = rtems_bdbuf_read(dd, block, &diskbuf);
if (rc != RTEMS_SUCCESSFUL)
break;
copy = block_size - blkofs;
if (copy > count)
copy = count;
memcpy((char *)diskbuf->buffer + blkofs, buf, copy);
args->bytes_moved += copy;
rc = rtems_bdbuf_release_modified(diskbuf);
if (rc != RTEMS_SUCCESSFUL)
break;
count -= copy;
buf += copy;
blkofs = 0;
block++;
if ( ( blkofs == 0 ) && ( count >= block_size ) ) {
rc = rtems_bdbuf_get( dd, block, &diskbuf );
} else {
rc = rtems_bdbuf_read( dd, block, &diskbuf );
}
if ( rc != RTEMS_SUCCESSFUL ) {
break;
}
return rc;
copy = block_size - blkofs;
if ( copy > count ) {
copy = count;
}
memcpy( (char *) diskbuf->buffer + blkofs, buf, copy );
args->bytes_moved += copy;
rc = rtems_bdbuf_release_modified( diskbuf );
if ( rc != RTEMS_SUCCESSFUL ) {
break;
}
count -= copy;
buf += copy;
blkofs = 0;
block++;
}
return rc;
}
/* blkdev_generic_open --
* Generic block device open primitive.
*/
rtems_device_driver
rtems_blkdev_generic_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void * arg)
rtems_device_driver rtems_blkdev_generic_open(
rtems_device_major_number major,
rtems_device_minor_number minor,
void *arg
)
{
rtems_libio_open_close_args_t *oc = arg;
rtems_libio_t *iop = oc->iop;
dev_t dev = rtems_filesystem_make_dev_t(major, minor);
rtems_disk_device *dd = rtems_disk_obtain(dev);
rtems_libio_t *iop = oc->iop;
dev_t dev = rtems_filesystem_make_dev_t( major, minor );
rtems_disk_device *dd = rtems_disk_obtain( dev );
iop->data1 = dd;
if (dd != NULL)
if ( dd != NULL ) {
return RTEMS_SUCCESSFUL;
else
} else {
return RTEMS_UNSATISFIED;
}
}
/* blkdev_generic_close --
* Generic block device close primitive.
*/
rtems_device_driver
rtems_blkdev_generic_close(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void * arg)
rtems_device_driver rtems_blkdev_generic_close(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void *arg
)
{
rtems_libio_open_close_args_t *oc = arg;
rtems_libio_t *iop = oc->iop;
rtems_disk_device *dd = iop->data1;
rtems_libio_t *iop = oc->iop;
rtems_disk_device *dd = iop->data1;
rtems_disk_release(dd);
rtems_disk_release( dd );
return RTEMS_SUCCESSFUL;
}
@@ -171,30 +176,25 @@ rtems_blkdev_generic_close(
/* blkdev_generic_ioctl --
* Generic block device ioctl primitive.
*/
rtems_device_driver
rtems_blkdev_generic_ioctl(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void * arg)
rtems_device_driver rtems_blkdev_generic_ioctl(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void *arg
)
{
rtems_libio_ioctl_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
rtems_libio_ioctl_args_t *args = arg;
rtems_libio_t *iop = args->iop;
rtems_disk_device *dd = iop->data1;
if (args->command != RTEMS_BLKIO_REQUEST)
{
args->ioctl_return = dd->ioctl(dd,
args->command,
args->buffer);
}
else
{
/*
if ( args->command != RTEMS_BLKIO_REQUEST ) {
args->ioctl_return = dd->ioctl( dd, args->command, args->buffer );
} else {
/*
* It is not allowed to directly access the driver circumventing the
* cache.
*/
args->ioctl_return = -1;
}
args->ioctl_return = -1;
}
return RTEMS_SUCCESSFUL;
return RTEMS_SUCCESSFUL;
}
+17 -16
View File
@@ -43,16 +43,16 @@
#include <string.h>
rtems_status_code rtems_disk_init_phys(
rtems_disk_device *dd,
uint32_t block_size,
rtems_blkdev_bnum block_count,
rtems_disk_device *dd,
uint32_t block_size,
rtems_blkdev_bnum block_count,
rtems_block_device_ioctl handler,
void *driver_data
void *driver_data
)
{
rtems_status_code sc;
dd = memset(dd, 0, sizeof(*dd));
dd = memset( dd, 0, sizeof( *dd ) );
dd->phys_dev = dd;
dd->size = block_count;
@@ -61,12 +61,14 @@ rtems_status_code rtems_disk_init_phys(
dd->driver_data = driver_data;
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
if (block_count > 0) {
if ((*handler)(dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities) != 0) {
if ( block_count > 0 ) {
if (
( *handler )( dd, RTEMS_BLKIO_CAPABILITIES, &dd->capabilities ) != 0
) {
dd->capabilities = 0;
}
sc = rtems_bdbuf_set_block_size(dd, block_size, false);
sc = rtems_bdbuf_set_block_size( dd, block_size, false );
} else {
sc = RTEMS_INVALID_NUMBER;
}
@@ -77,13 +79,13 @@ rtems_status_code rtems_disk_init_phys(
rtems_status_code rtems_disk_init_log(
rtems_disk_device *dd,
rtems_disk_device *phys_dd,
rtems_blkdev_bnum block_begin,
rtems_blkdev_bnum block_count
rtems_blkdev_bnum block_begin,
rtems_blkdev_bnum block_count
)
{
rtems_status_code sc;
dd = memset(dd, 0, sizeof(*dd));
dd = memset( dd, 0, sizeof( *dd ) );
dd->phys_dev = phys_dd;
dd->start = block_begin;
@@ -93,15 +95,14 @@ rtems_status_code rtems_disk_init_log(
dd->driver_data = phys_dd->driver_data;
dd->read_ahead.trigger = RTEMS_DISK_READ_AHEAD_NO_TRIGGER;
if (phys_dd->phys_dev == phys_dd) {
if ( phys_dd->phys_dev == phys_dd ) {
rtems_blkdev_bnum phys_block_count = phys_dd->size;
if (
block_begin < phys_block_count
&& block_count > 0
&& block_count <= phys_block_count - block_begin
block_begin < phys_block_count && block_count > 0 &&
block_count <= phys_block_count - block_begin
) {
sc = rtems_bdbuf_set_block_size(dd, phys_dd->media_block_size, false);
sc = rtems_bdbuf_set_block_size( dd, phys_dd->media_block_size, false );
} else {
sc = RTEMS_INVALID_NUMBER;
}
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+23 -19
View File
@@ -35,7 +35,7 @@
#include <rtems/media.h>
static const char *const rtems_media_event_desc_table [] = {
static const char *const rtems_media_event_desc_table[] = {
[RTEMS_MEDIA_EVENT_DISK_ATTACH] = "DISK ATTACH",
[RTEMS_MEDIA_EVENT_DISK_DETACH] = "DISK DETACH",
[RTEMS_MEDIA_EVENT_MOUNT] = "MOUNT",
@@ -45,7 +45,7 @@ static const char *const rtems_media_event_desc_table [] = {
[RTEMS_MEDIA_EVENT_PARTITION_DETACH] = "PARTITION DETACH"
};
static const char *const rtems_media_state_desc_table [] = {
static const char *const rtems_media_state_desc_table[] = {
[RTEMS_MEDIA_STATE_INQUIRY] = "INQUIRY",
[RTEMS_MEDIA_STATE_ABORTED] = "ABORTED",
[RTEMS_MEDIA_STATE_READY] = "SUCCESS",
@@ -53,32 +53,36 @@ static const char *const rtems_media_state_desc_table [] = {
[RTEMS_MEDIA_STATE_SUCCESS] = "SUCCESS",
[RTEMS_MEDIA_ERROR_DISK_UNKNOWN] = "ERROR DISK UNKNOWN",
[RTEMS_MEDIA_ERROR_DISK_EXISTS] = "ERROR DISK EXISTS",
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_UNKNOWN] = "ERROR DISK OR PARTITION UNKNOWN",
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_EXISTS] = "ERROR DISK OR PARTITION EXISTS",
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_UNKNOWN] =
"ERROR DISK OR PARTITION UNKNOWN",
[RTEMS_MEDIA_ERROR_DISK_OR_PARTITION_EXISTS] =
"ERROR DISK OR PARTITION EXISTS",
[RTEMS_MEDIA_ERROR_PARTITION_UNKNOWN] = "ERROR PARTITION UNKNOWN",
[RTEMS_MEDIA_ERROR_PARTITION_ORPHAN] = "ERROR PARTITION ORPHAN",
[RTEMS_MEDIA_ERROR_PARTITION_DETACH_WITH_MOUNT] = "ERROR PARTITION DETACH WITH MOUNT",
[RTEMS_MEDIA_ERROR_PARTITION_WITH_UNKNOWN_DISK] = "ERROR PARTITION WITH UNKNOWN DISK",
[RTEMS_MEDIA_ERROR_PARTITION_DETACH_WITH_MOUNT] =
"ERROR PARTITION DETACH WITH MOUNT",
[RTEMS_MEDIA_ERROR_PARTITION_WITH_UNKNOWN_DISK] =
"ERROR PARTITION WITH UNKNOWN DISK",
[RTEMS_MEDIA_ERROR_MOUNT_POINT_UNKNOWN] = "ERROR MOUNT POINT UNKNOWN",
[RTEMS_MEDIA_ERROR_MOUNT_POINT_EXISTS] = "ERROR MOUNT POINT EXISTS",
[RTEMS_MEDIA_ERROR_MOUNT_POINT_ORPHAN] = "ERROR MOUNT POINT ORPHAN"
};
#define TC(table) (sizeof(table) / sizeof(table [0]))
#define TC( table ) ( sizeof( table ) / sizeof( table[ 0 ] ) )
const char *rtems_media_event_description(rtems_media_event event)
const char *rtems_media_event_description( rtems_media_event event )
{
if ((size_t) event < TC(rtems_media_event_desc_table)) {
return rtems_media_event_desc_table [event];
} else {
return "INVALID";
}
}
const char *rtems_media_state_description(rtems_media_state state)
{
if ((size_t) state < TC(rtems_media_state_desc_table)) {
return rtems_media_state_desc_table [state];
if ( (size_t) event < TC( rtems_media_event_desc_table ) ) {
return rtems_media_event_desc_table[ event ];
} else {
return "INVALID";
}
}
const char *rtems_media_state_description( rtems_media_state state )
{
if ( (size_t) state < TC( rtems_media_state_desc_table ) ) {
return rtems_media_state_desc_table[ state ];
} else {
return "INVALID";
}
+4 -4
View File
@@ -43,14 +43,14 @@
rtems_status_code rtems_media_get_device_identifier(
const char *device_path,
dev_t *device_identifier
dev_t *device_identifier
)
{
int rv = 0;
int rv = 0;
struct stat st;
rv = stat(device_path, &st);
if (rv != 0) {
rv = stat( device_path, &st );
if ( rv != 0 ) {
return RTEMS_INVALID_ID;
}
+26 -26
View File
@@ -42,57 +42,57 @@
#include <rtems/media.h>
char *rtems_media_create_path(
const char *prefix,
const char *name,
const char *prefix,
const char *name,
rtems_device_major_number major
)
{
size_t const size = strlen(prefix) + 1 + strlen(name) + 1 + 10 + 1;
char *const s = malloc(size);
size_t const size = strlen( prefix ) + 1 + strlen( name ) + 1 + 10 + 1;
char *const s = malloc( size );
if (s != NULL) {
if ( s != NULL ) {
#ifndef NDEBUG
int rv =
int rv =
#endif
snprintf(s, size, "%s/%s-%" PRIu32, prefix, name, major);
assert(rv < (int) size);
snprintf( s, size, "%s/%s-%" PRIu32, prefix, name, major );
assert( rv < (int) size );
}
return s;
}
char *rtems_media_replace_prefix(const char *new_prefix, const char *path)
char *rtems_media_replace_prefix( const char *new_prefix, const char *path )
{
const char *const name_try = strrchr(path, '/');
const char *const name = (name_try == NULL) ? path : name_try + 1;
size_t const new_prefix_len = strlen(new_prefix);
size_t const name_size = strlen(name) + 1;
size_t const size = new_prefix_len + 1 + name_size;
char *const s = malloc(size);
const char *const name_try = strrchr( path, '/' );
const char *const name = ( name_try == NULL ) ? path : name_try + 1;
size_t const new_prefix_len = strlen( new_prefix );
size_t const name_size = strlen( name ) + 1;
size_t const size = new_prefix_len + 1 + name_size;
char *const s = malloc( size );
if (s != NULL) {
memcpy(s, new_prefix, new_prefix_len);
s [new_prefix_len] = '/';
memcpy(s + new_prefix_len + 1, name, name_size);
if ( s != NULL ) {
memcpy( s, new_prefix, new_prefix_len );
s[ new_prefix_len ] = '/';
memcpy( s + new_prefix_len + 1, name, name_size );
}
return s;
}
char *rtems_media_append_minor(
const char *path,
const char *path,
rtems_device_minor_number minor
)
{
size_t const size = strlen(path) + 1 + 10 + 1;
char *const s = malloc(size);
size_t const size = strlen( path ) + 1 + 10 + 1;
char *const s = malloc( size );
if (s != NULL) {
if ( s != NULL ) {
#ifndef NDEBUG
int rv =
int rv =
#endif
snprintf(s, size, "%s-%" PRIu32, path, minor);
assert(rv < (int) size);
snprintf( s, size, "%s-%" PRIu32, path, minor );
assert( rv < (int) size );
}
return s;
+32 -32
View File
@@ -44,22 +44,22 @@
#define EVENT RTEMS_EVENT_13
typedef struct {
rtems_chain_node node;
rtems_media_event event;
const char *src;
rtems_chain_node node;
rtems_media_event event;
const char *src;
rtems_media_worker worker;
void *worker_arg;
void *worker_arg;
} message;
static RTEMS_CHAIN_DEFINE_EMPTY(message_chain);
static RTEMS_CHAIN_DEFINE_EMPTY( message_chain );
static rtems_id server_id = RTEMS_ID_NONE;
static void media_server(rtems_task_argument arg RTEMS_UNUSED)
static void media_server( rtems_task_argument arg RTEMS_UNUSED )
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
while (true) {
while ( true ) {
message *msg = NULL;
sc = rtems_chain_get_with_wait(
@@ -68,8 +68,8 @@ static void media_server(rtems_task_argument arg RTEMS_UNUSED)
RTEMS_NO_TIMEOUT,
(rtems_chain_node **) &msg
);
assert(sc == RTEMS_SUCCESSFUL);
assert(msg != NULL);
assert( sc == RTEMS_SUCCESSFUL );
assert( msg != NULL );
rtems_media_post_event(
msg->event,
@@ -79,75 +79,75 @@ static void media_server(rtems_task_argument arg RTEMS_UNUSED)
msg->worker_arg
);
free(msg);
free( msg );
}
}
rtems_status_code rtems_media_server_initialize(
rtems_task_priority priority,
size_t stack_size,
rtems_mode modes,
rtems_attribute attributes
size_t stack_size,
rtems_mode modes,
rtems_attribute attributes
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
if (server_id == RTEMS_ID_NONE) {
if ( server_id == RTEMS_ID_NONE ) {
sc = rtems_media_initialize();
if (sc != RTEMS_SUCCESSFUL) {
if ( sc != RTEMS_SUCCESSFUL ) {
goto error;
}
sc = rtems_task_create(
rtems_build_name('M', 'D', 'I', 'A'),
rtems_build_name( 'M', 'D', 'I', 'A' ),
priority,
stack_size,
modes,
attributes,
&server_id
);
if (sc != RTEMS_SUCCESSFUL) {
if ( sc != RTEMS_SUCCESSFUL ) {
goto error;
}
sc = rtems_task_start(server_id, media_server, 0);
if (sc != RTEMS_SUCCESSFUL) {
sc = rtems_task_start( server_id, media_server, 0 );
if ( sc != RTEMS_SUCCESSFUL ) {
goto error;
}
}
return RTEMS_SUCCESSFUL;
error:
if (server_id != RTEMS_ID_NONE) {
rtems_task_delete(server_id);
if ( server_id != RTEMS_ID_NONE ) {
rtems_task_delete( server_id );
}
return RTEMS_NO_MEMORY;
}
rtems_status_code rtems_media_server_post_event(
rtems_media_event event,
const char *src,
rtems_media_event event,
const char *src,
rtems_media_worker worker,
void *worker_arg
void *worker_arg
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
size_t src_size = strlen(src) + 1;
message *msg = malloc(sizeof(*msg) + src_size);
size_t src_size = strlen( src ) + 1;
message *msg = malloc( sizeof( *msg ) + src_size );
if (msg != NULL) {
char *s = (char *) msg + sizeof(*msg);
if ( msg != NULL ) {
char *s = (char *) msg + sizeof( *msg );
memcpy(s, src, src_size);
memcpy( s, src, src_size );
msg->event = event;
msg->src = s;
msg->worker = worker;
msg->worker_arg = worker_arg;
rtems_chain_initialize_node(&msg->node);
rtems_chain_initialize_node( &msg->node );
sc = rtems_chain_append_with_notification(
&message_chain,
@@ -155,7 +155,7 @@ rtems_status_code rtems_media_server_post_event(
server_id,
EVENT
);
if (sc != RTEMS_SUCCESSFUL) {
if ( sc != RTEMS_SUCCESSFUL ) {
sc = RTEMS_NOT_CONFIGURED;
}
} else {
File diff suppressed because it is too large Load Diff
+31 -30
View File
@@ -46,48 +46,49 @@
#include <rtems/nvdisk-sram.h>
#ifndef NVDISK_SRAM_ERROR_TRACE
#define NVDISK_SRAM_ERROR_TRACE (0)
#define NVDISK_SRAM_ERROR_TRACE ( 0 )
#endif
static int
rtems_nvdisk_sram_read (uint32_t device RTEMS_UNUSED,
uint32_t flags RTEMS_UNUSED,
void* base,
uint32_t offset,
void* buffer,
size_t size)
static int rtems_nvdisk_sram_read(
uint32_t device RTEMS_UNUSED,
uint32_t flags RTEMS_UNUSED,
void *base,
uint32_t offset,
void *buffer,
size_t size
)
{
memcpy (buffer, (base + offset), size);
memcpy( buffer, ( base + offset ), size );
return 0;
}
static int
rtems_nvdisk_sram_write (uint32_t device RTEMS_UNUSED,
uint32_t flags RTEMS_UNUSED,
void* base,
uint32_t offset,
const void* buffer,
size_t size)
static int rtems_nvdisk_sram_write(
uint32_t device RTEMS_UNUSED,
uint32_t flags RTEMS_UNUSED,
void *base,
uint32_t offset,
const void *buffer,
size_t size
)
{
memcpy ((base + offset), buffer, size);
memcpy( ( base + offset ), buffer, size );
return 0;
}
static int
rtems_nvdisk_sram_verify (uint32_t device RTEMS_UNUSED,
uint32_t flags RTEMS_UNUSED,
void* base,
uint32_t offset,
const void* buffer,
size_t size)
static int rtems_nvdisk_sram_verify(
uint32_t device RTEMS_UNUSED,
uint32_t flags RTEMS_UNUSED,
void *base,
uint32_t offset,
const void *buffer,
size_t size
)
{
return memcmp ((base + offset), buffer, size) == 0 ? 0 : EIO;
return memcmp( ( base + offset ), buffer, size ) == 0 ? 0 : EIO;
}
const rtems_nvdisk_driver_handlers rtems_nvdisk_sram_handlers =
{
.read = rtems_nvdisk_sram_read,
.write = rtems_nvdisk_sram_write,
const rtems_nvdisk_driver_handlers rtems_nvdisk_sram_handlers = {
.read = rtems_nvdisk_sram_read,
.write = rtems_nvdisk_sram_write,
.verify = rtems_nvdisk_sram_verify
};
File diff suppressed because it is too large Load Diff
+46 -49
View File
@@ -21,18 +21,18 @@
#include <rtems/libio.h>
#include <rtems/ramdisk.h>
rtems_device_driver
ramdisk_initialize(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void *arg RTEMS_UNUSED)
rtems_device_driver ramdisk_initialize(
rtems_device_major_number major RTEMS_UNUSED,
rtems_device_minor_number minor RTEMS_UNUSED,
void *arg RTEMS_UNUSED
)
{
rtems_device_minor_number i;
rtems_ramdisk_config *c = rtems_ramdisk_configuration;
struct ramdisk *r;
rtems_status_code rc;
rtems_device_minor_number i;
rtems_ramdisk_config *c = rtems_ramdisk_configuration;
struct ramdisk *r;
rtems_status_code rc;
/*
/*
* Coverity Id 27 notes that this calloc() is a resource leak.
*
* This is allocating memory for a RAM disk which will persist for
@@ -40,44 +40,41 @@ ramdisk_initialize(
* so there is no corresponding free(r). Coverity is correct that
* it is never freed but this is not a problem.
*/
r = calloc(rtems_ramdisk_configuration_size, sizeof(struct ramdisk));
r->trace = false;
for (i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++)
{
char name [] = RAMDISK_DEVICE_BASE_NAME "a";
name [sizeof(RAMDISK_DEVICE_BASE_NAME) - 1] += i;
r->block_size = c->block_size;
r->block_num = c->block_num;
if (c->location == NULL)
{
r->malloced = true;
r->area = malloc(r->block_size * r->block_num);
if (r->area == NULL) /* No enough memory for this disk */
{
r->initialized = false;
continue;
}
else
{
r->initialized = true;
}
}
else
{
r->malloced = false;
r->initialized = true;
r->area = c->location;
}
rc = rtems_blkdev_create(name, c->block_size, c->block_num,
ramdisk_ioctl, r);
if (rc != RTEMS_SUCCESSFUL)
{
if (r->malloced)
{
free(r->area);
}
r->initialized = false;
}
r = calloc( rtems_ramdisk_configuration_size, sizeof( struct ramdisk ) );
r->trace = false;
for ( i = 0; i < rtems_ramdisk_configuration_size; i++, c++, r++ ) {
char name[] = RAMDISK_DEVICE_BASE_NAME "a";
name[ sizeof( RAMDISK_DEVICE_BASE_NAME ) - 1 ] += i;
r->block_size = c->block_size;
r->block_num = c->block_num;
if ( c->location == NULL ) {
r->malloced = true;
r->area = malloc( r->block_size * r->block_num );
if ( r->area == NULL ) /* No enough memory for this disk */
{
r->initialized = false;
continue;
} else {
r->initialized = true;
}
} else {
r->malloced = false;
r->initialized = true;
r->area = c->location;
}
return RTEMS_SUCCESSFUL;
rc = rtems_blkdev_create(
name,
c->block_size,
c->block_num,
ramdisk_ioctl,
r
);
if ( rc != RTEMS_SUCCESSFUL ) {
if ( r->malloced ) {
free( r->area );
}
r->initialized = false;
}
}
return RTEMS_SUCCESSFUL;
}
+90 -80
View File
@@ -16,7 +16,7 @@
#endif
/* FIXME: How to set this define? */
#if !defined(RTEMS_RAMDISK_TRACE)
#if !defined( RTEMS_RAMDISK_TRACE )
#define RTEMS_RAMDISK_TRACE 0
#endif
@@ -32,106 +32,116 @@
#include <rtems/ramdisk.h>
#if RTEMS_RAMDISK_TRACE
static void
rtems_ramdisk_printf (const ramdisk *rd, const char *format, ...)
{
if (rd->trace)
{
va_list args;
va_start (args, format);
printf ("ramdisk:");
vprintf (format, args);
printf ("\n");
}
}
#endif
static int
ramdisk_read(struct ramdisk *rd, rtems_blkdev_request *req)
static void rtems_ramdisk_printf( const ramdisk *rd, const char *format, ... )
{
uint8_t *from = rd->area;
uint32_t i;
rtems_blkdev_sg_buffer *sg;
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk read: start=%d, blocks=%d",
req->bufs[0].block, req->bufnum);
if ( rd->trace ) {
va_list args;
va_start( args, format );
printf( "ramdisk:" );
vprintf( format, args );
printf( "\n" );
}
}
#endif
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
{
static int ramdisk_read( struct ramdisk *rd, rtems_blkdev_request *req )
{
uint8_t *from = rd->area;
uint32_t i;
rtems_blkdev_sg_buffer *sg;
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
i, sg->block, sg->length, sg->block * rd->block_size,
from + (sg->block * rd->block_size));
rtems_ramdisk_printf(
rd,
"ramdisk read: start=%d, blocks=%d",
req->bufs[ 0 ].block,
req->bufnum
);
#endif
memcpy(sg->buffer, from + (sg->block * rd->block_size), sg->length);
}
rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
return 0;
for ( i = 0, sg = req->bufs; i < req->bufnum; i++, sg++ ) {
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf(
rd,
"ramdisk read: buf=%d block=%d length=%d off=%d addr=%p",
i,
sg->block,
sg->length,
sg->block * rd->block_size,
from + ( sg->block * rd->block_size )
);
#endif
memcpy( sg->buffer, from + ( sg->block * rd->block_size ), sg->length );
}
rtems_blkdev_request_done( req, RTEMS_SUCCESSFUL );
return 0;
}
static int
ramdisk_write(struct ramdisk *rd, rtems_blkdev_request *req)
static int ramdisk_write( struct ramdisk *rd, rtems_blkdev_request *req )
{
uint8_t *to = rd->area;
uint32_t i;
rtems_blkdev_sg_buffer *sg;
uint8_t *to = rd->area;
uint32_t i;
rtems_blkdev_sg_buffer *sg;
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk write: start=%d, blocks=%d",
req->bufs[0].block, req->bufnum);
rtems_ramdisk_printf(
rd,
"ramdisk write: start=%d, blocks=%d",
req->bufs[ 0 ].block,
req->bufnum
);
#endif
for (i = 0, sg = req->bufs; i < req->bufnum; i++, sg++)
{
for ( i = 0, sg = req->bufs; i < req->bufnum; i++, sg++ ) {
#if RTEMS_RAMDISK_TRACE
rtems_ramdisk_printf (rd, "ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
i, sg->block, sg->length, sg->block * rd->block_size,
to + (sg->block * rd->block_size));
rtems_ramdisk_printf(
rd,
"ramdisk write: buf=%d block=%d length=%d off=%d addr=%p",
i,
sg->block,
sg->length,
sg->block * rd->block_size,
to + ( sg->block * rd->block_size )
);
#endif
memcpy(to + (sg->block * rd->block_size), sg->buffer, sg->length);
}
rtems_blkdev_request_done (req, RTEMS_SUCCESSFUL);
return 0;
memcpy( to + ( sg->block * rd->block_size ), sg->buffer, sg->length );
}
rtems_blkdev_request_done( req, RTEMS_SUCCESSFUL );
return 0;
}
int
ramdisk_ioctl(rtems_disk_device *dd, uint32_t req, void *argp)
int ramdisk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
{
struct ramdisk *rd = rtems_disk_get_driver_data(dd);
struct ramdisk *rd = rtems_disk_get_driver_data( dd );
switch (req)
{
case RTEMS_BLKIO_REQUEST:
{
rtems_blkdev_request *r = argp;
switch ( req ) {
case RTEMS_BLKIO_REQUEST: {
rtems_blkdev_request *r = argp;
switch (r->req)
{
case RTEMS_BLKDEV_REQ_READ:
return ramdisk_read(rd, r);
switch ( r->req ) {
case RTEMS_BLKDEV_REQ_READ:
return ramdisk_read( rd, r );
case RTEMS_BLKDEV_REQ_WRITE:
return ramdisk_write(rd, r);
default:
errno = EINVAL;
return -1;
}
break;
}
case RTEMS_BLKIO_DELETED:
if (rd->free_at_delete_request) {
ramdisk_free(rd);
}
break;
case RTEMS_BLKDEV_REQ_WRITE:
return ramdisk_write( rd, r );
default:
return rtems_blkdev_ioctl (dd, req, argp);
break;
errno = EINVAL;
return -1;
}
break;
}
errno = EINVAL;
return -1;
case RTEMS_BLKIO_DELETED:
if ( rd->free_at_delete_request ) {
ramdisk_free( rd );
}
break;
default:
return rtems_blkdev_ioctl( dd, req, argp );
break;
}
errno = EINVAL;
return -1;
}
+14 -14
View File
@@ -43,22 +43,22 @@
#include <rtems/ramdisk.h>
ramdisk *ramdisk_allocate(
void *area_begin,
uint32_t media_block_size,
void *area_begin,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
bool trace
bool trace
)
{
struct ramdisk *rd = calloc(1, sizeof(*rd));
struct ramdisk *rd = calloc( 1, sizeof( *rd ) );
if (rd == NULL) {
if ( rd == NULL ) {
return NULL;
}
if (area_begin == NULL) {
area_begin = calloc(media_block_count, media_block_size);
if (area_begin == NULL) {
free(rd);
if ( area_begin == NULL ) {
area_begin = calloc( media_block_count, media_block_size );
if ( area_begin == NULL ) {
free( rd );
return NULL;
}
@@ -75,12 +75,12 @@ ramdisk *ramdisk_allocate(
return rd;
}
void ramdisk_free(ramdisk *rd)
void ramdisk_free( ramdisk *rd )
{
if (rd != NULL) {
if (rd->malloced) {
free(rd->area);
if ( rd != NULL ) {
if ( rd->malloced ) {
free( rd->area );
}
free(rd);
free( rd );
}
}
+8 -8
View File
@@ -40,17 +40,17 @@
#include <rtems/ramdisk.h>
rtems_status_code ramdisk_register(
uint32_t media_block_size,
uint32_t media_block_size,
rtems_blkdev_bnum media_block_count,
bool trace,
const char *disk
bool trace,
const char *disk
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
ramdisk *rd = NULL;
ramdisk *rd = NULL;
rd = ramdisk_allocate(NULL, media_block_size, media_block_count, trace);
if (rd == NULL) {
rd = ramdisk_allocate( NULL, media_block_size, media_block_count, trace );
if ( rd == NULL ) {
return RTEMS_UNSATISFIED;
}
@@ -61,8 +61,8 @@ rtems_status_code ramdisk_register(
ramdisk_ioctl,
rd
);
if (sc != RTEMS_SUCCESSFUL) {
ramdisk_free(rd);
if ( sc != RTEMS_SUCCESSFUL ) {
ramdisk_free( rd );
return RTEMS_UNSATISFIED;
}
File diff suppressed because it is too large Load Diff
+87 -61
View File
@@ -48,16 +48,16 @@
*/
static rtems_sparse_disk *sparse_disk_allocate(
const uint32_t media_block_size,
const rtems_blkdev_bnum blocks_with_buffer )
const rtems_blkdev_bnum blocks_with_buffer
)
{
size_t const key_table_size = blocks_with_buffer
* sizeof( rtems_sparse_disk_key );
size_t const data_size = blocks_with_buffer * media_block_size;
size_t const alloc_size = sizeof( rtems_sparse_disk )
+ key_table_size + data_size;
size_t const key_table_size = blocks_with_buffer *
sizeof( rtems_sparse_disk_key );
size_t const data_size = blocks_with_buffer * media_block_size;
size_t const alloc_size = sizeof( rtems_sparse_disk ) + key_table_size +
data_size;
rtems_sparse_disk *const sd = (rtems_sparse_disk *) malloc(
alloc_size );
rtems_sparse_disk *const sd = (rtems_sparse_disk *) malloc( alloc_size );
return sd;
}
@@ -65,42 +65,47 @@ static rtems_sparse_disk *sparse_disk_allocate(
/*
* Initialize sparse disk data
*/
static rtems_status_code sparse_disk_initialize( rtems_sparse_disk *sd,
const uint32_t media_block_size,
const rtems_blkdev_bnum blocks_with_buffer,
const rtems_sparse_disk_delete_handler sparse_disk_delete,
const uint8_t fill_pattern )
static rtems_status_code sparse_disk_initialize(
rtems_sparse_disk *sd,
const uint32_t media_block_size,
const rtems_blkdev_bnum blocks_with_buffer,
const rtems_sparse_disk_delete_handler sparse_disk_delete,
const uint8_t fill_pattern
)
{
rtems_blkdev_bnum i;
if ( NULL == sd )
if ( NULL == sd ) {
return RTEMS_INVALID_ADDRESS;
}
uint8_t *data = (uint8_t *) sd;
size_t const key_table_size = blocks_with_buffer
* sizeof( rtems_sparse_disk_key );
size_t const data_size = blocks_with_buffer * media_block_size;
uint8_t *data = (uint8_t *) sd;
size_t const key_table_size = blocks_with_buffer *
sizeof( rtems_sparse_disk_key );
size_t const data_size = blocks_with_buffer * media_block_size;
memset( data, 0, sizeof( rtems_sparse_disk ) + key_table_size );
sd->fill_pattern = fill_pattern;
memset( (uint8_t *) ( data + sizeof( rtems_sparse_disk ) + key_table_size ),
sd->fill_pattern,
data_size );
memset(
(uint8_t *) ( data + sizeof( rtems_sparse_disk ) + key_table_size ),
sd->fill_pattern,
data_size
);
sd->delete_handler = sparse_disk_delete;
rtems_mutex_init( &sd->mutex, "Sparse Disk" );
data += sizeof( rtems_sparse_disk );
data += sizeof( rtems_sparse_disk );
sd->blocks_with_buffer = blocks_with_buffer;
sd->key_table = (rtems_sparse_disk_key *) data;
sd->key_table = (rtems_sparse_disk_key *) data;
data += key_table_size;
data += key_table_size;
for ( i = 0; i < blocks_with_buffer; ++i, data += media_block_size ) {
sd->key_table[i].data = data;
sd->key_table[ i ].data = data;
}
sd->media_block_size = media_block_size;
@@ -167,20 +172,23 @@ static int sparse_disk_read_block(
const rtems_sparse_disk *sparse_disk,
const rtems_blkdev_bnum block,
uint8_t *buffer,
const size_t buffer_size )
const size_t buffer_size
)
{
size_t bytes_to_copy = sparse_disk->media_block_size;
rtems_sparse_disk_key *key;
if ( buffer_size < bytes_to_copy )
if ( buffer_size < bytes_to_copy ) {
bytes_to_copy = buffer_size;
}
key = sparse_disk_find_block( sparse_disk, block );
if ( NULL != key )
if ( NULL != key ) {
memcpy( buffer, key->data, bytes_to_copy );
else
} else {
memset( buffer, sparse_disk->fill_pattern, buffer_size );
}
return bytes_to_copy;
}
@@ -189,15 +197,17 @@ static int sparse_disk_write_block(
rtems_sparse_disk *sparse_disk,
const rtems_blkdev_bnum block,
const uint8_t *buffer,
const size_t buffer_size )
const size_t buffer_size
)
{
size_t bytes_to_copy = sparse_disk->media_block_size;
bool block_needs_writing = false;
rtems_sparse_disk_key *key;
size_t i;
if ( buffer_size < bytes_to_copy )
if ( buffer_size < bytes_to_copy ) {
bytes_to_copy = buffer_size;
}
/* we only need to write the block if it is different from the fill pattern.
* If the read method does not find a block it will deliver the fill pattern anyway.
@@ -207,8 +217,9 @@ static int sparse_disk_write_block(
if ( NULL == key ) {
for ( i = 0; ( !block_needs_writing ) && ( i < bytes_to_copy ); ++i ) {
if ( buffer[i] != sparse_disk->fill_pattern )
if ( buffer[ i ] != sparse_disk->fill_pattern ) {
block_needs_writing = true;
}
}
if ( block_needs_writing ) {
@@ -216,10 +227,11 @@ static int sparse_disk_write_block(
}
}
if ( NULL != key )
if ( NULL != key ) {
memcpy( key->data, buffer, bytes_to_copy );
else if ( block_needs_writing )
} else if ( block_needs_writing ) {
return -1;
}
return bytes_to_copy;
}
@@ -230,7 +242,8 @@ static int sparse_disk_write_block(
static int sparse_disk_read_write(
rtems_sparse_disk *sparse_disk,
rtems_blkdev_request *req,
const bool read )
const bool read
)
{
int rv = 0;
uint32_t req_buffer;
@@ -242,40 +255,46 @@ static int sparse_disk_read_write(
rtems_mutex_lock( &sparse_disk->mutex );
for ( req_buffer = 0;
( 0 <= rv ) && ( req_buffer < req->bufnum );
++req_buffer ) {
scatter_gather = &req->bufs[req_buffer];
for (
req_buffer = 0; ( 0 <= rv ) && ( req_buffer < req->bufnum ); ++req_buffer
) {
scatter_gather = &req->bufs[ req_buffer ];
bytes_handled = 0;
buff = (uint8_t *) scatter_gather->buffer;
block = scatter_gather->block;
buff_size = scatter_gather->length;
bytes_handled = 0;
buff = (uint8_t *) scatter_gather->buffer;
block = scatter_gather->block;
buff_size = scatter_gather->length;
while ( ( 0 <= rv ) && ( 0 < buff_size ) ) {
if ( read )
rv = sparse_disk_read_block( sparse_disk,
block,
&buff[bytes_handled],
buff_size );
else
rv = sparse_disk_write_block( sparse_disk,
block,
&buff[bytes_handled],
buff_size );
if ( read ) {
rv = sparse_disk_read_block(
sparse_disk,
block,
&buff[ bytes_handled ],
buff_size
);
} else {
rv = sparse_disk_write_block(
sparse_disk,
block,
&buff[ bytes_handled ],
buff_size
);
}
++block;
bytes_handled += rv;
buff_size -= rv;
buff_size -= rv;
}
}
rtems_mutex_unlock( &sparse_disk->mutex );
if ( 0 > rv )
if ( 0 > rv ) {
rtems_blkdev_request_done( req, RTEMS_IO_ERROR );
else
} else {
rtems_blkdev_request_done( req, RTEMS_SUCCESSFUL );
}
return 0;
}
@@ -293,15 +312,20 @@ static int sparse_disk_ioctl( rtems_disk_device *dd, uint32_t req, void *argp )
switch ( r->req ) {
case RTEMS_BLKDEV_REQ_READ:
case RTEMS_BLKDEV_REQ_WRITE:
return sparse_disk_read_write( sd, r, r->req == RTEMS_BLKDEV_REQ_READ );
return sparse_disk_read_write(
sd,
r,
r->req == RTEMS_BLKDEV_REQ_READ
);
default:
break;
}
} else if ( RTEMS_BLKIO_DELETED == req ) {
rtems_mutex_destroy( &sd->mutex );
if ( NULL != sd->delete_handler )
if ( NULL != sd->delete_handler ) {
( *sd->delete_handler )( sd );
}
return 0;
} else {
@@ -322,9 +346,10 @@ rtems_status_code rtems_sparse_disk_create_and_register(
uint32_t media_block_size,
rtems_blkdev_bnum blocks_with_buffer,
rtems_blkdev_bnum media_block_count,
uint8_t fill_pattern )
uint8_t fill_pattern
)
{
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_status_code sc = RTEMS_SUCCESSFUL;
rtems_sparse_disk *sparse_disk = sparse_disk_allocate(
media_block_size,
blocks_with_buffer
@@ -354,7 +379,8 @@ rtems_status_code rtems_sparse_disk_register(
rtems_blkdev_bnum blocks_with_buffer,
rtems_blkdev_bnum media_block_count,
uint8_t fill_pattern,
rtems_sparse_disk_delete_handler sparse_disk_delete )
rtems_sparse_disk_delete_handler sparse_disk_delete
)
{
rtems_status_code sc;