summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/imfs/imfs.h
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2012-02-23 17:57:27 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2012-03-13 12:24:15 +0100
commit1bdff036acddbbc63aa849741abba6581549f7b6 (patch)
tree8cc1f06ac93045d8a7c35da41fd926c2d9e840f1 /cpukit/libfs/src/imfs/imfs.h
parentIMFS: Use unprotected chain operations (diff)
downloadrtems-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.h45
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