summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/sparse-disk.h
blob: 7233c756ba84ba39fa49c362c5622fdce1fce725 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/**
 * @file
 *
 * @ingroup rtems_sparse_disk
 *
 * @brief Sparse disk block device API.
 */

/*
 * Copyright (c) 2012 embedded brains GmbH.  All rights reserved.
 *
 *  embedded brains GmbH
 *  Obere Lagerstr. 30
 *  82178 Puchheim
 *  Germany
 *  <rtems@embedded-brains.de>
 *
 * The license and distribution terms for this file may be
 * found in the file LICENSE in this distribution or at
 * http://www.rtems.org/license/LICENSE.
 */

#ifndef SPARSE_DISK_H
#define SPARSE_DISK_H

#include <stddef.h>
#include <stdint.h>
#include <rtems.h>
#include <rtems/diskdevs.h>
#include <rtems/thread.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * @defgroup rtems_sparse_disk Sparse Disk Device
 *
 * @ingroup rtems_blkdev
 *
 */
/**@{**/

typedef struct {
  rtems_blkdev_bnum  block;
  void              *data;
} rtems_sparse_disk_key;

typedef struct rtems_sparse_disk rtems_sparse_disk;

typedef void (*rtems_sparse_disk_delete_handler)(rtems_sparse_disk *sparse_disk);

struct rtems_sparse_disk {
  rtems_mutex                      mutex;
  rtems_blkdev_bnum                blocks_with_buffer;
  size_t                           used_count;
  uint32_t                         media_block_size;
  rtems_sparse_disk_delete_handler delete_handler;
  uint8_t                          fill_pattern;
  rtems_sparse_disk_key           *key_table;
};

/**
 * @brief Creates and registers a sparse disk.
 *
 * @param[in] device_file_name The device file name path.
 * @param[in] media_block_size The media block size in bytes.
 * @param[in] blocks_with_buffer Blocks of the device with a buffer.  Other
 * blocks can store only fill pattern value bytes.
 * @param[in] block_count The media block count of the device.  It is the sum
 * of blocks with buffer and blocks that contain only fill pattern value bytes.
 * @param[in] fill_pattern The fill pattern specifies the byte value of blocks
 * without a buffer.  It is also the initial value for blocks with a buffer.
 *
 * @retval RTEMS_SUCCESSFUL Successful operation.
 * @retval RTEMS_INVALID_NUMBER Media block size or media block count is not
 * positive.  The blocks with buffer count is greater than the media block count.
 * @retval RTEMS_NO_MEMORY Not enough memory.
 * @retval RTEMS_TOO_MANY Cannot create semaphore.
 * @retval RTEMS_UNSATISFIED Cannot create generic device node.
 *
 * @see rtems_sparse_disk_register().
 */
rtems_status_code rtems_sparse_disk_create_and_register(
  const char        *device_file_name,
  uint32_t           media_block_size,
  rtems_blkdev_bnum  blocks_with_buffer,
  rtems_blkdev_bnum  media_block_count,
  uint8_t            fill_pattern
);

/**
 * @brief Frees a sparse disk.
 *
 * Calls free() on the sparse disk pointer.
 */
void rtems_sparse_disk_free( rtems_sparse_disk *sparse_disk );

/**
 * @brief Initializes and registers a sparse disk.
 *
 * This will create one semaphore for mutual exclusion.
 *
 * @param[in] device_file_name The device file name path.
 * @param[in, out] sparse_disk The sparse disk.
 * @param[in] media_block_size The media block size in bytes.
 * @param[in] blocks_with_buffer Blocks of the device with a buffer.  Other
 * blocks can store only fill pattern value bytes.
 * @param[in] block_count The media block count of the device.  It is the sum
 * of blocks with buffer and blocks that contain only fill pattern value bytes.
 * @param[in] fill_pattern The fill pattern specifies the byte value of blocks
 * without a buffer.  It is also the initial value for blocks with a buffer.
 * @param[in] sparse_disk_delete The sparse disk delete handler.
 *
 * @retval RTEMS_SUCCESSFUL Successful operation.
 * @retval RTEMS_INVALID_NUMBER Media block size or media block count is not
 * positive.  The blocks with buffer count is greater than the media block count.
 * @retval RTEMS_INVALID_ADDRESS Invalid sparse disk address.
 * @retval RTEMS_TOO_MANY Cannot create semaphore.
 * @retval RTEMS_UNSATISFIED Cannot create generic device node.
 */
rtems_status_code rtems_sparse_disk_register(
  const char                       *device_file_name,
  rtems_sparse_disk                *sparse_disk,
  uint32_t                          media_block_size,
  rtems_blkdev_bnum                 blocks_with_buffer,
  rtems_blkdev_bnum                 media_block_count,
  uint8_t                           fill_pattern,
  rtems_sparse_disk_delete_handler  sparse_disk_delete
);

/** @} */

#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif /* SPARSE_DISK_H */