* 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().
This commit is contained in:
Sebastian Huber
2010-06-08 08:50:57 +00:00
parent 78f4d6d72e
commit 5b5772ae31
8 changed files with 64 additions and 156 deletions

View File

@@ -82,6 +82,8 @@ int device_close(
(void *) &args
);
IMFS_check_node_remove( the_jnode );
return rtems_deviceio_errno( status );
}

View File

@@ -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 */

View File

@@ -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;
}

View File

@@ -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);

View File

@@ -37,5 +37,5 @@ const rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
IMFS_fdatasync, /* fsync */
IMFS_fdatasync,
IMFS_fcntl,
memfile_rmnod
IMFS_rmnod
};

View File

@@ -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;
}

View File

@@ -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;
}