diff options
author | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-05 21:10:54 +0000 |
---|---|---|
committer | Joel Sherrill <joel.sherrill@OARcorp.com> | 1999-11-05 21:10:54 +0000 |
commit | 94b357c2b31be20b51784dc6f2ae837d58777cbd (patch) | |
tree | 73e3ec3694451a65df6b0688e3e0e04175ea0528 /cpukit/libfs/src/imfs/imfs_rmnod.c | |
parent | 6c85bdda73e6e9676a1f7b329d826a02640dfeb8 (diff) |
Unmount was failing as a side-effect of splitting the rmnod handler
and not handling every case properly.
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_rmnod.c')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_rmnod.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_rmnod.c b/cpukit/libfs/src/imfs/imfs_rmnod.c new file mode 100644 index 0000000000..4707722e86 --- /dev/null +++ b/cpukit/libfs/src/imfs/imfs_rmnod.c @@ -0,0 +1,77 @@ +/* + * IMFS Node Removal Handler + * + * This file contains the handler used to remove a node when a file type + * does not require special actions. + * + * COPYRIGHT (c) 1989-1998. + * On-Line Applications Research Corporation (OAR). + * Copyright assigned to U.S. Government, 1994. + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.OARcorp.com/rtems/license.html. + * + * $Id$ + */ + +#include <rtems.h> +#include <rtems/libio.h> +#include "libio_.h" + +#include "imfs.h" + +/* + * IMFS_rmnod + */ + +int IMFS_rmnod( + 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 ) { + Chain_Extract( (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 ); + } + + return 0; + +} + + + |