mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2026-09-28 15:53:06 +08:00
IMFS: Allow static initialization of FS info
This commit is contained in:
@@ -25,6 +25,10 @@
|
|||||||
|
|
||||||
#include "imfs.h"
|
#include "imfs.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <rtems/seterr.h>
|
||||||
|
|
||||||
const rtems_filesystem_operations_table fifoIMFS_ops = {
|
const rtems_filesystem_operations_table fifoIMFS_ops = {
|
||||||
.lock_h = rtems_filesystem_default_lock,
|
.lock_h = rtems_filesystem_default_lock,
|
||||||
.unlock_h = rtems_filesystem_default_unlock,
|
.unlock_h = rtems_filesystem_default_unlock,
|
||||||
@@ -47,12 +51,11 @@ const rtems_filesystem_operations_table fifoIMFS_ops = {
|
|||||||
.statvfs_h = rtems_filesystem_default_statvfs
|
.statvfs_h = rtems_filesystem_default_statvfs
|
||||||
};
|
};
|
||||||
|
|
||||||
static const IMFS_mknod_control *const
|
static const IMFS_mknod_controls IMFS_fifo_mknod_controls = {
|
||||||
IMFS_fifo_mknod_controls[IMFS_TYPE_COUNT] = {
|
.directory = &IMFS_mknod_control_directory,
|
||||||
[IMFS_DIRECTORY] = &IMFS_mknod_control_directory,
|
.device = &IMFS_mknod_control_device,
|
||||||
[IMFS_DEVICE] = &IMFS_mknod_control_device,
|
.file = &IMFS_mknod_control_memfile,
|
||||||
[IMFS_MEMORY_FILE] = &IMFS_mknod_control_memfile,
|
.fifo = &IMFS_mknod_control_fifo
|
||||||
[IMFS_FIFO] = &IMFS_mknod_control_fifo
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int fifoIMFS_initialize(
|
int fifoIMFS_initialize(
|
||||||
@@ -60,9 +63,16 @@ int fifoIMFS_initialize(
|
|||||||
const void *data
|
const void *data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return IMFS_initialize_support(
|
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
|
||||||
mt_entry,
|
IMFS_mount_data mount_data = {
|
||||||
&fifoIMFS_ops,
|
.fs_info = fs_info,
|
||||||
IMFS_fifo_mknod_controls
|
.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 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -94,18 +94,6 @@ typedef block_p *block_ptr;
|
|||||||
#define IMFS_MEMFILE_MAXIMUM_SIZE \
|
#define IMFS_MEMFILE_MAXIMUM_SIZE \
|
||||||
(LAST_TRIPLY_INDIRECT * IMFS_MEMFILE_BYTES_PER_BLOCK)
|
(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;
|
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 {
|
typedef struct {
|
||||||
IMFS_directory_t Root_directory;
|
IMFS_directory_t Root_directory;
|
||||||
const IMFS_mknod_control *mknod_controls[ IMFS_TYPE_COUNT ];
|
const IMFS_mknod_controls *mknod_controls;
|
||||||
} IMFS_fs_info_t;
|
} 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
|
* Shared Data
|
||||||
*/
|
*/
|
||||||
@@ -415,14 +416,11 @@ extern int miniIMFS_initialize(
|
|||||||
const void *data
|
const void *data
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief IMFS initialization support.
|
|
||||||
*/
|
|
||||||
extern int IMFS_initialize_support(
|
extern int IMFS_initialize_support(
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry,
|
rtems_filesystem_mount_table_entry_t *mt_entry,
|
||||||
const rtems_filesystem_operations_table *op_table,
|
const void *data
|
||||||
const IMFS_mknod_control *const mknod_controls[ IMFS_TYPE_COUNT ]
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Unmount this instance of IMFS.
|
* @brief Unmount this instance of IMFS.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -21,6 +21,10 @@
|
|||||||
|
|
||||||
#include "imfs.h"
|
#include "imfs.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <rtems/seterr.h>
|
||||||
|
|
||||||
const rtems_filesystem_operations_table IMFS_ops = {
|
const rtems_filesystem_operations_table IMFS_ops = {
|
||||||
.lock_h = rtems_filesystem_default_lock,
|
.lock_h = rtems_filesystem_default_lock,
|
||||||
.unlock_h = rtems_filesystem_default_unlock,
|
.unlock_h = rtems_filesystem_default_unlock,
|
||||||
@@ -43,12 +47,11 @@ const rtems_filesystem_operations_table IMFS_ops = {
|
|||||||
.statvfs_h = rtems_filesystem_default_statvfs
|
.statvfs_h = rtems_filesystem_default_statvfs
|
||||||
};
|
};
|
||||||
|
|
||||||
static const IMFS_mknod_control *const
|
static const IMFS_mknod_controls IMFS_default_mknod_controls = {
|
||||||
IMFS_mknod_controls[ IMFS_TYPE_COUNT ] = {
|
.directory = &IMFS_mknod_control_directory,
|
||||||
[IMFS_DIRECTORY] = &IMFS_mknod_control_directory,
|
.device = &IMFS_mknod_control_device,
|
||||||
[IMFS_DEVICE] = &IMFS_mknod_control_device,
|
.file = &IMFS_mknod_control_memfile,
|
||||||
[IMFS_MEMORY_FILE] = &IMFS_mknod_control_memfile,
|
.fifo = &IMFS_mknod_control_enosys
|
||||||
[IMFS_FIFO] = &IMFS_mknod_control_enosys
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int IMFS_initialize(
|
int IMFS_initialize(
|
||||||
@@ -56,9 +59,16 @@ int IMFS_initialize(
|
|||||||
const void *data
|
const void *data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return IMFS_initialize_support(
|
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
|
||||||
mt_entry,
|
IMFS_mount_data mount_data = {
|
||||||
&IMFS_ops,
|
.fs_info = fs_info,
|
||||||
IMFS_mknod_controls
|
.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 );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,51 +104,38 @@ IMFS_jnode_t *IMFS_initialize_node(
|
|||||||
|
|
||||||
int IMFS_initialize_support(
|
int IMFS_initialize_support(
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry,
|
rtems_filesystem_mount_table_entry_t *mt_entry,
|
||||||
const rtems_filesystem_operations_table *op_table,
|
const void *data
|
||||||
const IMFS_mknod_control *const mknod_controls[ IMFS_TYPE_COUNT ]
|
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
int rv = 0;
|
const IMFS_mount_data *mount_data = data;
|
||||||
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
|
IMFS_fs_info_t *fs_info = mount_data->fs_info;
|
||||||
|
IMFS_jnode_t *root_node;
|
||||||
|
|
||||||
if ( fs_info != NULL ) {
|
fs_info->mknod_controls = mount_data->mknod_controls;
|
||||||
IMFS_jnode_t *root_node;
|
|
||||||
|
|
||||||
memcpy(
|
root_node = IMFS_initialize_node(
|
||||||
fs_info->mknod_controls,
|
&fs_info->Root_directory.Node,
|
||||||
mknod_controls,
|
&fs_info->mknod_controls->directory->node_control,
|
||||||
sizeof( fs_info->mknod_controls )
|
"",
|
||||||
);
|
0,
|
||||||
|
(S_IFDIR | 0755),
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
IMFS_assert( root_node != NULL );
|
||||||
|
|
||||||
root_node = IMFS_initialize_node(
|
mt_entry->fs_info = fs_info;
|
||||||
&fs_info->Root_directory.Node,
|
mt_entry->ops = mount_data->ops;
|
||||||
&fs_info->mknod_controls[ IMFS_DIRECTORY ]->node_control,
|
mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
|
||||||
"",
|
mt_entry->mt_fs_root->location.node_access = root_node;
|
||||||
0,
|
IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
|
||||||
(S_IFDIR | 0755),
|
|
||||||
NULL
|
|
||||||
);
|
|
||||||
IMFS_assert( root_node != NULL );
|
|
||||||
|
|
||||||
mt_entry->fs_info = fs_info;
|
IMFS_determine_bytes_per_block(
|
||||||
mt_entry->ops = op_table;
|
&imfs_memfile_bytes_per_block,
|
||||||
mt_entry->pathconf_limits_and_options = &IMFS_LIMITS_AND_OPTIONS;
|
imfs_rq_memfile_bytes_per_block,
|
||||||
mt_entry->mt_fs_root->location.node_access = root_node;
|
IMFS_MEMFILE_DEFAULT_BYTES_PER_BLOCK
|
||||||
IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
|
);
|
||||||
} else {
|
|
||||||
errno = ENOMEM;
|
|
||||||
rv = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( rv == 0 ) {
|
return 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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
|
int IMFS_node_clone( rtems_filesystem_location_info_t *loc )
|
||||||
|
|||||||
@@ -23,17 +23,20 @@
|
|||||||
|
|
||||||
#include "imfs.h"
|
#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 ) ) {
|
if ( S_ISDIR( mode ) ) {
|
||||||
return IMFS_DIRECTORY;
|
return controls->directory;
|
||||||
} else if ( S_ISBLK( mode ) || S_ISCHR( mode ) ) {
|
} else if ( S_ISBLK( mode ) || S_ISCHR( mode ) ) {
|
||||||
return IMFS_DEVICE;
|
return controls->device;
|
||||||
} else if (S_ISFIFO( mode )) {
|
} else if ( S_ISFIFO( mode ) ) {
|
||||||
return IMFS_FIFO;
|
return controls->fifo;
|
||||||
} else {
|
} else {
|
||||||
IMFS_assert( S_ISREG( mode ) );
|
IMFS_assert( S_ISREG( mode ) );
|
||||||
return IMFS_MEMORY_FILE;
|
return controls->file;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -48,7 +51,7 @@ int IMFS_mknod(
|
|||||||
int rv = 0;
|
int rv = 0;
|
||||||
const IMFS_fs_info_t *fs_info = parentloc->mt_entry->fs_info;
|
const IMFS_fs_info_t *fs_info = parentloc->mt_entry->fs_info;
|
||||||
const IMFS_mknod_control *mknod_control =
|
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;
|
IMFS_jnode_t *new_node;
|
||||||
|
|
||||||
new_node = IMFS_create_node(
|
new_node = IMFS_create_node(
|
||||||
|
|||||||
@@ -21,6 +21,10 @@
|
|||||||
|
|
||||||
#include "imfs.h"
|
#include "imfs.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <rtems/seterr.h>
|
||||||
|
|
||||||
const rtems_filesystem_operations_table miniIMFS_ops = {
|
const rtems_filesystem_operations_table miniIMFS_ops = {
|
||||||
.lock_h = rtems_filesystem_default_lock,
|
.lock_h = rtems_filesystem_default_lock,
|
||||||
.unlock_h = rtems_filesystem_default_unlock,
|
.unlock_h = rtems_filesystem_default_unlock,
|
||||||
@@ -43,12 +47,11 @@ const rtems_filesystem_operations_table miniIMFS_ops = {
|
|||||||
.statvfs_h = rtems_filesystem_default_statvfs
|
.statvfs_h = rtems_filesystem_default_statvfs
|
||||||
};
|
};
|
||||||
|
|
||||||
static const IMFS_mknod_control *const
|
static const IMFS_mknod_controls IMFS_mini_mknod_controls = {
|
||||||
IMFS_mini_mknod_controls[ IMFS_TYPE_COUNT ] = {
|
.directory = &IMFS_mknod_control_directory,
|
||||||
[IMFS_DIRECTORY] = &IMFS_mknod_control_directory,
|
.device = &IMFS_mknod_control_device,
|
||||||
[IMFS_DEVICE] = &IMFS_mknod_control_device,
|
.file = &IMFS_mknod_control_memfile,
|
||||||
[IMFS_MEMORY_FILE] = &IMFS_mknod_control_memfile,
|
.fifo = &IMFS_mknod_control_enosys
|
||||||
[IMFS_FIFO] = &IMFS_mknod_control_enosys
|
|
||||||
};
|
};
|
||||||
|
|
||||||
int miniIMFS_initialize(
|
int miniIMFS_initialize(
|
||||||
@@ -56,9 +59,16 @@ int miniIMFS_initialize(
|
|||||||
const void *data
|
const void *data
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return IMFS_initialize_support(
|
IMFS_fs_info_t *fs_info = calloc( 1, sizeof( *fs_info ) );
|
||||||
mt_entry,
|
IMFS_mount_data mount_data = {
|
||||||
&miniIMFS_ops,
|
.fs_info = fs_info,
|
||||||
IMFS_mini_mknod_controls
|
.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 );
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user