mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-24 11:54:32 +08:00
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:
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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 ) \
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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 )
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
);
|
||||
}
|
||||
|
||||
@@ -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 )
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user