diff --git a/cpukit/ChangeLog b/cpukit/ChangeLog index 54b7c57594..6e71d617a0 100644 --- a/cpukit/ChangeLog +++ b/cpukit/ChangeLog @@ -1,3 +1,14 @@ +2010-06-08 Sebastian Huber + + * 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 * libfs/src/devfs/devclose.c, libfs/src/devfs/devopen.c, 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,6 +26,39 @@ #include "imfs.h" +void IMFS_create_orphan( IMFS_jnode_t *jnode ) +{ + if ( jnode->Parent != NULL ) { + rtems_chain_extract( &jnode->Node ); + jnode->Parent = NULL; + } + + --jnode->st_nlink; + + IMFS_update_ctime( jnode ); +} + +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; + + 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; + } + + free( jnode ); + } +} + /* * IMFS_rmnod */ @@ -35,50 +68,10 @@ int IMFS_rmnod( rtems_filesystem_location_info_t *pathloc /* IN */ ) { - IMFS_jnode_t *the_jnode; + IMFS_jnode_t *jnode = (IMFS_jnode_t *) pathloc->node_access; - 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 ); - - /* - * 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 rtems_filesystem_current this node? - */ - - if ( rtems_filesystem_current.node_access == pathloc->node_access ) - rtems_filesystem_current.node_access = NULL; - - /* - * Free memory associated with a memory file. - */ - - 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; -}