diff options
Diffstat (limited to 'cpukit/libfs/src/imfs/imfs_unmount.c')
-rw-r--r-- | cpukit/libfs/src/imfs/imfs_unmount.c | 63 |
1 files changed, 21 insertions, 42 deletions
diff --git a/cpukit/libfs/src/imfs/imfs_unmount.c b/cpukit/libfs/src/imfs/imfs_unmount.c index ee1482bfa5..47acec9320 100644 --- a/cpukit/libfs/src/imfs/imfs_unmount.c +++ b/cpukit/libfs/src/imfs/imfs_unmount.c @@ -1,17 +1,12 @@ /* * IMFS_unmount * - * This routine will look at a mount table entry that we are going to - * add to the mount table. If the mount point - * rtems_filesystem_location_info_t struct refers to a node that is a - * directory that has a file system mounted on it, the node will be - * marked as a mount point by * setting its directory.mt_fs pointer - * to NULL. This indicates that a directory is no longer mounted on - * this node. - * * COPYRIGHT (c) 1989-1999. * On-Line Applications Research Corporation (OAR). * + * Modifications to support reference counting in the file system are + * Copyright (c) 2012 embedded brains GmbH. + * * The license and distribution terms for this file may be * found in the file LICENSE in this distribution or at * http://www.rtems.com/license/LICENSE. @@ -20,43 +15,27 @@ */ #if HAVE_CONFIG_H -#include "config.h" + #include "config.h" #endif -#include <errno.h> - #include "imfs.h" -#include <rtems/libio_.h> -#include <rtems/seterr.h> -int IMFS_unmount( - rtems_filesystem_mount_table_entry_t *mt_entry -) +int IMFS_unmount( rtems_filesystem_mount_table_entry_t *mt_entry ) { - IMFS_jnode_t *node; - - node = mt_entry->mt_point_node.node_access; - - /* - * Is the node that we are mounting onto a directory node ? - */ - - if ( node->type != IMFS_DIRECTORY ) - rtems_set_errno_and_return_minus_one( ENOTDIR ); - - /* - * Did the node indicate that there was a directory mounted here? - */ - - if ( node->info.directory.mt_fs == NULL ) - rtems_set_errno_and_return_minus_one( EINVAL ); /* XXX */ - - /* - * Set the mt_fs pointer to indicate that there is no longer - * a file system mounted to this point. - */ - - node->info.directory.mt_fs = NULL; - - return 0; + int rv = 0; + IMFS_jnode_t *node = mt_entry->mt_point_node->location.node_access; + + if ( node->type == IMFS_DIRECTORY ) { + if ( node->info.directory.mt_fs == mt_entry ) { + node->info.directory.mt_fs = NULL; + } else { + errno = EINVAL; + rv = -1; + } + } else { + errno = ENOTDIR; + rv = -1; + } + + return rv; } |