summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/sparse-disk.h
blob: 7bf448afbd6f8f7559eea3288c9b1eac75619d05 (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
139
140
141
142
143
144
145
146
147
148
149
150
151
/* SPDX-License-Identifier: BSD-2-Clause */

/**
 * @file
 *
 * @ingroup rtems_sparse_disk
 *
 * @brief Sparse disk block device API.
 */

/*
 * Copyright (c) 2012 embedded brains GmbH & Co. KG
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 * POSSIBILITY OF SUCH DAMAGE.
 */

#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 */