forked from Imagelibrary/rtems
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().
This commit is contained in:
@@ -82,6 +82,8 @@ int device_close(
|
||||
(void *) &args
|
||||
);
|
||||
|
||||
IMFS_check_node_remove( the_jnode );
|
||||
|
||||
return rtems_deviceio_errno( status );
|
||||
}
|
||||
|
||||
|
||||
@@ -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 */
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -37,5 +37,5 @@ const rtems_filesystem_file_handlers_r IMFS_memfile_handlers = {
|
||||
IMFS_fdatasync, /* fsync */
|
||||
IMFS_fdatasync,
|
||||
IMFS_fcntl,
|
||||
memfile_rmnod
|
||||
IMFS_rmnod
|
||||
};
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user