forked from Imagelibrary/rtems
Filesystem: Move operations to mount table entry
The scope of the file system operations is the file system instance. The scope of the file system node handlers is the file location. The benefit of moving the operations to the mount table entry is a size reduction of the file location (rtems_filesystem_location_info_t). The code size is slightly increased due to additional load instructions. Restructure rtems_filesystem_mount_table_entry_t to improve cache efficiency.
This commit is contained in:
@@ -92,8 +92,8 @@ static int rtems_tfs_mount_me(
|
|||||||
rtems_set_errno_and_return_minus_one(ENOMEM);
|
rtems_set_errno_and_return_minus_one(ENOMEM);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mt_entry->ops = &rtems_tfs_ops;
|
||||||
mt_entry->mt_fs_root->location.handlers = &rtems_tfs_handlers;
|
mt_entry->mt_fs_root->location.handlers = &rtems_tfs_handlers;
|
||||||
mt_entry->mt_fs_root->location.ops = &rtems_tfs_ops;
|
|
||||||
mt_entry->mt_fs_root->location.node_access = root_path;
|
mt_entry->mt_fs_root->location.node_access = root_path;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ typedef struct rtems_filesystem_location_info_tt {
|
|||||||
void *node_access;
|
void *node_access;
|
||||||
void *node_access_2;
|
void *node_access_2;
|
||||||
const rtems_filesystem_file_handlers_r *handlers;
|
const rtems_filesystem_file_handlers_r *handlers;
|
||||||
const rtems_filesystem_operations_table *ops;
|
|
||||||
rtems_filesystem_mount_table_entry_t *mt_entry;
|
rtems_filesystem_mount_table_entry_t *mt_entry;
|
||||||
} rtems_filesystem_location_info_t;
|
} rtems_filesystem_location_info_t;
|
||||||
|
|
||||||
|
|||||||
@@ -1431,13 +1431,14 @@ extern int rtems_mkdir(const char *path, mode_t mode);
|
|||||||
*/
|
*/
|
||||||
struct rtems_filesystem_mount_table_entry_tt {
|
struct rtems_filesystem_mount_table_entry_tt {
|
||||||
rtems_chain_node mt_node;
|
rtems_chain_node mt_node;
|
||||||
|
void *fs_info;
|
||||||
|
const rtems_filesystem_operations_table *ops;
|
||||||
|
const void *immutable_fs_info;
|
||||||
rtems_chain_control location_chain;
|
rtems_chain_control location_chain;
|
||||||
rtems_filesystem_global_location_t *mt_point_node;
|
rtems_filesystem_global_location_t *mt_point_node;
|
||||||
rtems_filesystem_global_location_t *mt_fs_root;
|
rtems_filesystem_global_location_t *mt_fs_root;
|
||||||
bool mounted;
|
bool mounted;
|
||||||
bool writeable;
|
bool writeable;
|
||||||
void *fs_info;
|
|
||||||
const void *immutable_fs_info;
|
|
||||||
rtems_filesystem_limits_and_options_t pathconf_limits_and_options;
|
rtems_filesystem_limits_and_options_t pathconf_limits_and_options;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -250,14 +250,18 @@ static inline void rtems_filesystem_instance_lock(
|
|||||||
const rtems_filesystem_location_info_t *loc
|
const rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
(*loc->ops->lock_h)( loc->mt_entry );
|
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
|
||||||
|
|
||||||
|
(*mt_entry->ops->lock_h)( mt_entry );
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void rtems_filesystem_instance_unlock(
|
static inline void rtems_filesystem_instance_unlock(
|
||||||
const rtems_filesystem_location_info_t *loc
|
const rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
(*loc->ops->unlock_h)( loc->mt_entry );
|
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
|
||||||
|
|
||||||
|
(*mt_entry->ops->unlock_h)( mt_entry );
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -582,9 +586,11 @@ static inline bool rtems_filesystem_location_is_root(
|
|||||||
const rtems_filesystem_location_info_t *loc
|
const rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return (*loc->ops->are_nodes_equal_h)(
|
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
|
||||||
|
|
||||||
|
return (*mt_entry->ops->are_nodes_equal_h)(
|
||||||
loc,
|
loc,
|
||||||
&loc->mt_entry->mt_fs_root->location
|
&mt_entry->mt_fs_root->location
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -220,6 +220,7 @@ rtems_filesystem_mount_table_entry_t rtems_filesystem_null_mt_entry = {
|
|||||||
.fill = &rtems_filesystem_global_location_null.location.mt_entry_node,
|
.fill = &rtems_filesystem_global_location_null.location.mt_entry_node,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
.ops = &null_ops,
|
||||||
.mt_point_node = &rtems_filesystem_global_location_null,
|
.mt_point_node = &rtems_filesystem_global_location_null,
|
||||||
.mt_fs_root = &rtems_filesystem_global_location_null,
|
.mt_fs_root = &rtems_filesystem_global_location_null,
|
||||||
.mounted = false,
|
.mounted = false,
|
||||||
@@ -233,7 +234,6 @@ rtems_filesystem_global_location_t rtems_filesystem_global_location_null = {
|
|||||||
.previous = &rtems_filesystem_null_mt_entry.location_chain.Head.Node
|
.previous = &rtems_filesystem_null_mt_entry.location_chain.Head.Node
|
||||||
},
|
},
|
||||||
.handlers = &rtems_filesystem_null_handlers,
|
.handlers = &rtems_filesystem_null_handlers,
|
||||||
.ops = &null_ops,
|
|
||||||
.mt_entry = &rtems_filesystem_null_mt_entry
|
.mt_entry = &rtems_filesystem_null_mt_entry
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ int _rename_r(
|
|||||||
new_currentloc
|
new_currentloc
|
||||||
);
|
);
|
||||||
if ( rv == 0 ) {
|
if ( rv == 0 ) {
|
||||||
rv = (*new_currentloc->ops->rename_h)(
|
rv = (*new_currentloc->mt_entry->ops->rename_h)(
|
||||||
&old_parentloc,
|
&old_parentloc,
|
||||||
old_currentloc,
|
old_currentloc,
|
||||||
new_currentloc,
|
new_currentloc,
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ int chmod( const char *path, mode_t mode )
|
|||||||
const rtems_filesystem_location_info_t *currentloc =
|
const rtems_filesystem_location_info_t *currentloc =
|
||||||
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
|
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
|
||||||
|
|
||||||
rv = (*currentloc->ops->fchmod_h)( currentloc, mode );
|
rv = (*currentloc->mt_entry->ops->fchmod_h)( currentloc, mode );
|
||||||
|
|
||||||
rtems_filesystem_eval_path_cleanup( &ctx );
|
rtems_filesystem_eval_path_cleanup( &ctx );
|
||||||
|
|
||||||
|
|||||||
@@ -32,12 +32,9 @@ int rtems_filesystem_chown(
|
|||||||
int eval_flags = eval_follow_link;
|
int eval_flags = eval_follow_link;
|
||||||
const rtems_filesystem_location_info_t *currentloc =
|
const rtems_filesystem_location_info_t *currentloc =
|
||||||
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
|
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
|
||||||
|
const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops;
|
||||||
|
|
||||||
rv = (*currentloc->ops->chown_h)(
|
rv = (*ops->chown_h)( currentloc, owner, group );
|
||||||
currentloc,
|
|
||||||
owner,
|
|
||||||
group
|
|
||||||
);
|
|
||||||
|
|
||||||
rtems_filesystem_eval_path_cleanup( &ctx );
|
rtems_filesystem_eval_path_cleanup( &ctx );
|
||||||
|
|
||||||
|
|||||||
@@ -49,7 +49,9 @@ int chroot( const char *path )
|
|||||||
rtems_filesystem_global_location_t *new_root_loc =
|
rtems_filesystem_global_location_t *new_root_loc =
|
||||||
rtems_filesystem_global_location_obtain( &new_current_loc );
|
rtems_filesystem_global_location_obtain( &new_current_loc );
|
||||||
rtems_filesystem_node_types_t type =
|
rtems_filesystem_node_types_t type =
|
||||||
(*new_root_loc->location.ops->node_type_h)( &new_root_loc->location );
|
(*new_root_loc->location.mt_entry->ops->node_type_h)(
|
||||||
|
&new_root_loc->location
|
||||||
|
);
|
||||||
|
|
||||||
if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
sc = rtems_libio_set_private_env();
|
sc = rtems_libio_set_private_env();
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ void rtems_filesystem_location_clone(
|
|||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
|
||||||
clone = rtems_filesystem_location_copy( clone, master );
|
clone = rtems_filesystem_location_copy( clone, master );
|
||||||
rv = (*clone->ops->clonenod_h)( clone );
|
rv = (*clone->mt_entry->ops->clonenod_h)( clone );
|
||||||
if ( rv != 0 ) {
|
if ( rv != 0 ) {
|
||||||
rtems_filesystem_location_remove_from_mt_entry( clone );
|
rtems_filesystem_location_remove_from_mt_entry( clone );
|
||||||
rtems_filesystem_location_initialize_to_null( clone );
|
rtems_filesystem_location_initialize_to_null( clone );
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ int fchmod( int fd, mode_t mode )
|
|||||||
|
|
||||||
if (iop->pathinfo.mt_entry->writeable) {
|
if (iop->pathinfo.mt_entry->writeable) {
|
||||||
rtems_filesystem_instance_lock( &iop->pathinfo );
|
rtems_filesystem_instance_lock( &iop->pathinfo );
|
||||||
rv = (*iop->pathinfo.ops->fchmod_h)( &iop->pathinfo, mode );
|
rv = (*iop->pathinfo.mt_entry->ops->fchmod_h)( &iop->pathinfo, mode );
|
||||||
rtems_filesystem_instance_unlock( &iop->pathinfo );
|
rtems_filesystem_instance_unlock( &iop->pathinfo );
|
||||||
} else {
|
} else {
|
||||||
errno = EROFS;
|
errno = EROFS;
|
||||||
|
|||||||
@@ -28,7 +28,11 @@ int fchown( int fd, uid_t owner, gid_t group )
|
|||||||
|
|
||||||
if (iop->pathinfo.mt_entry->writeable) {
|
if (iop->pathinfo.mt_entry->writeable) {
|
||||||
rtems_filesystem_instance_lock( &iop->pathinfo );
|
rtems_filesystem_instance_lock( &iop->pathinfo );
|
||||||
rv = (*iop->pathinfo.ops->chown_h)( &iop->pathinfo, owner, group );
|
rv = (*iop->pathinfo.mt_entry->ops->chown_h)(
|
||||||
|
&iop->pathinfo,
|
||||||
|
owner,
|
||||||
|
group
|
||||||
|
);
|
||||||
rtems_filesystem_instance_unlock( &iop->pathinfo );
|
rtems_filesystem_instance_unlock( &iop->pathinfo );
|
||||||
} else {
|
} else {
|
||||||
errno = EROFS;
|
errno = EROFS;
|
||||||
|
|||||||
@@ -21,7 +21,7 @@
|
|||||||
void rtems_filesystem_location_free( rtems_filesystem_location_info_t *loc )
|
void rtems_filesystem_location_free( rtems_filesystem_location_info_t *loc )
|
||||||
{
|
{
|
||||||
rtems_filesystem_instance_lock( loc );
|
rtems_filesystem_instance_lock( loc );
|
||||||
(*loc->ops->freenod_h)( loc );
|
(*loc->mt_entry->ops->freenod_h)( loc );
|
||||||
rtems_filesystem_instance_unlock( loc );
|
rtems_filesystem_instance_unlock( loc );
|
||||||
rtems_filesystem_location_remove_from_mt_entry( loc );
|
rtems_filesystem_location_remove_from_mt_entry( loc );
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ int link( const char *path1, const char *path2 )
|
|||||||
currentloc_2
|
currentloc_2
|
||||||
);
|
);
|
||||||
if ( rv == 0 ) {
|
if ( rv == 0 ) {
|
||||||
rv = (*currentloc_2->ops->link_h)(
|
rv = (*currentloc_2->mt_entry->ops->link_h)(
|
||||||
currentloc_2,
|
currentloc_2,
|
||||||
currentloc_1,
|
currentloc_1,
|
||||||
rtems_filesystem_eval_path_get_token( &ctx_2 ),
|
rtems_filesystem_eval_path_get_token( &ctx_2 ),
|
||||||
|
|||||||
@@ -47,7 +47,9 @@ int rtems_filesystem_mknod(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( rv == 0 ) {
|
if ( rv == 0 ) {
|
||||||
rv = (*parentloc->ops->mknod_h)( parentloc, name, namelen, mode, dev );
|
const rtems_filesystem_operations_table *ops = parentloc->mt_entry->ops;
|
||||||
|
|
||||||
|
rv = (*ops->mknod_h)( parentloc, name, namelen, mode, dev );
|
||||||
}
|
}
|
||||||
|
|
||||||
return rv;
|
return rv;
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ static int register_subordinate_file_system(
|
|||||||
rtems_filesystem_eval_path_extract_currentloc( &ctx, &targetloc );
|
rtems_filesystem_eval_path_extract_currentloc( &ctx, &targetloc );
|
||||||
mt_point_node = rtems_filesystem_location_transform_to_global( &targetloc );
|
mt_point_node = rtems_filesystem_location_transform_to_global( &targetloc );
|
||||||
mt_entry->mt_point_node = mt_point_node;
|
mt_entry->mt_point_node = mt_point_node;
|
||||||
rv = (*mt_point_node->location.ops->mount_h)( mt_entry );
|
rv = (*mt_point_node->location.mt_entry->ops->mount_h)( mt_entry );
|
||||||
if ( rv == 0 ) {
|
if ( rv == 0 ) {
|
||||||
rtems_filesystem_mt_lock();
|
rtems_filesystem_mt_lock();
|
||||||
rtems_chain_append_unprotected(
|
rtems_chain_append_unprotected(
|
||||||
@@ -218,7 +218,7 @@ int mount(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if ( rv != 0 ) {
|
if ( rv != 0 ) {
|
||||||
(*mt_entry->mt_fs_root->location.ops->fsunmount_me_h)( mt_entry );
|
(*mt_entry->ops->fsunmount_me_h)( mt_entry );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -85,7 +85,7 @@ static int do_open(
|
|||||||
const rtems_filesystem_location_info_t *currentloc =
|
const rtems_filesystem_location_info_t *currentloc =
|
||||||
rtems_filesystem_eval_path_get_currentloc( &ctx );
|
rtems_filesystem_eval_path_get_currentloc( &ctx );
|
||||||
rtems_filesystem_node_types_t type =
|
rtems_filesystem_node_types_t type =
|
||||||
(*currentloc->ops->node_type_h)( currentloc );
|
(*currentloc->mt_entry->ops->node_type_h)( currentloc );
|
||||||
|
|
||||||
if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
rtems_filesystem_eval_path_error( &ctx, EISDIR );
|
rtems_filesystem_eval_path_error( &ctx, EISDIR );
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ ssize_t readlink( const char *path, char *buf, size_t bufsize )
|
|||||||
int eval_flags = RTEMS_FS_FOLLOW_HARD_LINK;
|
int eval_flags = RTEMS_FS_FOLLOW_HARD_LINK;
|
||||||
const rtems_filesystem_location_info_t *currentloc =
|
const rtems_filesystem_location_info_t *currentloc =
|
||||||
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
|
rtems_filesystem_eval_path_start( &ctx, path, eval_flags );
|
||||||
rtems_filesystem_node_types_t type =
|
const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops;
|
||||||
(*currentloc->ops->node_type_h)( currentloc );
|
rtems_filesystem_node_types_t type = (*ops->node_type_h)( currentloc );
|
||||||
|
|
||||||
if ( type == RTEMS_FILESYSTEM_SYM_LINK ) {
|
if ( type == RTEMS_FILESYSTEM_SYM_LINK ) {
|
||||||
rv = (*currentloc->ops->readlink_h)( currentloc, buf, bufsize );
|
rv = (*ops->readlink_h)( currentloc, buf, bufsize );
|
||||||
} else {
|
} else {
|
||||||
rtems_filesystem_eval_path_error( &ctx, EINVAL );
|
rtems_filesystem_eval_path_error( &ctx, EINVAL );
|
||||||
rv = -1;
|
rv = -1;
|
||||||
|
|||||||
@@ -34,14 +34,11 @@ int rmdir( const char *path )
|
|||||||
&parentloc,
|
&parentloc,
|
||||||
parent_eval_flags
|
parent_eval_flags
|
||||||
);
|
);
|
||||||
rtems_filesystem_node_types_t type =
|
const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops;
|
||||||
(*currentloc->ops->node_type_h)( currentloc );
|
rtems_filesystem_node_types_t type = (*ops->node_type_h)( currentloc );
|
||||||
|
|
||||||
if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
|
if ( type == RTEMS_FILESYSTEM_DIRECTORY ) {
|
||||||
rv = (*currentloc->ops->rmnod_h)(
|
rv = (*ops->rmnod_h)( &parentloc, currentloc );
|
||||||
&parentloc,
|
|
||||||
currentloc
|
|
||||||
);
|
|
||||||
} else {
|
} else {
|
||||||
rtems_filesystem_eval_path_error( &ctx, ENOTDIR );
|
rtems_filesystem_eval_path_error( &ctx, ENOTDIR );
|
||||||
rv = -1;
|
rv = -1;
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ int statvfs( const char *path, struct statvfs *buf )
|
|||||||
|
|
||||||
memset( buf, 0, sizeof( *buf ) );
|
memset( buf, 0, sizeof( *buf ) );
|
||||||
|
|
||||||
rv = (*currentloc->ops->statvfs_h)( currentloc, buf );
|
rv = (*currentloc->mt_entry->ops->statvfs_h)( currentloc, buf );
|
||||||
|
|
||||||
rtems_filesystem_eval_path_cleanup( &ctx );
|
rtems_filesystem_eval_path_cleanup( &ctx );
|
||||||
|
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ void rtems_filesystem_eval_path_continue(
|
|||||||
int eval_flags;
|
int eval_flags;
|
||||||
|
|
||||||
while (ctx->pathlen > 0) {
|
while (ctx->pathlen > 0) {
|
||||||
(*ctx->currentloc.ops->eval_path_h)(ctx);
|
(*ctx->currentloc.mt_entry->ops->eval_path_h)(ctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
eval_flags = rtems_filesystem_eval_path_get_flags(ctx);
|
eval_flags = rtems_filesystem_eval_path_get_flags(ctx);
|
||||||
@@ -260,7 +260,7 @@ void rtems_filesystem_eval_path_recursive(
|
|||||||
|
|
||||||
++ctx->recursionlevel;
|
++ctx->recursionlevel;
|
||||||
while (ctx->pathlen > 0) {
|
while (ctx->pathlen > 0) {
|
||||||
(*ctx->currentloc.ops->eval_path_h)(ctx);
|
(*ctx->currentloc.mt_entry->ops->eval_path_h)(ctx);
|
||||||
}
|
}
|
||||||
--ctx->recursionlevel;
|
--ctx->recursionlevel;
|
||||||
|
|
||||||
@@ -297,7 +297,7 @@ static void free_location(rtems_filesystem_location_info_t *loc)
|
|||||||
{
|
{
|
||||||
rtems_filesystem_mt_entry_declare_lock_context(lock_context);
|
rtems_filesystem_mt_entry_declare_lock_context(lock_context);
|
||||||
|
|
||||||
(*loc->ops->freenod_h)(loc);
|
(*loc->mt_entry->ops->freenod_h)(loc);
|
||||||
|
|
||||||
rtems_filesystem_mt_entry_lock(lock_context);
|
rtems_filesystem_mt_entry_lock(lock_context);
|
||||||
rtems_chain_extract_unprotected(&loc->mt_entry_node);
|
rtems_chain_extract_unprotected(&loc->mt_entry_node);
|
||||||
|
|||||||
@@ -20,10 +20,11 @@
|
|||||||
|
|
||||||
static bool is_fs_root( const rtems_filesystem_location_info_t *loc )
|
static bool is_fs_root( const rtems_filesystem_location_info_t *loc )
|
||||||
{
|
{
|
||||||
|
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
|
||||||
const rtems_filesystem_location_info_t *mt_fs_root =
|
const rtems_filesystem_location_info_t *mt_fs_root =
|
||||||
&loc->mt_entry->mt_fs_root->location;
|
&mt_entry->mt_fs_root->location;
|
||||||
|
|
||||||
return (*loc->ops->are_nodes_equal_h)( loc, mt_fs_root );
|
return (*mt_entry->ops->are_nodes_equal_h)( loc, mt_fs_root );
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_eval_path_root(
|
static bool is_eval_path_root(
|
||||||
@@ -31,10 +32,11 @@ static bool is_eval_path_root(
|
|||||||
const rtems_filesystem_location_info_t *loc
|
const rtems_filesystem_location_info_t *loc
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
const rtems_filesystem_mount_table_entry_t *mt_entry = loc->mt_entry;
|
||||||
const rtems_filesystem_location_info_t *rootloc = &ctx->rootloc->location;
|
const rtems_filesystem_location_info_t *rootloc = &ctx->rootloc->location;
|
||||||
|
|
||||||
return loc->mt_entry == rootloc->mt_entry
|
return mt_entry == rootloc->mt_entry
|
||||||
&& (*loc->ops->are_nodes_equal_h)( loc, rootloc );
|
&& (*mt_entry->ops->are_nodes_equal_h)( loc, rootloc );
|
||||||
}
|
}
|
||||||
|
|
||||||
void rtems_filesystem_eval_path_generic(
|
void rtems_filesystem_eval_path_generic(
|
||||||
|
|||||||
@@ -33,7 +33,6 @@ rtems_filesystem_location_info_t *rtems_filesystem_location_copy(
|
|||||||
dst->node_access = src->node_access;
|
dst->node_access = src->node_access;
|
||||||
dst->node_access_2 = src->node_access_2;
|
dst->node_access_2 = src->node_access_2;
|
||||||
dst->handlers = src->handlers;
|
dst->handlers = src->handlers;
|
||||||
dst->ops = src->ops;
|
|
||||||
dst->mt_entry = src->mt_entry;
|
dst->mt_entry = src->mt_entry;
|
||||||
rtems_filesystem_location_add_to_mt_entry(dst);
|
rtems_filesystem_location_add_to_mt_entry(dst);
|
||||||
|
|
||||||
@@ -213,6 +212,6 @@ void rtems_filesystem_do_unmount(
|
|||||||
rtems_chain_extract_unprotected(&mt_entry->mt_node);
|
rtems_chain_extract_unprotected(&mt_entry->mt_node);
|
||||||
rtems_filesystem_mt_unlock();
|
rtems_filesystem_mt_unlock();
|
||||||
rtems_filesystem_global_location_release(mt_entry->mt_point_node);
|
rtems_filesystem_global_location_release(mt_entry->mt_point_node);
|
||||||
(*mt_entry->mt_fs_root->location.ops->fsunmount_me_h)(mt_entry);
|
(*mt_entry->ops->fsunmount_me_h)(mt_entry);
|
||||||
free(mt_entry);
|
free(mt_entry);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ rtems_filesystem_node_types_t rtems_filesystem_node_type(
|
|||||||
rtems_filesystem_node_types_t type;
|
rtems_filesystem_node_types_t type;
|
||||||
|
|
||||||
rtems_filesystem_instance_lock(loc);
|
rtems_filesystem_instance_lock(loc);
|
||||||
type = (*loc->ops->node_type_h)(loc);
|
type = (*loc->mt_entry->ops->node_type_h)(loc);
|
||||||
rtems_filesystem_instance_unlock(loc);
|
rtems_filesystem_instance_unlock(loc);
|
||||||
|
|
||||||
return type;
|
return type;
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ int symlink( const char *path1, const char *path2 )
|
|||||||
const rtems_filesystem_location_info_t *currentloc =
|
const rtems_filesystem_location_info_t *currentloc =
|
||||||
rtems_filesystem_eval_path_start( &ctx, path2, eval_flags );
|
rtems_filesystem_eval_path_start( &ctx, path2, eval_flags );
|
||||||
|
|
||||||
rv = (*currentloc->ops->symlink_h)(
|
rv = (*currentloc->mt_entry->ops->symlink_h)(
|
||||||
currentloc,
|
currentloc,
|
||||||
rtems_filesystem_eval_path_get_token( &ctx ),
|
rtems_filesystem_eval_path_get_token( &ctx ),
|
||||||
rtems_filesystem_eval_path_get_tokenlen( &ctx ),
|
rtems_filesystem_eval_path_get_tokenlen( &ctx ),
|
||||||
|
|||||||
@@ -34,11 +34,9 @@ int unlink( const char *path )
|
|||||||
&parentloc,
|
&parentloc,
|
||||||
parent_eval_flags
|
parent_eval_flags
|
||||||
);
|
);
|
||||||
|
const rtems_filesystem_operations_table *ops = currentloc->mt_entry->ops;
|
||||||
|
|
||||||
rv = (*currentloc->ops->rmnod_h)(
|
rv = (*ops->rmnod_h)( &parentloc, currentloc );
|
||||||
&parentloc,
|
|
||||||
currentloc
|
|
||||||
);
|
|
||||||
|
|
||||||
rtems_filesystem_eval_path_cleanup_with_parent( &ctx, &parentloc );
|
rtems_filesystem_eval_path_cleanup_with_parent( &ctx, &parentloc );
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,10 @@ int unmount( const char *path )
|
|||||||
rtems_filesystem_mount_table_entry_t *mt_entry = currentloc->mt_entry;
|
rtems_filesystem_mount_table_entry_t *mt_entry = currentloc->mt_entry;
|
||||||
|
|
||||||
if ( rtems_filesystem_location_is_root( currentloc ) ) {
|
if ( rtems_filesystem_location_is_root( currentloc ) ) {
|
||||||
rv = (*mt_entry->mt_point_node->location.ops->unmount_h)( mt_entry );
|
const rtems_filesystem_operations_table *mt_point_ops =
|
||||||
|
mt_entry->mt_point_node->location.mt_entry->ops;
|
||||||
|
|
||||||
|
rv = (*mt_point_ops->unmount_h)( mt_entry );
|
||||||
if ( rv == 0 ) {
|
if ( rv == 0 ) {
|
||||||
rtems_filesystem_mt_entry_declare_lock_context( lock_context );
|
rtems_filesystem_mt_entry_declare_lock_context( lock_context );
|
||||||
|
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ int utime( const char *path, const struct utimbuf *times )
|
|||||||
times = &now_times;
|
times = &now_times;
|
||||||
}
|
}
|
||||||
|
|
||||||
rv = (*currentloc->ops->utime_h)(
|
rv = (*currentloc->mt_entry->ops->utime_h)(
|
||||||
currentloc,
|
currentloc,
|
||||||
times->actime,
|
times->actime,
|
||||||
times->modtime
|
times->modtime
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ int devFS_initialize(
|
|||||||
int rv = 0;
|
int rv = 0;
|
||||||
|
|
||||||
if (data != NULL) {
|
if (data != NULL) {
|
||||||
|
mt_entry->ops = &devFS_ops;
|
||||||
mt_entry->immutable_fs_info = data;
|
mt_entry->immutable_fs_info = data;
|
||||||
mt_entry->mt_fs_root->location.handlers = &devFS_file_handlers;
|
mt_entry->mt_fs_root->location.handlers = &devFS_file_handlers;
|
||||||
mt_entry->mt_fs_root->location.ops = &devFS_ops;
|
|
||||||
} else {
|
} else {
|
||||||
errno = EINVAL;
|
errno = EINVAL;
|
||||||
rv = -1;
|
rv = -1;
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ void devFS_Show(void)
|
|||||||
{
|
{
|
||||||
rtems_filesystem_location_info_t *rootloc = &rtems_filesystem_root->location;
|
rtems_filesystem_location_info_t *rootloc = &rtems_filesystem_root->location;
|
||||||
|
|
||||||
if (rootloc->ops == &devFS_ops) {
|
if (rootloc->mt_entry->ops == &devFS_ops) {
|
||||||
const devFS_data *data = devFS_get_data(rootloc);
|
const devFS_data *data = devFS_get_data(rootloc);
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
size_t n = data->count;
|
size_t n = data->count;
|
||||||
|
|||||||
@@ -141,7 +141,7 @@ msdos_initialize_support(
|
|||||||
|
|
||||||
temp_mt_entry->mt_fs_root->location.node_access = fat_fd;
|
temp_mt_entry->mt_fs_root->location.node_access = fat_fd;
|
||||||
temp_mt_entry->mt_fs_root->location.handlers = directory_handlers;
|
temp_mt_entry->mt_fs_root->location.handlers = directory_handlers;
|
||||||
temp_mt_entry->mt_fs_root->location.ops = op_table;
|
temp_mt_entry->ops = op_table;
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,9 +79,9 @@ int IMFS_initialize_support(
|
|||||||
);
|
);
|
||||||
if ( root_node != NULL ) {
|
if ( root_node != NULL ) {
|
||||||
mt_entry->fs_info = fs_info;
|
mt_entry->fs_info = fs_info;
|
||||||
|
mt_entry->ops = op_table;
|
||||||
mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
mt_entry->pathconf_limits_and_options = IMFS_LIMITS_AND_OPTIONS;
|
||||||
mt_entry->mt_fs_root->location.node_access = root_node;
|
mt_entry->mt_fs_root->location.node_access = root_node;
|
||||||
mt_entry->mt_fs_root->location.ops = op_table;
|
|
||||||
IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
|
IMFS_Set_handlers( &mt_entry->mt_fs_root->location );
|
||||||
} else {
|
} else {
|
||||||
errno = ENOMEM;
|
errno = ENOMEM;
|
||||||
|
|||||||
@@ -101,7 +101,11 @@ int rtems_tarfs_load(
|
|||||||
&ctx,
|
&ctx,
|
||||||
RTEMS_FS_MAKE | RTEMS_FS_EXCLUSIVE
|
RTEMS_FS_MAKE | RTEMS_FS_EXCLUSIVE
|
||||||
);
|
);
|
||||||
if (rootloc.ops != &IMFS_ops && rootloc.ops != &fifoIMFS_ops) {
|
|
||||||
|
if (
|
||||||
|
rootloc.mt_entry->ops != &IMFS_ops
|
||||||
|
&& rootloc.mt_entry->ops != &fifoIMFS_ops
|
||||||
|
) {
|
||||||
rv = -1;
|
rv = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1753,7 +1753,7 @@ char *path = mt_entry->dev;
|
|||||||
|
|
||||||
rootNode = 0;
|
rootNode = 0;
|
||||||
|
|
||||||
mt_entry->mt_fs_root->location.ops = &nfs_fs_ops;
|
mt_entry->ops = &nfs_fs_ops;
|
||||||
mt_entry->mt_fs_root->location.handlers = &nfs_dir_file_handlers;
|
mt_entry->mt_fs_root->location.handlers = &nfs_dir_file_handlers;
|
||||||
mt_entry->pathconf_limits_and_options = nfs_limits_and_options;
|
mt_entry->pathconf_limits_and_options = nfs_limits_and_options;
|
||||||
|
|
||||||
|
|||||||
@@ -918,11 +918,10 @@ rtems_rfs_rtems_initialise (rtems_filesystem_mount_table_entry_t* mt_entry,
|
|||||||
return rtems_rfs_rtems_error ("initialise: open", rc);
|
return rtems_rfs_rtems_error ("initialise: open", rc);
|
||||||
}
|
}
|
||||||
|
|
||||||
mt_entry->fs_info = fs;
|
mt_entry->fs_info = fs;
|
||||||
|
mt_entry->ops = &rtems_rfs_ops;
|
||||||
mt_entry->mt_fs_root->location.node_access = (void*) RTEMS_RFS_ROOT_INO;
|
mt_entry->mt_fs_root->location.node_access = (void*) RTEMS_RFS_ROOT_INO;
|
||||||
mt_entry->mt_fs_root->location.handlers = &rtems_rfs_rtems_dir_handlers;
|
mt_entry->mt_fs_root->location.handlers = &rtems_rfs_rtems_dir_handlers;
|
||||||
mt_entry->mt_fs_root->location.ops = &rtems_rfs_ops;
|
|
||||||
|
|
||||||
rtems_rfs_rtems_unlock (fs);
|
rtems_rfs_rtems_unlock (fs);
|
||||||
|
|
||||||
|
|||||||
@@ -1194,7 +1194,7 @@ int rtems_ftpfs_initialize(
|
|||||||
|
|
||||||
/* Set handler and oparations table */
|
/* Set handler and oparations table */
|
||||||
e->mt_fs_root->location.handlers = &rtems_ftpfs_root_handlers;
|
e->mt_fs_root->location.handlers = &rtems_ftpfs_root_handlers;
|
||||||
e->mt_fs_root->location.ops = &rtems_ftpfs_ops;
|
e->ops = &rtems_ftpfs_ops;
|
||||||
|
|
||||||
/* We maintain no real file system nodes, so there is no real root */
|
/* We maintain no real file system nodes, so there is no real root */
|
||||||
e->mt_fs_root->location.node_access = NULL;
|
e->mt_fs_root->location.node_access = NULL;
|
||||||
|
|||||||
@@ -205,7 +205,7 @@ int rtems_tftpfs_initialize(
|
|||||||
mt_entry->fs_info = fs;
|
mt_entry->fs_info = fs;
|
||||||
mt_entry->mt_fs_root->location.node_access = root_path;
|
mt_entry->mt_fs_root->location.node_access = root_path;
|
||||||
mt_entry->mt_fs_root->location.handlers = &rtems_tftp_handlers;
|
mt_entry->mt_fs_root->location.handlers = &rtems_tftp_handlers;
|
||||||
mt_entry->mt_fs_root->location.ops = &rtems_tftp_ops;
|
mt_entry->ops = &rtems_tftp_ops;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Now allocate a semaphore for mutual exclusion.
|
* Now allocate a semaphore for mutual exclusion.
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ rtems_bsdnet_makeFdForSocket (void *so)
|
|||||||
iop->data0 = fd;
|
iop->data0 = fd;
|
||||||
iop->data1 = so;
|
iop->data1 = so;
|
||||||
iop->pathinfo.handlers = &socket_handlers;
|
iop->pathinfo.handlers = &socket_handlers;
|
||||||
iop->pathinfo.ops = &rtems_filesystem_operations_default;
|
|
||||||
iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
|
iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
|
||||||
rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
|
rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
|
||||||
return fd;
|
return fd;
|
||||||
|
|||||||
@@ -53,7 +53,6 @@ static void rtems_test_assert_equal_to_null_loc(
|
|||||||
rtems_test_assert(null_loc->location.node_access == local_loc->node_access);
|
rtems_test_assert(null_loc->location.node_access == local_loc->node_access);
|
||||||
rtems_test_assert(null_loc->location.node_access_2 == local_loc->node_access_2);
|
rtems_test_assert(null_loc->location.node_access_2 == local_loc->node_access_2);
|
||||||
rtems_test_assert(null_loc->location.handlers == local_loc->handlers);
|
rtems_test_assert(null_loc->location.handlers == local_loc->handlers);
|
||||||
rtems_test_assert(null_loc->location.ops == local_loc->ops);
|
|
||||||
rtems_test_assert(null_loc->location.mt_entry == local_loc->mt_entry);
|
rtems_test_assert(null_loc->location.mt_entry == local_loc->mt_entry);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user