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

4.115
Last change on this file since 11109ea was 11109ea, checked in by Alex Ivanov <alexivanov97@…>, on 12/18/12 at 20:46:38

libfs: Doxygen Enhancement Task #2

http://www.google-melange.com/gci/task/view/google/gci2012/8032207

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