IMFS: Allow static initialization of FS info

This commit is contained in:
Sebastian Huber
2015-02-08 16:09:27 +01:00
parent 11026956c6
commit a2f5c7e1a7
6 changed files with 114 additions and 96 deletions

View File

@@ -25,6 +25,10 @@
#include "imfs.h"
#include <stdlib.h>
#include <rtems/seterr.h>
const rtems_filesystem_operations_table fifoIMFS_ops = {
.lock_h = rtems_filesystem_default_lock,
.unlock_h = rtems_filesystem_default_unlock,
@@ -47,12 +51,11 @@ const rtems_filesystem_operations_table fifoIMFS_ops = {
.statvfs_h = rtems_filesystem_default_statvfs
};
static const IMFS_mknod_control *const
IMFS_fifo_mknod_controls[IMFS_TYPE_COUNT] = {
[IMFS_DIRECTORY] = &IMFS_mknod_control_directory,
[IMFS_DEVICE] = &IMFS_mknod_control_device,
[IMFS_MEMORY_FILE] = &IMFS_mknod_control_memfile,
[IMFS_FIFO] = &IMFS_mknod_control_fifo
static const IMFS_mknod_controls IMFS_fifo_mknod_controls = {
.directory = &IMFS_mknod_control_directory,
.device = &IMFS_mknod_control_device,
.file = &IMFS_mknod_control_memfile,
.fifo = &IMFS_mknod_control_fifo
};
int fifoIMFS_initialize(
@@ -60,9 +63,16 @@ int fifoIMFS_initialize(
const void *data
)
{
return IMFS_initialize_support(
mt_entry,
&fifoIMFS_ops,
IMFS_fifo_mknod_controls
);
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
IMFS_mount_data mount_data = {
.fs_info = fs_info,
.ops = &fifoIMFS_ops,
.mknod_controls = &IMFS_fifo_mknod_controls
};
if ( fs_info == NULL ) {
rtems_set_errno_and_return_minus_one( ENOMEM );
}
return IMFS_initialize_support( mt_entry, &mount_data );
}

View File

@@ -94,18 +94,6 @@ typedef block_p *block_ptr;
#define IMFS_MEMFILE_MAXIMUM_SIZE \
(LAST_TRIPLY_INDIRECT * IMFS_MEMFILE_BYTES_PER_BLOCK)
/*
* What types of IMFS file systems entities there can be.
*/
typedef enum {
IMFS_DIRECTORY,
IMFS_DEVICE,
IMFS_MEMORY_FILE,
IMFS_FIFO
} IMFS_jnode_types_t;
#define IMFS_TYPE_COUNT (IMFS_FIFO + 1)
/** @} */
/**
@@ -374,11 +362,24 @@ static inline void IMFS_mtime_ctime_update( IMFS_jnode_t *jnode )
jnode->stat_ctime = now.tv_sec;
}
typedef struct {
const IMFS_mknod_control *directory;
const IMFS_mknod_control *device;
const IMFS_mknod_control *file;
const IMFS_mknod_control *fifo;
} IMFS_mknod_controls;
typedef struct {
IMFS_directory_t Root_directory;
const IMFS_mknod_control *mknod_controls[ IMFS_TYPE_COUNT ];
const IMFS_mknod_controls *mknod_controls;
} IMFS_fs_info_t;
typedef struct {
IMFS_fs_info_t *fs_info;
const rtems_filesystem_operations_table *ops;
const IMFS_mknod_controls *mknod_controls;
} IMFS_mount_data;
/*
* Shared Data
*/
@@ -415,14 +416,11 @@ extern int miniIMFS_initialize(
const void *data
);
/**
* @brief IMFS initialization support.
*/
extern int IMFS_initialize_support(
rtems_filesystem_mount_table_entry_t *mt_entry,
const rtems_filesystem_operations_table *op_table,
const IMFS_mknod_control *const mknod_controls[ IMFS_TYPE_COUNT ]
const void *data
);
/**
* @brief Unmount this instance of IMFS.
*/

View File

@@ -21,6 +21,10 @@
#include "imfs.h"
#include <stdlib.h>
#include <rtems/seterr.h>
const rtems_filesystem_operations_table IMFS_ops = {
.lock_h = rtems_filesystem_default_lock,
.unlock_h = rtems_filesystem_default_unlock,
@@ -43,12 +47,11 @@ const rtems_filesystem_operations_table IMFS_ops = {
.statvfs_h = rtems_filesystem_default_statvfs
};
static const IMFS_mknod_control *const
IMFS_mknod_controls[ IMFS_TYPE_COUNT ] = {
[IMFS_DIRECTORY] = &IMFS_mknod_control_directory,
[IMFS_DEVICE] = &IMFS_mknod_control_device,
[IMFS_MEMORY_FILE] = &IMFS_mknod_control_memfile,
[IMFS_FIFO] = &IMFS_mknod_control_enosys
static const IMFS_mknod_controls IMFS_default_mknod_controls = {
.directory = &IMFS_mknod_control_directory,
.device = &IMFS_mknod_control_device,
.file = &IMFS_mknod_control_memfile,
.fifo = &IMFS_mknod_control_enosys
};
int IMFS_initialize(
@@ -56,9 +59,16 @@ int IMFS_initialize(
const void *data
)
{
return IMFS_initialize_support(
mt_entry,
&IMFS_ops,
IMFS_mknod_controls
);
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
IMFS_mount_data mount_data = {
.fs_info = fs_info,
.ops = &IMFS_ops,
.mknod_controls = &IMFS_default_mknod_controls
};
if ( fs_info == NULL ) {
rtems_set_errno_and_return_minus_one( ENOMEM );
}
return IMFS_initialize_support( mt_entry, &mount_data );
}

View File

@@ -104,51 +104,38 @@ IMFS_jnode_t *IMFS_initialize_node(
int IMFS_initialize_support(
rtems_filesystem_mount_table_entry_t *mt_entry,
const rtems_filesystem_operations_table *op_table,
const IMFS_mknod_control *const mknod_controls[ IMFS_TYPE_COUNT ]
const void *data
)
{
int rv = 0;
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
const IMFS_mount_data *mount_data = data;
IMFS_fs_info_t *fs_info = mount_data->fs_info;
IMFS_jnode_t *root_node;
if ( fs_info != NULL ) {
IMFS_jnode_t *root_node;
fs_info->mknod_controls = mount_data->mknod_controls;
memcpy(
fs_info->mknod_controls,
mknod_controls,
sizeof( fs_info->mknod_controls )
);
root_node = IMFS_initialize_node(
&fs_info->Root_directory.Node,
&fs_info->mknod_controls->directory->node_control,
"",
0,
(S_IFDIR | 0755),
NULL
);
IMFS_assert( root_node != NULL );
root_node = IMFS_initialize_node(
&fs_info->Root_directory.Node,
&fs_info->mknod_controls[ IMFS_DIRECTORY ]->node_control,
"",
0,
(S_IFDIR | 0755),
NULL
);
IMFS_assert( root_node != NULL );
mt_entry->fs_info = fs_info;
mt_entry->ops = mount_data->ops;
mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
mt_entry->mt_fs_root->location.node_access = root_node;
IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
mt_entry->fs_info = fs_info;
mt_entry->ops = op_table;
mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
mt_entry->mt_fs_root->location.node_access = root_node;
IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
} else {
errno = ENOMEM;
rv = -1;
}
IMFS_determine_bytes_per_block(
&imfs_memfile_bytes_per_block,
imfs_rq_memfile_bytes_per_block,
IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
);
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 rv;
return 0;
}
int IMFS_node_clone( rtems_filesystem_location_info_t *loc )

View File

@@ -23,17 +23,20 @@
#include "imfs.h"
static IMFS_jnode_types_t get_type( mode_t mode )
static const IMFS_mknod_control *get_control(
const IMFS_mknod_controls *controls,
mode_t mode
)
{
if ( S_ISDIR( mode ) ) {
return IMFS_DIRECTORY;
return controls->directory;
} else if ( S_ISBLK( mode ) || S_ISCHR( mode ) ) {
return IMFS_DEVICE;
} else if (S_ISFIFO( mode )) {
return IMFS_FIFO;
return controls->device;
} else if ( S_ISFIFO( mode ) ) {
return controls->fifo;
} else {
IMFS_assert( S_ISREG( mode ) );
return IMFS_MEMORY_FILE;
return controls->file;
}
}
@@ -48,7 +51,7 @@ int IMFS_mknod(
int rv = 0;
const IMFS_fs_info_t *fs_info = parentloc->mt_entry->fs_info;
const IMFS_mknod_control *mknod_control =
fs_info->mknod_controls[ get_type( mode ) ];
get_control( fs_info->mknod_controls, mode );
IMFS_jnode_t *new_node;
new_node = IMFS_create_node(

View File

@@ -21,6 +21,10 @@
#include "imfs.h"
#include <stdlib.h>
#include <rtems/seterr.h>
const rtems_filesystem_operations_table miniIMFS_ops = {
.lock_h = rtems_filesystem_default_lock,
.unlock_h = rtems_filesystem_default_unlock,
@@ -43,12 +47,11 @@ const rtems_filesystem_operations_table miniIMFS_ops = {
.statvfs_h = rtems_filesystem_default_statvfs
};
static const IMFS_mknod_control *const
IMFS_mini_mknod_controls[ IMFS_TYPE_COUNT ] = {
[IMFS_DIRECTORY] = &IMFS_mknod_control_directory,
[IMFS_DEVICE] = &IMFS_mknod_control_device,
[IMFS_MEMORY_FILE] = &IMFS_mknod_control_memfile,
[IMFS_FIFO] = &IMFS_mknod_control_enosys
static const IMFS_mknod_controls IMFS_mini_mknod_controls = {
.directory = &IMFS_mknod_control_directory,
.device = &IMFS_mknod_control_device,
.file = &IMFS_mknod_control_memfile,
.fifo = &IMFS_mknod_control_enosys
};
int miniIMFS_initialize(
@@ -56,9 +59,16 @@ int miniIMFS_initialize(
const void *data
)
{
return IMFS_initialize_support(
mt_entry,
&miniIMFS_ops,
IMFS_mini_mknod_controls
);
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
IMFS_mount_data mount_data = {
.fs_info = fs_info,
.ops = &miniIMFS_ops,
.mknod_controls = &IMFS_mini_mknod_controls
};
if ( fs_info == NULL ) {
rtems_set_errno_and_return_minus_one( ENOMEM );
}
return IMFS_initialize_support( mt_entry, &mount_data );
}