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

4.115
Last change on this file since cf36b70 was cf36b70, checked in by Sebastian Huber <sebastian.huber@…>, on 12/31/14 at 09:56:05

IMFS: Replace node union with individual struct

This reduces the average node size.

Add and use IMFS_GENERIC_INITIALIZER().

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