source: rtems/cpukit/libfs/src/rfs/rtems-rfs-buffer.h @ 2d2f01d

4.10
Last change on this file since 2d2f01d was 2d2f01d, checked in by Ralf Corsepius <ralf.corsepius@…>, on 06/16/10 at 14:41:01

2010-06-16 Ralf Corsépius <ralf.corsepius@…>

PR 1556/cpukit

  • libfs/src/rfs/rtems-rfs-bitmaps.h, libfs/src/rfs/rtems-rfs-block-pos.h, libfs/src/rfs/rtems-rfs-buffer.h, libfs/src/rfs/rtems-rfs-file-system-fwd.h, libfs/src/rfs/rtems-rfs-file-system.h, libfs/src/rfs/rtems-rfs-file.h, libfs/src/rfs/rtems-rfs-format.h, libfs/src/rfs/rtems-rfs-group.h, libfs/src/rfs/rtems-rfs-inode.h: Rename "struct rtems_rfs_*_t" into "struct _rtems_rfs_*".
  • Property mode set to 100644
File size: 7.4 KB
Line 
1/*
2 *  COPYRIGHT (c) 2010 Chris Johns <chrisj@rtems.org>
3 *
4 *  The license and distribution terms for this file may be
5 *  found in the file LICENSE in this distribution or at
6 *  http://www.rtems.com/license/LICENSE.
7 *
8 *  $Id$
9 */
10/**
11 * @file
12 *
13 * @ingroup rtems-rfs
14 *
15 * RTEMS File Systems Buffer Management.
16 *
17 * These functions map blocks to the media interface layers.
18 */
19
20#if !defined (_RTEMS_RFS_BUFFER_H_)
21#define _RTEMS_RFS_BUFFER_H_
22
23#include <errno.h>
24
25#include <rtems/rfs/rtems-rfs-file-system-fwd.h>
26#include <rtems/rfs/rtems-rfs-trace.h>
27
28/**
29 * Define the method used to interface to the buffers. It can be libblock or
30 * device I/O. The libblock interface is to the RTEMS cache and block devices
31 * and device I/O accesses the media via a device file handle.
32 */
33#if defined (__rtems__)
34#define RTEMS_RFS_USE_LIBBLOCK 1
35#endif
36
37/**
38 * The RTEMS RFS I/O Layering.
39 */
40#if RTEMS_RFS_USE_LIBBLOCK
41#include <rtems/bdbuf.h>
42#include <rtems/error.h>
43
44typedef rtems_blkdev_bnum  rtems_rfs_buffer_block;
45typedef rtems_bdbuf_buffer rtems_rfs_buffer;
46#define rtems_rfs_buffer_io_request rtems_rfs_buffer_bdbuf_request
47#define rtems_rfs_buffer_io_release rtems_rfs_buffer_bdbuf_release
48
49/**
50 * Request a buffer from the RTEMS libblock BD buffer cache.
51 */
52int rtems_rfs_buffer_bdbuf_request (rtems_rfs_file_system* fs,
53                                    rtems_rfs_buffer_block block,
54                                    bool                   read,
55                                    rtems_rfs_buffer**     buffer);
56/**
57 * Release a buffer to the RTEMS libblock BD buffer cache.
58 */
59int rtems_rfs_buffer_bdbuf_release (rtems_rfs_buffer* handle,
60                                    bool              modified);
61#else /* Device I/O */
62typedef uint32_t rtems_rfs_buffer_block;
63typedef struct _rtems_rfs_buffer
64{
65  rtems_chain_node       link;
66  rtems_rfs_buffer_block user;
67  void*                  buffer;
68  size_t                 size;
69  uint32_t               references;
70} rtems_rfs_buffer;
71#define rtems_rfs_buffer_io_request rtems_rfs_buffer_devceio_request
72#define rtems_rfs_buffer_io_release rtems_rfs_uffer_deviceio_release
73
74/**
75 * Request a buffer from the device I/O.
76 */
77int rtems_rfs_buffer_deviceio_request (rtems_rfs_file_system* fs,
78                                       rtems_rfs_buffer_block block,
79                                       bool                   read,
80                                       rtems_rfs_buffer*      buffer);
81/**
82 * Release a buffer to the RTEMS libblock BD buffer cache.
83 */
84int rtems_rfs_buffer_deviceio_release (rtems_rfs_buffer* handle,
85                                       bool              modified);
86#endif
87
88/**
89 * RFS Buffer handle.
90 */
91typedef struct rtems_rfs_buffer_handle_t
92{
93  /**
94   * Has the buffer been modifed?
95   */
96  bool dirty;
97
98  /**
99   * Block number. The lower layer block number may be absolute and we maybe
100   * relative to an offset in the disk so hold locally.
101   */
102  rtems_rfs_buffer_block bnum;
103
104  /**
105   * Reference the buffer descriptor.
106   */
107  rtems_rfs_buffer* buffer;
108
109} rtems_rfs_buffer_handle;
110
111/**
112 * The buffer linkage.
113 */
114#define rtems_rfs_buffer_link(_h) (&(_h)->buffer->link)
115
116/**
117 * Return the start of the data area of the buffer given a handle.
118 */
119#define rtems_rfs_buffer_data(_h) ((void*)((_h)->buffer->buffer))
120
121/**
122 * Return the size of the buffer given a handle.
123 */
124#define rtems_rfs_buffer_size(_h) ((_h)->buffer->size)
125
126/**
127 * Return the block number.
128 */
129#define rtems_rfs_buffer_bnum(_h) ((_h)->bnum)
130
131/**
132 * Return the buffer dirty status.
133 */
134#define rtems_rfs_buffer_dirty(_h) ((_h)->dirty)
135
136/**
137 * Does the handle have a valid block attached ?
138 */
139#define rtems_rfs_buffer_handle_has_block(_h) ((_h)->buffer ? true : false)
140
141/**
142 * Mark the buffer as dirty.
143 */
144#define rtems_rfs_buffer_mark_dirty(_h) ((_h)->dirty = true)
145
146/**
147 * Return the reference count.
148 */
149#define rtems_rfs_buffer_refs(_h) ((_h)->buffer->references)
150
151/**
152 * Increment the reference count.
153 */
154#define rtems_rfs_buffer_refs_up(_h) ((_h)->buffer->references += 1)
155
156/**
157 * Decrement the reference count.
158 */
159#define rtems_rfs_buffer_refs_down(_h) ((_h)->buffer->references -= 1)
160
161/**
162 * Request a buffer. The buffer can be filled with data from the media (read ==
163 * true) or you can request a buffer to fill with data.
164 *
165 * @param fs The file system data.
166 * @param handle The handle the requested buffer is attached to.
167 * @param block The block number.
168 * @param read Read the data from the disk.
169 * @return int The error number (errno). No error if 0.
170 */
171int rtems_rfs_buffer_handle_request (rtems_rfs_file_system*   fs,
172                                     rtems_rfs_buffer_handle* handle,
173                                     rtems_rfs_buffer_block   block,
174                                     bool                     read);
175
176/**
177 * Release a buffer. If the buffer is dirty the buffer is written to disk. The
178 * result does not indicate if the data was successfully written to the disk as
179 * this operation may be performed in asynchronously to this release.
180 *
181 * @param fs The file system data.
182 * @param handle The handle the requested buffer is attached to.
183 * @return int The error number (errno). No error if 0.
184 */
185int rtems_rfs_buffer_handle_release (rtems_rfs_file_system*   fs,
186                                     rtems_rfs_buffer_handle* handle);
187
188/**
189 * Reset a handle.
190 *
191 * @param fs The file system data.
192 * @param handle The buffer handle to reset.
193 * @return int The error number (errno). No error if 0.
194 */
195static inline int
196rtems_rfs_buffer_handle_reset (rtems_rfs_buffer_handle* handle)
197{
198  handle->dirty = false;
199  handle->bnum  = 0;
200  handle->buffer = NULL;
201  return 0;
202}
203
204/**
205 * Open a handle.
206 *
207 * @param fs The file system data.
208 * @param handle The buffer handle to open.
209 * @return int The error number (errno). No error if 0.
210 */
211static inline int
212rtems_rfs_buffer_handle_open (rtems_rfs_file_system*   fs,
213                              rtems_rfs_buffer_handle* handle)
214{
215  rtems_rfs_buffer_handle_reset (handle);
216  return 0;
217}
218
219/**
220 * Close a handle.
221 *
222 * @param fs The file system data.
223 * @param handle The buffer handle to close.
224 * @return int The error number (errno). No error if 0.
225 */
226static inline int
227rtems_rfs_buffer_handle_close (rtems_rfs_file_system*   fs,
228                               rtems_rfs_buffer_handle* handle)
229{
230  rtems_rfs_buffer_handle_release (fs, handle);
231  return 0;
232}
233
234/**
235 * Open the buffer interface.
236 *
237 * @param name The device name to the media.
238 * @param fs Pointer to the file system data.
239 * @return int The error number (errno). No error if 0.
240 */
241int rtems_rfs_buffer_open (const char* name, rtems_rfs_file_system* fs);
242
243/**
244 * Close the buffer interface.
245 *
246 * @param fs Pointer to the file system data.
247 * @return int The error number (errno). No error if 0.
248 */
249int rtems_rfs_buffer_close (rtems_rfs_file_system* fs);
250
251/**
252 * Sync all buffers to the media.
253 *
254 * @param fs Pointer to the file system data.
255 * @return int The error number (errno). No error if 0.
256 */
257int rtems_rfs_buffer_sync (rtems_rfs_file_system* fs);
258
259/**
260 * Set the block size of the device.
261 *
262 * @param fs Pointer to the file system data.
263 * @param size The new block size.
264 * @return int The error number (errno). No error if 0.
265 */
266int rtems_rfs_buffer_setblksize (rtems_rfs_file_system* fs, size_t size);
267
268/**
269 * Release any chained buffers.
270 *
271 * @param fs The file system data.
272 * @return int The error number (errno). No error if 0.
273 */
274int rtems_rfs_buffers_release (rtems_rfs_file_system* fs);
275
276#endif
Note: See TracBrowser for help on using the repository browser.