[rtems commit] IMFS: Use unprotected chain operations
Sebastian Huber
sebh at rtems.org
Tue Mar 13 11:31:31 UTC 2012
Module: rtems
Branch: master
Commit: 2e0ce55bf04861e9f80bf51621286b9a1a2c5af1
Changeset: http://git.rtems.org/rtems/commit/?id=2e0ce55bf04861e9f80bf51621286b9a1a2c5af1
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Tue Feb 21 17:24:10 2012 +0100
IMFS: Use unprotected chain operations
Directory entry add or removal operations are protected by the file
system instance lock. There is no need for protected chain operations.
---
cpukit/libfs/src/imfs/imfs.h | 15 +++++++++++++++
cpukit/libfs/src/imfs/imfs_creat.c | 17 ++++++++++-------
cpukit/libfs/src/imfs/imfs_rename.c | 10 ++--------
cpukit/libfs/src/imfs/imfs_rmnod.c | 3 +--
4 files changed, 28 insertions(+), 17 deletions(-)
diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h
index 8d68c07..c2d95f0 100644
--- a/cpukit/libfs/src/imfs/imfs.h
+++ b/cpukit/libfs/src/imfs/imfs.h
@@ -489,6 +489,21 @@ extern int IMFS_rmnod(
const rtems_filesystem_location_info_t *loc
);
+static inline void IMFS_add_to_directory(
+ IMFS_jnode_t *dir,
+ IMFS_jnode_t *node
+)
+{
+ node->Parent = dir;
+ rtems_chain_append_unprotected( &dir->info.directory.Entries, &node->Node );
+}
+
+static inline void IMFS_remove_from_directory( IMFS_jnode_t *node )
+{
+ node->Parent = NULL;
+ rtems_chain_extract_unprotected( &node->Node );
+}
+
/*
* Turn on IMFS assertions when RTEMS_DEBUG is defined.
*/
diff --git a/cpukit/libfs/src/imfs/imfs_creat.c b/cpukit/libfs/src/imfs/imfs_creat.c
index 4c030a2..caf82be 100644
--- a/cpukit/libfs/src/imfs/imfs_creat.c
+++ b/cpukit/libfs/src/imfs/imfs_creat.c
@@ -22,6 +22,11 @@
#include <stdlib.h>
#include <string.h>
+static void IMFS_initialize_directory( IMFS_jnode_t *dir )
+{
+ rtems_chain_initialize_empty( &dir->info.directory.Entries );
+}
+
/*
* Create an IMFS filesystem node of an arbitrary type that is NOT
* the root directory node.
@@ -39,8 +44,6 @@ IMFS_jnode_t *IMFS_create_node(
IMFS_jnode_t *parent;
IMFS_fs_info_t *fs_info;
- IMFS_assert( parent_loc != NULL );
-
parent = parent_loc->node_access;
fs_info = parent_loc->mt_entry->fs_info;
@@ -55,7 +58,7 @@ IMFS_jnode_t *IMFS_create_node(
* Set the type specific information
*/
if ( type == IMFS_DIRECTORY ) {
- rtems_chain_initialize_empty(&node->info.directory.Entries);
+ IMFS_initialize_directory( node );
} else if ( type == IMFS_HARD_LINK ) {
node->info.hard_link.link_node = info->hard_link.link_node;
} else if ( type == IMFS_SYM_LINK ) {
@@ -80,10 +83,10 @@ IMFS_jnode_t *IMFS_create_node(
/*
* This node MUST have a parent, so put it in that directory list.
*/
- node->Parent = parent;
- node->st_ino = ++fs_info->ino_count;
+ IMFS_assert( parent != NULL );
+ IMFS_add_to_directory( parent, node );
- rtems_chain_append( &parent->info.directory.Entries, &node->Node );
+ node->st_ino = ++fs_info->ino_count;
return node;
}
@@ -165,7 +168,7 @@ IMFS_jnode_t *IMFS_create_root_node(void)
*
* NOTE: Root node is always a directory.
*/
- rtems_chain_initialize_empty(&node->info.directory.Entries);
+ IMFS_initialize_directory( node );
return node;
}
diff --git a/cpukit/libfs/src/imfs/imfs_rename.c b/cpukit/libfs/src/imfs/imfs_rename.c
index 855d026..57d1957 100644
--- a/cpukit/libfs/src/imfs/imfs_rename.c
+++ b/cpukit/libfs/src/imfs/imfs_rename.c
@@ -42,14 +42,8 @@ int IMFS_rename(
memcpy( node->name, name, namelen );
node->name [namelen] = '\0';
- rtems_chain_extract( &node->Node );
-
- node->Parent = new_parent;
- rtems_chain_append(
- &new_parent->info.directory.Entries,
- &node->Node
- );
-
+ IMFS_remove_from_directory( node );
+ IMFS_add_to_directory( new_parent, node );
IMFS_update_ctime( node );
} else {
errno = ENAMETOOLONG;
diff --git a/cpukit/libfs/src/imfs/imfs_rmnod.c b/cpukit/libfs/src/imfs/imfs_rmnod.c
index c500419..ae4d8fb 100644
--- a/cpukit/libfs/src/imfs/imfs_rmnod.c
+++ b/cpukit/libfs/src/imfs/imfs_rmnod.c
@@ -28,8 +28,7 @@
void IMFS_create_orphan( IMFS_jnode_t *jnode )
{
if ( jnode->Parent != NULL ) {
- rtems_chain_extract( &jnode->Node );
- jnode->Parent = NULL;
+ IMFS_remove_from_directory( jnode );
}
--jnode->st_nlink;
More information about the vc
mailing list