summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs_handlers_link.c
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-12-31 10:56:05 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-01-27 06:54:22 +0100
commitcf36b70e8dd8755e7dac6eb516169f586e78566d (patch)
tree97200818ec5dfeaa4e137a572fcbb4db746842b1 /cpukit/libfs/src/imfs/imfs_handlers_link.c
parentuser/conf.t: Fix typo (diff)
downloadrtems-cf36b70e8dd8755e7dac6eb516169f586e78566d.tar.bz2
IMFS: Replace node union with individual struct
This reduces the average node size. Add and use IMFS_GENERIC_INITIALIZER().
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_handlers_link.c')
-rw-r--r--cpukit/libfs/src/imfs/imfs_handlers_link.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_handlers_link.c b/cpukit/libfs/src/imfs/imfs_handlers_link.c
index cd71f958b0..25848bea93 100644
--- a/cpukit/libfs/src/imfs/imfs_handlers_link.c
+++ b/cpukit/libfs/src/imfs/imfs_handlers_link.c
@@ -30,14 +30,17 @@ static int IMFS_stat_link(
{
const IMFS_jnode_t *node = loc->node_access;
- if ( IMFS_type( node ) != IMFS_HARD_LINK ) {
- buf->st_size = strlen( node->info.sym_link.name );
+ if ( !IMFS_is_hard_link( node->st_mode ) ) {
+ const IMFS_sym_link_t *sym_link = (const IMFS_sym_link_t *) node;
+
+ buf->st_size = strlen( sym_link->name );
return IMFS_stat( loc, buf );
} else {
+ const IMFS_link_t *hard_link = (const IMFS_link_t *) node;
rtems_filesystem_location_info_t targetloc = *loc;
- targetloc.node_access = node->info.hard_link.link_node;
+ targetloc.node_access = hard_link->link_node;
IMFS_Set_handlers( &targetloc );
return (targetloc.handlers->fstat_h)( &targetloc, buf );
@@ -64,10 +67,12 @@ static const rtems_filesystem_file_handlers_r IMFS_link_handlers = {
static IMFS_jnode_t *IMFS_node_initialize_hard_link(
IMFS_jnode_t *node,
- const IMFS_types_union *info
+ void *arg
)
{
- node->info.hard_link.link_node = info->hard_link.link_node;
+ IMFS_link_t *hard_link = (IMFS_link_t *) node;
+
+ hard_link->link_node = arg;
return node;
}
@@ -76,7 +81,8 @@ static IMFS_jnode_t *IMFS_node_remove_hard_link(
IMFS_jnode_t *node
)
{
- IMFS_jnode_t *target = node->info.hard_link.link_node;
+ IMFS_link_t *hard_link = (IMFS_link_t *) node;
+ IMFS_jnode_t *target = hard_link->link_node;
_Assert( target != NULL );
@@ -94,8 +100,8 @@ static IMFS_jnode_t *IMFS_node_remove_hard_link(
}
const IMFS_node_control IMFS_node_control_hard_link = {
- .imfs_type = IMFS_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
@@ -103,24 +109,28 @@ const IMFS_node_control IMFS_node_control_hard_link = {
static IMFS_jnode_t *IMFS_node_initialize_sym_link(
IMFS_jnode_t *node,
- const IMFS_types_union *info
+ void *arg
)
{
- node->info.sym_link.name = info->sym_link.name;
+ IMFS_sym_link_t *sym_link = (IMFS_sym_link_t *) node;
+
+ sym_link->name = arg;
return node;
}
-static IMFS_jnode_t *IMFS_node_destroy_sym_link( IMFS_jnode_t *node )
+static void IMFS_node_destroy_sym_link( IMFS_jnode_t *node )
{
- free( node->info.sym_link.name );
+ IMFS_sym_link_t *sym_link = (IMFS_sym_link_t *) node;
- return node;
+ free( sym_link->name );
+
+ IMFS_node_destroy_default( node );
}
const IMFS_node_control IMFS_node_control_sym_link = {
- .imfs_type = IMFS_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