source: rtems/cpukit/libfs/src/imfs/imfs_initsupp.c @ 183af89

4.115
Last change on this file since 183af89 was 699ac7c, checked in by Sebastian Huber <sebastian.huber@…>, on 02/24/12 at 16:08:06

IMFS: Add and use node control

Add and use structure IMFS_node_control with support functions. This
helps to make high level functions independent of the node type and
reduces the number of branches in the code.

  • Property mode set to 100644
File size: 3.4 KB
Line 
1/*
2 *  IMFS Initialization
3 *
4 *  COPYRIGHT (c) 1989-2010.
5 *  On-Line Applications Research Corporation (OAR).
6 *
7 *  The license and distribution terms for this file may be
8 *  found in the file LICENSE in this distribution or at
9 *  http://www.rtems.com/license/LICENSE.
10 *
11 *  $Id$
12 */
13
14#if HAVE_CONFIG_H
15  #include "config.h"
16#endif
17
18#include "imfs.h"
19
20#include <stdlib.h>
21
22/*
23 *  IMFS_determine_bytes_per_block
24 */
25int imfs_memfile_bytes_per_block = 0;
26
27static int IMFS_determine_bytes_per_block(
28  int *dest_bytes_per_block,
29  int requested_bytes_per_block,
30  int default_bytes_per_block
31)
32{
33  bool is_valid = false;
34  int bit_mask;
35
36  /*
37   * check, whether requested bytes per block is valid
38   */
39  for (bit_mask = 16; !is_valid && (bit_mask <= 512); bit_mask <<= 1) {
40    if (bit_mask == requested_bytes_per_block) {
41      is_valid = true;
42      break;
43    }
44    if(bit_mask > requested_bytes_per_block)
45      break;
46  }
47  *dest_bytes_per_block = ((is_valid)
48                           ? requested_bytes_per_block
49                           : default_bytes_per_block);
50  return 0;
51}
52
53int IMFS_initialize_support(
54  rtems_filesystem_mount_table_entry_t *mt_entry,
55  const rtems_filesystem_operations_table *op_table,
56  const IMFS_node_control *const node_controls [IMFS_TYPE_COUNT]
57)
58{
59  static int imfs_instance;
60
61  int rv = 0;
62  IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
63
64  if ( fs_info != NULL ) {
65    IMFS_jnode_t *root_node;
66
67    fs_info->instance = imfs_instance++;
68    memcpy(
69      fs_info->node_controls,
70      node_controls,
71      sizeof( fs_info->node_controls )
72    );
73
74    root_node = IMFS_allocate_node(
75      fs_info,
76      fs_info->node_controls [IMFS_DIRECTORY],
77      "",
78      0,
79      (S_IFDIR | 0755),
80      NULL
81    );
82    if ( root_node != NULL ) {
83      mt_entry->fs_info = fs_info;
84      mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
85      mt_entry->mt_fs_root->location.node_access = root_node;
86      mt_entry->mt_fs_root->location.ops = op_table;
87      IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
88    } else {
89      errno = ENOMEM;
90      rv = -1;
91    }
92  } else {
93    errno = ENOMEM;
94    rv = -1;
95  }
96
97  if ( rv == 0 ) {
98    IMFS_determine_bytes_per_block(
99      &imfs_memfile_bytes_per_block,
100      imfs_rq_memfile_bytes_per_block,
101      IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
102    );
103  }
104
105  return rv;
106}
107
108int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
109{
110  IMFS_jnode_t *node = loc->node_access;
111
112  ++node->reference_count;
113
114  return 0;
115}
116
117void IMFS_node_destroy( IMFS_jnode_t *node )
118{
119  IMFS_assert( node->reference_count == 0 );
120
121  node = (*node->control->node_destroy)( node );
122
123  free( node );
124}
125
126void IMFS_node_free( const rtems_filesystem_location_info_t *loc )
127{
128  IMFS_jnode_t *node = loc->node_access;
129
130  if ( node->reference_count == 1 ) {
131    IMFS_node_destroy( node );
132  } else {
133    --node->reference_count;
134  }
135}
136
137IMFS_jnode_t *IMFS_node_initialize_default(
138  IMFS_jnode_t *node,
139  const IMFS_types_union *info
140)
141{
142  return node;
143}
144
145IMFS_jnode_t *IMFS_node_remove_default(
146  IMFS_jnode_t *node,
147  const IMFS_jnode_t *root_node
148)
149{
150  return node;
151}
152
153IMFS_jnode_t *IMFS_node_destroy_default( IMFS_jnode_t *node )
154{
155  return node;
156}
157
158const IMFS_node_control IMFS_node_control_default = {
159  .imfs_type = IMFS_INVALID_NODE,
160  .handlers = &rtems_filesystem_handlers_default,
161  .node_initialize = IMFS_node_initialize_default,
162  .node_remove = IMFS_node_remove_default,
163  .node_destroy = IMFS_node_destroy_default
164};
Note: See TracBrowser for help on using the repository browser.