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.
This commit is contained in:
Sebastian Huber
2015-02-12 20:53:34 +01:00
parent 194eb0074b
commit 24ec25d2ae
17 changed files with 94 additions and 78 deletions
+7 -7
View File
@@ -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
);
}
+14 -10
View File
@@ -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 ) \
+4 -4
View File
@@ -23,8 +23,8 @@
#include <string.h>
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,
+8 -6
View File
@@ -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 )
};
+8 -6
View File
@@ -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 )
};
@@ -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 )
};
@@ -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
+7 -7
View File
@@ -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
);
}
+14 -12
View File
@@ -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 )
};
+1 -1
View File
@@ -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
+1
View File
@@ -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,
@@ -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,
+4 -1
View File
@@ -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,
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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;
+7 -7
View File
@@ -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
);
}
@@ -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