diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-02-23 17:57:27 +0100 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2012-03-13 12:24:15 +0100 |
commit | 1bdff036acddbbc63aa849741abba6581549f7b6 (patch) | |
tree | 8cc1f06ac93045d8a7c35da41fd926c2d9e840f1 /cpukit/libfs/src/imfs/imfs.h | |
parent | IMFS: Use unprotected chain operations (diff) | |
download | rtems-1bdff036acddbbc63aa849741abba6581549f7b6.tar.bz2 |
IMFS: Reference counting for nodes
The introduction of reference counting of nodes avoids the removal of
open nodes and potential usage of freed memory.
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs.h')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs.h | 45 |
1 files changed, 18 insertions, 27 deletions
diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h index c2d95f0f8e..e9be053c20 100644 --- a/cpukit/libfs/src/imfs/imfs.h +++ b/cpukit/libfs/src/imfs/imfs.h @@ -166,6 +166,7 @@ struct IMFS_jnode_tt { IMFS_jnode_t *Parent; /* Parent node */ char name[IMFS_NAME_MAX+1]; /* "basename" */ mode_t st_mode; /* File mode */ + unsigned short reference_count; nlink_t st_nlink; /* Link count */ ino_t st_ino; /* inode */ @@ -274,6 +275,11 @@ extern void IMFS_dump( void ); */ extern int IMFS_memfile_maximum_size( void ); +extern void IMFS_node_destroy( IMFS_jnode_t *node ); + +extern int IMFS_node_clone( rtems_filesystem_location_info_t *loc ); + +extern void IMFS_node_free( const rtems_filesystem_location_info_t *loc ); extern rtems_filesystem_node_types_t IMFS_node_type( const rtems_filesystem_location_info_t *loc @@ -353,10 +359,6 @@ extern int imfs_dir_open( mode_t mode /* IN */ ); -extern int imfs_dir_close( - rtems_libio_t *iop /* IN */ -); - extern ssize_t imfs_dir_read( rtems_libio_t *iop, /* IN */ void *buffer, /* IN */ @@ -376,10 +378,6 @@ extern int memfile_open( mode_t mode /* IN */ ); -extern int memfile_close( - rtems_libio_t *iop /* IN */ -); - extern ssize_t memfile_read( rtems_libio_t *iop, /* IN */ void *buffer, /* IN */ @@ -476,19 +474,22 @@ extern int IMFS_rename( size_t namelen ); -extern void IMFS_create_orphan( - IMFS_jnode_t *jnode -); - -extern void IMFS_check_node_remove( - IMFS_jnode_t *jnode -); - extern int IMFS_rmnod( const rtems_filesystem_location_info_t *parentloc, const rtems_filesystem_location_info_t *loc ); +/* + * Turn on IMFS assertions when RTEMS_DEBUG is defined. + */ +#ifdef RTEMS_DEBUG + #include <assert.h> + + #define IMFS_assert(_x) assert(_x) +#else + #define IMFS_assert(_x) +#endif + static inline void IMFS_add_to_directory( IMFS_jnode_t *dir, IMFS_jnode_t *node @@ -500,21 +501,11 @@ static inline void IMFS_add_to_directory( static inline void IMFS_remove_from_directory( IMFS_jnode_t *node ) { + IMFS_assert( node->Parent != NULL ); node->Parent = NULL; rtems_chain_extract_unprotected( &node->Node ); } -/* - * Turn on IMFS assertions when RTEMS_DEBUG is defined. - */ -#ifdef RTEMS_DEBUG - #include <assert.h> - - #define IMFS_assert(_x) assert(_x) -#else - #define IMFS_assert(_x) -#endif - #ifdef __cplusplus } #endif |