From 24ec25d2aee6dde7b572f27694e9a62e34a6603f Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 5 Feb 2015 16:14:59 +0100 Subject: IMFS: Introduce IMFS_mknod_control Drop IMFS_node_control::node_size field and add node_size parameter to IMFS_allocate_node() and IMFS_create_node(). This reduces the size of generic nodes. --- cpukit/libfs/src/imfs/fifoimfs_init.c | 14 ++++++------- cpukit/libfs/src/imfs/imfs.h | 24 +++++++++++++---------- cpukit/libfs/src/imfs/imfs_creat.c | 8 ++++---- cpukit/libfs/src/imfs/imfs_fifo.c | 14 +++++++------ cpukit/libfs/src/imfs/imfs_handlers_device.c | 14 +++++++------ cpukit/libfs/src/imfs/imfs_handlers_directory.c | 14 +++++++------ cpukit/libfs/src/imfs/imfs_handlers_memfile.c | 15 +++++++------- cpukit/libfs/src/imfs/imfs_init.c | 14 ++++++------- cpukit/libfs/src/imfs/imfs_initsupp.c | 26 +++++++++++++------------ cpukit/libfs/src/imfs/imfs_link.c | 2 +- cpukit/libfs/src/imfs/imfs_load_tar.c | 1 + cpukit/libfs/src/imfs/imfs_make_generic_node.c | 1 + cpukit/libfs/src/imfs/imfs_mknod.c | 5 ++++- cpukit/libfs/src/imfs/imfs_symlink.c | 2 +- cpukit/libfs/src/imfs/memfile.c | 2 +- cpukit/libfs/src/imfs/miniimfs_init.c | 14 ++++++------- testsuites/fstests/fsimfsgeneric01/init.c | 2 -- 17 files changed, 94 insertions(+), 78 deletions(-) diff --git a/cpukit/libfs/src/imfs/fifoimfs_init.c b/cpukit/libfs/src/imfs/fifoimfs_init.c index 17f4917a2c..3b87f19fb1 100644 --- a/cpukit/libfs/src/imfs/fifoimfs_init.c +++ b/cpukit/libfs/src/imfs/fifoimfs_init.c @@ -47,12 +47,12 @@ const rtems_filesystem_operations_table fifoIMFS_ops = { .statvfs_h = rtems_filesystem_default_statvfs }; -static const IMFS_node_control *const - IMFS_fifo_node_controls [IMFS_TYPE_COUNT] = { - [IMFS_DIRECTORY] = &IMFS_node_control_directory, - [IMFS_DEVICE] = &IMFS_node_control_device, - [IMFS_MEMORY_FILE] = &IMFS_node_control_memfile, - [IMFS_FIFO] = &IMFS_node_control_fifo +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 }; int fifoIMFS_initialize( @@ -63,6 +63,6 @@ int fifoIMFS_initialize( return IMFS_initialize_support( mt_entry, &fifoIMFS_ops, - IMFS_fifo_node_controls + IMFS_fifo_mknod_controls ); } diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h index f258ae05a7..f69408a443 100644 --- a/cpukit/libfs/src/imfs/imfs.h +++ b/cpukit/libfs/src/imfs/imfs.h @@ -214,12 +214,16 @@ void IMFS_node_destroy_default( IMFS_jnode_t *node ); */ typedef struct { const rtems_filesystem_file_handlers_r *handlers; - size_t node_size; IMFS_node_control_initialize node_initialize; IMFS_node_control_remove node_remove; IMFS_node_control_destroy node_destroy; } IMFS_node_control; +typedef struct { + IMFS_node_control node_control; + size_t node_size; +} IMFS_mknod_control; + /** @} */ /** @@ -371,19 +375,19 @@ static inline void IMFS_mtime_ctime_update( IMFS_jnode_t *jnode ) } typedef struct { - const IMFS_node_control *node_controls [IMFS_TYPE_COUNT]; + const IMFS_mknod_control *mknod_controls[ IMFS_TYPE_COUNT ]; } IMFS_fs_info_t; /* * Shared Data */ -extern const IMFS_node_control IMFS_node_control_directory; -extern const IMFS_node_control IMFS_node_control_device; -extern const IMFS_node_control IMFS_node_control_memfile; +extern const IMFS_mknod_control IMFS_mknod_control_directory; +extern const IMFS_mknod_control IMFS_mknod_control_device; +extern const IMFS_mknod_control IMFS_mknod_control_memfile; extern const IMFS_node_control IMFS_node_control_linfile; -extern const IMFS_node_control IMFS_node_control_fifo; -extern const IMFS_node_control IMFS_node_control_enosys; +extern const IMFS_mknod_control IMFS_mknod_control_fifo; +extern const IMFS_mknod_control IMFS_mknod_control_enosys; extern const rtems_filesystem_operations_table miniIMFS_ops; extern const rtems_filesystem_operations_table IMFS_ops; @@ -416,7 +420,7 @@ extern int miniIMFS_initialize( extern int IMFS_initialize_support( 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] + const IMFS_mknod_control *const mknod_controls[ IMFS_TYPE_COUNT ] ); /** * @brief Unmount this instance of IMFS. @@ -559,8 +563,8 @@ extern int IMFS_mknod( * Routine to create a new in memory file system node. */ extern IMFS_jnode_t *IMFS_allocate_node( - IMFS_fs_info_t *fs_info, const IMFS_node_control *node_control, + size_t node_size, const char *name, size_t namelen, mode_t mode, @@ -576,6 +580,7 @@ extern IMFS_jnode_t *IMFS_allocate_node( extern IMFS_jnode_t *IMFS_create_node( const rtems_filesystem_location_info_t *parentloc, const IMFS_node_control *node_control, + size_t node_size, const char *name, size_t namelen, mode_t mode, @@ -614,7 +619,6 @@ extern bool IMFS_is_imfs_instance( #define IMFS_GENERIC_INITIALIZER( handlers, init, destroy ) \ { \ ( handlers ), \ - sizeof( IMFS_generic_t ), \ ( init ), \ IMFS_node_remove_default, \ ( destroy ) \ diff --git a/cpukit/libfs/src/imfs/imfs_creat.c b/cpukit/libfs/src/imfs/imfs_creat.c index 7d60e66888..c0fc2e1691 100644 --- a/cpukit/libfs/src/imfs/imfs_creat.c +++ b/cpukit/libfs/src/imfs/imfs_creat.c @@ -23,8 +23,8 @@ #include IMFS_jnode_t *IMFS_allocate_node( - IMFS_fs_info_t *fs_info, const IMFS_node_control *node_control, + size_t node_size, const char *name, size_t namelen, mode_t mode, @@ -46,7 +46,7 @@ IMFS_jnode_t *IMFS_allocate_node( /* * Allocate an IMFS jnode */ - node = calloc( 1, node_control->node_size ); + node = calloc( 1, node_size ); if ( !node ) { errno = ENOMEM; @@ -88,16 +88,16 @@ IMFS_jnode_t *IMFS_allocate_node( IMFS_jnode_t *IMFS_create_node( const rtems_filesystem_location_info_t *parentloc, const IMFS_node_control *node_control, + size_t node_size, const char *name, size_t namelen, mode_t mode, void *arg ) { - IMFS_fs_info_t *fs_info = parentloc->mt_entry->fs_info; IMFS_jnode_t *node = IMFS_allocate_node( - fs_info, node_control, + node_size, name, namelen, mode, diff --git a/cpukit/libfs/src/imfs/imfs_fifo.c b/cpukit/libfs/src/imfs/imfs_fifo.c index 36eab8541d..d84429d6fe 100644 --- a/cpukit/libfs/src/imfs/imfs_fifo.c +++ b/cpukit/libfs/src/imfs/imfs_fifo.c @@ -130,10 +130,12 @@ static const rtems_filesystem_file_handlers_r IMFS_fifo_handlers = { .writev_h = rtems_filesystem_default_writev }; -const IMFS_node_control IMFS_node_control_fifo = { - .handlers = &IMFS_fifo_handlers, - .node_size = sizeof(IMFS_fifo_t), - .node_initialize = IMFS_node_initialize_default, - .node_remove = IMFS_node_remove_default, - .node_destroy = IMFS_node_destroy_default +const IMFS_mknod_control IMFS_mknod_control_fifo = { + { + .handlers = &IMFS_fifo_handlers, + .node_initialize = IMFS_node_initialize_default, + .node_remove = IMFS_node_remove_default, + .node_destroy = IMFS_node_destroy_default + }, + .node_size = sizeof( IMFS_fifo_t ) }; diff --git a/cpukit/libfs/src/imfs/imfs_handlers_device.c b/cpukit/libfs/src/imfs/imfs_handlers_device.c index f27511e53f..0a7cb5f722 100644 --- a/cpukit/libfs/src/imfs/imfs_handlers_device.c +++ b/cpukit/libfs/src/imfs/imfs_handlers_device.c @@ -63,10 +63,12 @@ static IMFS_jnode_t *IMFS_node_initialize_device( return node; } -const IMFS_node_control IMFS_node_control_device = { - .handlers = &IMFS_device_handlers, - .node_size = sizeof(IMFS_device_t), - .node_initialize = IMFS_node_initialize_device, - .node_remove = IMFS_node_remove_default, - .node_destroy = IMFS_node_destroy_default +const IMFS_mknod_control IMFS_mknod_control_device = { + { + .handlers = &IMFS_device_handlers, + .node_initialize = IMFS_node_initialize_device, + .node_remove = IMFS_node_remove_default, + .node_destroy = IMFS_node_destroy_default + }, + .node_size = sizeof( IMFS_device_t ) }; diff --git a/cpukit/libfs/src/imfs/imfs_handlers_directory.c b/cpukit/libfs/src/imfs/imfs_handlers_directory.c index 1be399b9ae..bcfe3e7365 100644 --- a/cpukit/libfs/src/imfs/imfs_handlers_directory.c +++ b/cpukit/libfs/src/imfs/imfs_handlers_directory.c @@ -102,10 +102,12 @@ static IMFS_jnode_t *IMFS_node_remove_directory( return &dir->Node; } -const IMFS_node_control IMFS_node_control_directory = { - .handlers = &IMFS_directory_handlers, - .node_size = sizeof(IMFS_directory_t), - .node_initialize = IMFS_node_initialize_directory, - .node_remove = IMFS_node_remove_directory, - .node_destroy = IMFS_node_destroy_default +const IMFS_mknod_control IMFS_mknod_control_directory = { + { + .handlers = &IMFS_directory_handlers, + .node_initialize = IMFS_node_initialize_directory, + .node_remove = IMFS_node_remove_directory, + .node_destroy = IMFS_node_destroy_default + }, + .node_size = sizeof( IMFS_directory_t ) }; diff --git a/cpukit/libfs/src/imfs/imfs_handlers_memfile.c b/cpukit/libfs/src/imfs/imfs_handlers_memfile.c index db682bbbbb..1e5dba2a63 100644 --- a/cpukit/libfs/src/imfs/imfs_handlers_memfile.c +++ b/cpukit/libfs/src/imfs/imfs_handlers_memfile.c @@ -69,17 +69,18 @@ static const rtems_filesystem_file_handlers_r IMFS_linfile_handlers = { .writev_h = rtems_filesystem_default_writev }; -const IMFS_node_control IMFS_node_control_memfile = { - .handlers = &IMFS_memfile_handlers, - .node_size = sizeof(IMFS_file_t), - .node_initialize = IMFS_node_initialize_default, - .node_remove = IMFS_node_remove_default, - .node_destroy = IMFS_memfile_remove +const IMFS_mknod_control IMFS_mknod_control_memfile = { + { + .handlers = &IMFS_memfile_handlers, + .node_initialize = IMFS_node_initialize_default, + .node_remove = IMFS_node_remove_default, + .node_destroy = IMFS_memfile_remove + }, + .node_size = sizeof( IMFS_file_t ) }; const IMFS_node_control IMFS_node_control_linfile = { .handlers = &IMFS_linfile_handlers, - .node_size = sizeof(IMFS_file_t), .node_initialize = IMFS_node_initialize_default, .node_remove = IMFS_node_remove_default, .node_destroy = IMFS_node_destroy_default diff --git a/cpukit/libfs/src/imfs/imfs_init.c b/cpukit/libfs/src/imfs/imfs_init.c index 5e29880a48..854363ccc6 100644 --- a/cpukit/libfs/src/imfs/imfs_init.c +++ b/cpukit/libfs/src/imfs/imfs_init.c @@ -43,12 +43,12 @@ const rtems_filesystem_operations_table IMFS_ops = { .statvfs_h = rtems_filesystem_default_statvfs }; -static const IMFS_node_control *const - IMFS_node_controls [IMFS_TYPE_COUNT] = { - [IMFS_DIRECTORY] = &IMFS_node_control_directory, - [IMFS_DEVICE] = &IMFS_node_control_device, - [IMFS_MEMORY_FILE] = &IMFS_node_control_memfile, - [IMFS_FIFO] = &IMFS_node_control_enosys +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 }; int IMFS_initialize( @@ -59,6 +59,6 @@ int IMFS_initialize( return IMFS_initialize_support( mt_entry, &IMFS_ops, - IMFS_node_controls + IMFS_mknod_controls ); } diff --git a/cpukit/libfs/src/imfs/imfs_initsupp.c b/cpukit/libfs/src/imfs/imfs_initsupp.c index 563d6203c3..9881d84e2c 100644 --- a/cpukit/libfs/src/imfs/imfs_initsupp.c +++ b/cpukit/libfs/src/imfs/imfs_initsupp.c @@ -58,7 +58,7 @@ static int IMFS_determine_bytes_per_block( int IMFS_initialize_support( 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] + const IMFS_mknod_control *const mknod_controls[ IMFS_TYPE_COUNT ] ) { int rv = 0; @@ -68,14 +68,14 @@ int IMFS_initialize_support( IMFS_jnode_t *root_node; memcpy( - fs_info->node_controls, - node_controls, - sizeof( fs_info->node_controls ) + fs_info->mknod_controls, + mknod_controls, + sizeof( fs_info->mknod_controls ) ); root_node = IMFS_allocate_node( - fs_info, - fs_info->node_controls [IMFS_DIRECTORY], + &fs_info->mknod_controls[ IMFS_DIRECTORY ]->node_control, + fs_info->mknod_controls[ IMFS_DIRECTORY ]->node_size, "", 0, (S_IFDIR | 0755), @@ -165,10 +165,12 @@ void IMFS_node_destroy_default( IMFS_jnode_t *node ) free( node ); } -const IMFS_node_control IMFS_node_control_enosys = { - .handlers = &rtems_filesystem_handlers_default, - .node_size = sizeof(IMFS_jnode_t), - .node_initialize = IMFS_node_initialize_enosys, - .node_remove = IMFS_node_remove_default, - .node_destroy = IMFS_node_destroy_default +const IMFS_mknod_control IMFS_mknod_control_enosys = { + { + .handlers = &rtems_filesystem_handlers_default, + .node_initialize = IMFS_node_initialize_enosys, + .node_remove = IMFS_node_remove_default, + .node_destroy = IMFS_node_destroy_default + }, + .node_size = sizeof( IMFS_jnode_t ) }; diff --git a/cpukit/libfs/src/imfs/imfs_link.c b/cpukit/libfs/src/imfs/imfs_link.c index de4701a215..27e04ffae2 100644 --- a/cpukit/libfs/src/imfs/imfs_link.c +++ b/cpukit/libfs/src/imfs/imfs_link.c @@ -46,6 +46,7 @@ int IMFS_link( new_node = IMFS_create_node( parentloc, &IMFS_node_control_hard_link, + sizeof( IMFS_link_t ), name, namelen, IMFS_STAT_FMT_HARD_LINK | ( S_IRWXU | S_IRWXG | S_IRWXO ), @@ -133,7 +134,6 @@ static IMFS_jnode_t *IMFS_node_remove_hard_link( static const IMFS_node_control IMFS_node_control_hard_link = { .handlers = &IMFS_link_handlers, - .node_size = sizeof(IMFS_link_t), .node_initialize = IMFS_node_initialize_hard_link, .node_remove = IMFS_node_remove_hard_link, .node_destroy = IMFS_node_destroy_default diff --git a/cpukit/libfs/src/imfs/imfs_load_tar.c b/cpukit/libfs/src/imfs/imfs_load_tar.c index e6dc499ecf..d303cd29eb 100644 --- a/cpukit/libfs/src/imfs/imfs_load_tar.c +++ b/cpukit/libfs/src/imfs/imfs_load_tar.c @@ -126,6 +126,7 @@ int rtems_tarfs_load( IMFS_create_node( currentloc, &IMFS_node_control_linfile, + sizeof( IMFS_file_t ), rtems_filesystem_eval_path_get_token( &ctx ), rtems_filesystem_eval_path_get_tokenlen( &ctx ), (file_mode & (S_IRWXU | S_IRWXG | S_IRWXO)) | S_IFREG, diff --git a/cpukit/libfs/src/imfs/imfs_make_generic_node.c b/cpukit/libfs/src/imfs/imfs_make_generic_node.c index aeb82b4549..f302dda93f 100644 --- a/cpukit/libfs/src/imfs/imfs_make_generic_node.c +++ b/cpukit/libfs/src/imfs/imfs_make_generic_node.c @@ -85,6 +85,7 @@ int IMFS_make_generic_node( IMFS_jnode_t *new_node = IMFS_create_node( currentloc, node_control, + sizeof( IMFS_generic_t ), rtems_filesystem_eval_path_get_token( &ctx ), rtems_filesystem_eval_path_get_tokenlen( &ctx ), mode, diff --git a/cpukit/libfs/src/imfs/imfs_mknod.c b/cpukit/libfs/src/imfs/imfs_mknod.c index 6ff505cf9a..ed67192481 100644 --- a/cpukit/libfs/src/imfs/imfs_mknod.c +++ b/cpukit/libfs/src/imfs/imfs_mknod.c @@ -47,11 +47,14 @@ 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 ) ]; IMFS_jnode_t *new_node; new_node = IMFS_create_node( parentloc, - fs_info->node_controls[ get_type( mode ) ], + &mknod_control->node_control, + mknod_control->node_size, name, namelen, mode, diff --git a/cpukit/libfs/src/imfs/imfs_symlink.c b/cpukit/libfs/src/imfs/imfs_symlink.c index 3ecff3be3e..2ddf99cc2c 100644 --- a/cpukit/libfs/src/imfs/imfs_symlink.c +++ b/cpukit/libfs/src/imfs/imfs_symlink.c @@ -49,6 +49,7 @@ int IMFS_symlink( new_node = IMFS_create_node( parentloc, &IMFS_node_control_sym_link, + sizeof( IMFS_sym_link_t ), name, namelen, ( S_IFLNK | ( S_IRWXU | S_IRWXG | S_IRWXO )), @@ -133,7 +134,6 @@ static void IMFS_node_destroy_sym_link( IMFS_jnode_t *node ) static const IMFS_node_control IMFS_node_control_sym_link = { .handlers = &IMFS_link_handlers, - .node_size = sizeof(IMFS_sym_link_t), .node_initialize = IMFS_node_initialize_sym_link, .node_remove = IMFS_node_remove_default, .node_destroy = IMFS_node_destroy_sym_link diff --git a/cpukit/libfs/src/imfs/memfile.c b/cpukit/libfs/src/imfs/memfile.c index 563001a728..59da9a6c1b 100644 --- a/cpukit/libfs/src/imfs/memfile.c +++ b/cpukit/libfs/src/imfs/memfile.c @@ -88,7 +88,7 @@ int IMFS_linfile_open( uint32_t count = file->File.size; const unsigned char *buffer = file->Linearfile.direct; - file->Node.control = &IMFS_node_control_memfile; + file->Node.control = &IMFS_mknod_control_memfile.node_control; file->File.size = 0; file->Memfile.indirect = 0; file->Memfile.doubly_indirect = 0; diff --git a/cpukit/libfs/src/imfs/miniimfs_init.c b/cpukit/libfs/src/imfs/miniimfs_init.c index 6097f7291f..87879fcafc 100644 --- a/cpukit/libfs/src/imfs/miniimfs_init.c +++ b/cpukit/libfs/src/imfs/miniimfs_init.c @@ -43,12 +43,12 @@ const rtems_filesystem_operations_table miniIMFS_ops = { .statvfs_h = rtems_filesystem_default_statvfs }; -static const IMFS_node_control *const - IMFS_mini_node_controls [IMFS_TYPE_COUNT] = { - [IMFS_DIRECTORY] = &IMFS_node_control_directory, - [IMFS_DEVICE] = &IMFS_node_control_device, - [IMFS_MEMORY_FILE] = &IMFS_node_control_memfile, - [IMFS_FIFO] = &IMFS_node_control_enosys +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 }; int miniIMFS_initialize( @@ -59,6 +59,6 @@ int miniIMFS_initialize( return IMFS_initialize_support( mt_entry, &miniIMFS_ops, - IMFS_mini_node_controls + IMFS_mini_mknod_controls ); } diff --git a/testsuites/fstests/fsimfsgeneric01/init.c b/testsuites/fstests/fsimfsgeneric01/init.c index 671ad14a48..44d75c5fad 100644 --- a/testsuites/fstests/fsimfsgeneric01/init.c +++ b/testsuites/fstests/fsimfsgeneric01/init.c @@ -298,7 +298,6 @@ static void node_destroy(IMFS_jnode_t *node) static const IMFS_node_control node_control = { .handlers = &node_handlers, - .node_size = sizeof(IMFS_generic_t), .node_initialize = node_initialize, .node_remove = node_remove, .node_destroy = node_destroy @@ -392,7 +391,6 @@ static void node_destroy_inhibited(IMFS_jnode_t *node) static const IMFS_node_control node_initialization_error_control = { .handlers = &node_handlers, - .node_size = sizeof(IMFS_generic_t), .node_initialize = node_initialize_error, .node_remove = node_remove_inhibited, .node_destroy = node_destroy_inhibited -- cgit v1.2.3