diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-06-08 08:50:57 +0000 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2010-06-08 08:50:57 +0000 |
commit | 5b5772ae313eb2dd8d211749bc2eb3fea63758f8 (patch) | |
tree | 62867f14a4e833d616c32f6fea463b1fcf61dcd3 /cpukit | |
parent | 2010-06-08 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff) | |
download | rtems-5b5772ae313eb2dd8d211749bc2eb3fea63758f8.tar.bz2 |
2010-06-08 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libfs/src/imfs/imfs.h, libfs/src/imfs/imfs_rmnod.c: Added and use
IMFS_create_orphan() and IMFS_check_node_remove().
* libfs/src/imfs/deviceio.c, libfs/src/imfs/imfs_directory.c,
libfs/src/imfs/imfs_fifo.c: Use IMFS_create_orphan() and
IMFS_check_node_remove().
* libfs/src/imfs/imfs_handlers_memfile.c, libfs/src/imfs/memfile.c:
Use IMFS_rmnod() and IMFS_check_node_remove() instead of
memfile_rmnod() and memfile_check_rmnod().
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/ChangeLog | 11 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/deviceio.c | 2 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs.h | 13 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_directory.c | 38 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_fifo.c | 6 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_handlers_memfile.c | 2 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_rmnod.c | 79 | ||||
-rw-r--r-- | cpukit/libfs/src/imfs/memfile.c | 69 |
8 files changed, 64 insertions, 156 deletions
diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index 54b7c57594..6e71d617a0 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,5 +1,16 @@ 2010-06-08 Sebastian Huber <sebastian.huber@embedded-brains.de> + * libfs/src/imfs/imfs.h, libfs/src/imfs/imfs_rmnod.c: Added and use + IMFS_create_orphan() and IMFS_check_node_remove(). + * libfs/src/imfs/deviceio.c, libfs/src/imfs/imfs_directory.c, + libfs/src/imfs/imfs_fifo.c: Use IMFS_create_orphan() and + IMFS_check_node_remove(). + * libfs/src/imfs/imfs_handlers_memfile.c, libfs/src/imfs/memfile.c: + Use IMFS_rmnod() and IMFS_check_node_remove() instead of + memfile_rmnod() and memfile_check_rmnod(). + +2010-06-08 Sebastian Huber <sebastian.huber@embedded-brains.de> + * libfs/src/devfs/devclose.c, libfs/src/devfs/devopen.c, libfs/src/imfs/deviceerrno.c, libfs/src/imfs/deviceio.c, libfs/src/rfs/rtems-rfs-rtems-dev.c: Changed rtems_deviceio_errno() to diff --git a/cpukit/libfs/src/imfs/deviceio.c b/cpukit/libfs/src/imfs/deviceio.c index 61d138ae59..289df648db 100644 --- a/cpukit/libfs/src/imfs/deviceio.c +++ b/cpukit/libfs/src/imfs/deviceio.c @@ -82,6 +82,8 @@ int device_close( (void *) &args ); + IMFS_check_node_remove( the_jnode ); + return rtems_deviceio_errno( status ); } diff --git a/cpukit/libfs/src/imfs/imfs.h b/cpukit/libfs/src/imfs/imfs.h index 33d41e9988..b68c795fd3 100644 --- a/cpukit/libfs/src/imfs/imfs.h +++ b/cpukit/libfs/src/imfs/imfs.h @@ -470,11 +470,6 @@ extern rtems_off64_t memfile_lseek( int whence /* IN */ ); -extern int memfile_rmnod( - rtems_filesystem_location_info_t *parent_pathloc, /* IN */ - rtems_filesystem_location_info_t *pathloc /* IN */ -); - extern int device_open( rtems_libio_t *iop, /* IN */ const char *pathname, /* IN */ @@ -554,6 +549,14 @@ extern int IMFS_fcntl( rtems_libio_t *iop ); +extern void IMFS_create_orphan( + IMFS_jnode_t *jnode +); + +extern void IMFS_check_node_remove( + IMFS_jnode_t *jnode +); + extern int IMFS_rmnod( rtems_filesystem_location_info_t *parent_pathloc, /* IN */ rtems_filesystem_location_info_t *pathloc /* IN */ diff --git a/cpukit/libfs/src/imfs/imfs_directory.c b/cpukit/libfs/src/imfs/imfs_directory.c index 71a6d4be41..daab68f1de 100644 --- a/cpukit/libfs/src/imfs/imfs_directory.c +++ b/cpukit/libfs/src/imfs/imfs_directory.c @@ -311,42 +311,8 @@ int imfs_dir_rmnod( if ( the_jnode->info.directory.mt_fs != NULL ) rtems_set_errno_and_return_minus_one( EBUSY ); - /* - * Take the node out of the parent's chain that contains this node - */ - - if ( the_jnode->Parent != NULL ) { - rtems_chain_extract( (rtems_chain_node *) the_jnode ); - the_jnode->Parent = NULL; - } - - /* - * Decrement the link counter and see if we can free the space. - */ - - the_jnode->st_nlink--; - IMFS_update_ctime( the_jnode ); - - /* - * The file cannot be open and the link must be less than 1 to free. - */ - - if ( !rtems_libio_is_file_open( the_jnode ) && (the_jnode->st_nlink < 1) ) { - - /* - * Is the rtems_filesystem_current is this node? - */ - - if ( rtems_filesystem_current.node_access == pathloc->node_access ) - rtems_filesystem_current.node_access = NULL; - - /* - * Free memory associated with a memory file. - */ - - free( the_jnode ); - } + IMFS_create_orphan( the_jnode ); + IMFS_check_node_remove( the_jnode ); return 0; - } diff --git a/cpukit/libfs/src/imfs/imfs_fifo.c b/cpukit/libfs/src/imfs/imfs_fifo.c index f02cfd31c6..4563ff840a 100644 --- a/cpukit/libfs/src/imfs/imfs_fifo.c +++ b/cpukit/libfs/src/imfs/imfs_fifo.c @@ -53,11 +53,9 @@ int IMFS_fifo_close( int err = pipe_release(&JNODE2PIPE(jnode), iop); - if (! err) { + if (err == 0) { iop->flags &= ~LIBIO_FLAGS_OPEN; - /* Free jnode if file is already unlinked and no one opens it */ - if (! rtems_libio_is_file_open(jnode) && jnode->st_nlink < 1) - free(jnode); + IMFS_check_node_remove(jnode); } IMFS_FIFO_RETURN(err); diff --git a/cpukit/libfs/src/imfs/imfs_handlers_memfile.c b/cpukit/libfs/src/imfs/imfs_handlers_memfile.c index 3b765f0149..37c74fd49e 100644 --- a/cpukit/libfs/src/imfs/imfs_handlers_memfile.c +++ b/cpukit/libfs/src/imfs/imfs_handlers_memfile.c @@ -37,5 +37,5 @@ const rtems_filesystem_file_handlers_r IMFS_memfile_handlers = { IMFS_fdatasync, /* fsync */ IMFS_fdatasync, IMFS_fcntl, - memfile_rmnod + IMFS_rmnod }; diff --git a/cpukit/libfs/src/imfs/imfs_rmnod.c b/cpukit/libfs/src/imfs/imfs_rmnod.c index ed6001a691..25c7cde084 100644 --- a/cpukit/libfs/src/imfs/imfs_rmnod.c +++ b/cpukit/libfs/src/imfs/imfs_rmnod.c @@ -26,59 +26,52 @@ #include "imfs.h" -/* - * IMFS_rmnod - */ - -int IMFS_rmnod( - rtems_filesystem_location_info_t *parent_pathloc, /* IN */ - rtems_filesystem_location_info_t *pathloc /* IN */ -) +void IMFS_create_orphan( IMFS_jnode_t *jnode ) { - IMFS_jnode_t *the_jnode; - - the_jnode = (IMFS_jnode_t *) pathloc->node_access; - - /* - * Take the node out of the parent's chain that contains this node - */ - - if ( the_jnode->Parent != NULL ) { - rtems_chain_extract( (rtems_chain_node *) the_jnode ); - the_jnode->Parent = NULL; + if ( jnode->Parent != NULL ) { + rtems_chain_extract( &jnode->Node ); + jnode->Parent = NULL; } - /* - * Decrement the link counter and see if we can free the space. - */ + --jnode->st_nlink; - the_jnode->st_nlink--; - IMFS_update_ctime( the_jnode ); + IMFS_update_ctime( jnode ); +} - /* - * The file cannot be open and the link must be less than 1 to free. - */ +void IMFS_check_node_remove( IMFS_jnode_t *jnode ) +{ + if ( !rtems_libio_is_file_open( jnode ) && jnode->st_nlink < 1 ) { + if ( rtems_filesystem_current.node_access == jnode ) + rtems_filesystem_current.node_access = NULL; - if ( !rtems_libio_is_file_open( the_jnode ) && (the_jnode->st_nlink < 1) ) { + switch ( jnode->type ) { + case IMFS_MEMORY_FILE: + IMFS_memfile_remove( jnode ); + break; + case IMFS_SYM_LINK: + free( jnode->info.sym_link.name ); + break; + default: + break; + } - /* - * Is rtems_filesystem_current this node? - */ + free( jnode ); + } +} - if ( rtems_filesystem_current.node_access == pathloc->node_access ) - rtems_filesystem_current.node_access = NULL; +/* + * IMFS_rmnod + */ - /* - * Free memory associated with a memory file. - */ +int IMFS_rmnod( + rtems_filesystem_location_info_t *parent_pathloc, /* IN */ + rtems_filesystem_location_info_t *pathloc /* IN */ +) +{ + IMFS_jnode_t *jnode = (IMFS_jnode_t *) pathloc->node_access; - if ( the_jnode->type == IMFS_SYM_LINK ) { - if ( the_jnode->info.sym_link.name ) - free( (void*) the_jnode->info.sym_link.name ); - } - free( the_jnode ); - } + IMFS_create_orphan( jnode ); + IMFS_check_node_remove( jnode ); return 0; - } diff --git a/cpukit/libfs/src/imfs/memfile.c b/cpukit/libfs/src/imfs/memfile.c index e0429b3e92..19a767dca6 100644 --- a/cpukit/libfs/src/imfs/memfile.c +++ b/cpukit/libfs/src/imfs/memfile.c @@ -73,8 +73,6 @@ ssize_t IMFS_memfile_write( /* cannot be static as used in imfs_fchmod.c */ unsigned int length ); -int memfile_check_rmnod( IMFS_jnode_t *the_jnode ); - void *memfile_alloc_block(void); void memfile_free_block( @@ -141,7 +139,8 @@ int memfile_close( if (iop->flags & LIBIO_FLAGS_APPEND) iop->offset = the_jnode->info.file.size; - memfile_check_rmnod( the_jnode ); + IMFS_check_node_remove( the_jnode ); + return 0; } @@ -1097,67 +1096,3 @@ fflush(stdout); free(memory); memfile_blocks_allocated--; } - - -/* - * memfile_rmnod - * - * This routine is available from the optable to remove a node - * from the IMFS file system. - */ - -int memfile_rmnod( - rtems_filesystem_location_info_t *parent_pathloc, /* IN */ - rtems_filesystem_location_info_t *pathloc /* IN */ -) -{ - IMFS_jnode_t *the_jnode; - - the_jnode = (IMFS_jnode_t *) pathloc->node_access; - - /* - * Take the node out of the parent's chain that contains this node - */ - - if ( the_jnode->Parent != NULL ) { - rtems_chain_extract( (rtems_chain_node *) the_jnode ); - the_jnode->Parent = NULL; - } - - /* - * Decrement the link counter and see if we can free the space. - */ - - the_jnode->st_nlink--; - IMFS_update_ctime( the_jnode ); - - return memfile_check_rmnod( the_jnode ); -} - - -int memfile_check_rmnod( IMFS_jnode_t *the_jnode ){ - - /* - * The file cannot be open and the link must be less than 1 to free. - */ - - if ( !rtems_libio_is_file_open( the_jnode ) && (the_jnode->st_nlink < 1) ) { - - /* - * Is the rtems_filesystem_current is this node? - */ - - if ( rtems_filesystem_current.node_access == the_jnode ) - rtems_filesystem_current.node_access = NULL; - - /* - * Free memory associated with a memory file. - */ - if (the_jnode->type != IMFS_LINEAR_FILE) - IMFS_memfile_remove( the_jnode ); - - free( the_jnode ); - } - - return 0; -} |