summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs_initsupp.c
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_initsupp.c')
-rw-r--r--cpukit/libfs/src/imfs/imfs_initsupp.c136
1 files changed, 77 insertions, 59 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c
index 042995b878..d480b13480 100644
--- a/cpukit/libfs/src/imfs/imfs_initsupp.c
+++ b/cpukit/libfs/src/imfs/imfs_initsupp.c
@@ -50,61 +50,59 @@ static int IMFS_determine_bytes_per_block(
return 0;
}
-
-/*
- * IMFS_initialize
- */
int IMFS_initialize_support(
- rtems_filesystem_mount_table_entry_t *temp_mt_entry,
- const rtems_filesystem_operations_table *op_table,
- const rtems_filesystem_file_handlers_r *link_handlers,
- const rtems_filesystem_file_handlers_r *fifo_handlers
+ rtems_filesystem_mount_table_entry_t *mt_entry,
+ const rtems_filesystem_operations_table *op_table,
+ const IMFS_node_control *const node_controls [IMFS_TYPE_COUNT]
)
{
- static int imfs_instance;
- IMFS_fs_info_t *fs_info;
- IMFS_jnode_t *jnode;
-
- /*
- * determine/check value for imfs_memfile_bytes_per_block
- */
- IMFS_determine_bytes_per_block(&imfs_memfile_bytes_per_block,
- imfs_rq_memfile_bytes_per_block,
- IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK);
-
- /*
- * Create the root node
- *
- * NOTE: UNIX root is 755 and owned by root/root (0/0).
- */
- temp_mt_entry->mt_fs_root->location.node_access = IMFS_create_root_node();
- temp_mt_entry->mt_fs_root->location.handlers = &IMFS_directory_handlers;
- temp_mt_entry->mt_fs_root->location.ops = op_table;
- temp_mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
-
- /*
- * Create custom file system data.
- */
- fs_info = calloc( 1, sizeof( IMFS_fs_info_t ) );
- if ( !fs_info ) {
- free(temp_mt_entry->mt_fs_root->location.node_access);
- rtems_set_errno_and_return_minus_one(ENOMEM);
+ static int imfs_instance;
+
+ int rv = 0;
+ IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
+
+ if ( fs_info != NULL ) {
+ IMFS_jnode_t *root_node;
+
+ fs_info->instance = imfs_instance++;
+ memcpy(
+ fs_info->node_controls,
+ node_controls,
+ sizeof( fs_info->node_controls )
+ );
+
+ root_node = IMFS_allocate_node(
+ fs_info,
+ fs_info->node_controls [IMFS_DIRECTORY],
+ "",
+ 0,
+ (S_IFDIR | 0755),
+ NULL
+ );
+ if ( root_node != NULL ) {
+ mt_entry->fs_info = fs_info;
+ mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
+ mt_entry->mt_fs_root->location.node_access = root_node;
+ mt_entry->mt_fs_root->location.ops = op_table;
+ IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
+ } else {
+ errno = ENOMEM;
+ rv = -1;
+ }
+ } else {
+ errno = ENOMEM;
+ rv = -1;
}
- temp_mt_entry->fs_info = fs_info;
-
- /*
- * Set st_ino for the root to 1.
- */
-
- fs_info->instance = imfs_instance++;
- fs_info->ino_count = 1;
- fs_info->link_handlers = link_handlers;
- fs_info->fifo_handlers = fifo_handlers;
- jnode = temp_mt_entry->mt_fs_root->location.node_access;
- jnode->st_ino = fs_info->ino_count;
+ if ( rv == 0 ) {
+ IMFS_determine_bytes_per_block(
+ &imfs_memfile_bytes_per_block,
+ imfs_rq_memfile_bytes_per_block,
+ IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
+ );
+ }
- return 0;
+ return rv;
}
int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
@@ -120,16 +118,7 @@ void IMFS_node_destroy( IMFS_jnode_t *node )
{
IMFS_assert( node->reference_count == 0 );
- switch ( node->type ) {
- case IMFS_MEMORY_FILE:
- IMFS_memfile_remove( node );
- break;
- case IMFS_SYM_LINK:
- free( node->info.sym_link.name );
- break;
- default:
- break;
- }
+ node = (*node->control->node_destroy)( node );
free( node );
}
@@ -144,3 +133,32 @@ void IMFS_node_free( const rtems_filesystem_location_info_t *loc )
--node->reference_count;
}
}
+
+IMFS_jnode_t *IMFS_node_initialize_default(
+ IMFS_jnode_t *node,
+ const IMFS_types_union *info
+)
+{
+ return node;
+}
+
+IMFS_jnode_t *IMFS_node_remove_default(
+ IMFS_jnode_t *node,
+ const IMFS_jnode_t *root_node
+)
+{
+ return node;
+}
+
+IMFS_jnode_t *IMFS_node_destroy_default( IMFS_jnode_t *node )
+{
+ return node;
+}
+
+const IMFS_node_control IMFS_node_control_default = {
+ .imfs_type = IMFS_INVALID_NODE,
+ .handlers = &rtems_filesystem_handlers_default,
+ .node_initialize = IMFS_node_initialize_default,
+ .node_remove = IMFS_node_remove_default,
+ .node_destroy = IMFS_node_destroy_default
+};