summaryrefslogtreecommitdiffstats
path: root/cpukit/libcsupport
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2010-07-01 15:18:06 +0000
committerSebastian Huber <sebastian.huber@embedded-brains.de>2010-07-01 15:18:06 +0000
commit955a34b566dbd7076084dff82ec5468b9c6d8336 (patch)
tree1395933adfd0fcbeb17d6cbd0e9ce69afd72d242 /cpukit/libcsupport
parent2010-06-29 Sebastian Huber <sebastian.huber@embedded-brains.de> (diff)
downloadrtems-955a34b566dbd7076084dff82ec5468b9c6d8336.tar.bz2
2010-07-01 Sebastian Huber <sebastian.huber@embedded-brains.de>
* libcsupport/include/rtems/libio_.h: Removed rtems_filesystem_mount_table_control. * libcsupport/include/rtems/libio.h, libcsupport/src/mount-mgr.c, libcsupport/src/mount.c libcsupport/src/statvfs.c, libcsupport/src/unmount.c, libmisc/shell/main_mount.c: Documentation. Removed rtems_filesystem_mounts_first() and rtems_filesystem_mounts_next(). Added rtems_filesystem_mount_iterate(). Changed return type of rtems_filesystem_iterate(). Removed rtems_filesystem_nodes_equal(). 2010-07-01 Sebastian Huber <sebastian.huber@embedded-brains.de> * libfs/src/nfsclient/src/nfs.c, libfs/src/nfsclient/src/nfs.c, libfs/src/nfsclient/src/librtemsNfs.h: Renamed rtems_nfsfs_initialize() in rtems_nfs_initialize(). * sapi/include/confdefs.h: Reflect changes above. Renamed *_miniIMFS in *_MINIIMFS. Renamed *_NFSFS in *_NFS.
Diffstat (limited to 'cpukit/libcsupport')
-rw-r--r--cpukit/libcsupport/include/rtems/libio.h389
-rw-r--r--cpukit/libcsupport/include/rtems/libio_.h5
-rw-r--r--cpukit/libcsupport/src/mount-mgr.c37
-rw-r--r--cpukit/libcsupport/src/mount.c90
-rw-r--r--cpukit/libcsupport/src/statvfs.c5
-rw-r--r--cpukit/libcsupport/src/unmount.c57
6 files changed, 300 insertions, 283 deletions
diff --git a/cpukit/libcsupport/include/rtems/libio.h b/cpukit/libcsupport/include/rtems/libio.h
index d705228c4b..7db9524ef7 100644
--- a/cpukit/libcsupport/include/rtems/libio.h
+++ b/cpukit/libcsupport/include/rtems/libio.h
@@ -314,46 +314,6 @@ struct _rtems_filesystem_operations_table {
};
/**
- * @brief File system table entry.
- */
-typedef struct rtems_filesystem_table_t {
- const char *type;
- rtems_filesystem_fsmount_me_t mount_h;
-} rtems_filesystem_table_t;
-
-/**
- * @brief Static table of file systems.
- *
- * Externally defined by confdefs.h or the user.
- */
-extern const rtems_filesystem_table_t rtems_filesystem_table [];
-
-/**
- * @brief Per file system table entry routine type.
- *
- * @see rtems_filesystem_iterate().
- *
- * @retval true Continue the iteration.
- * @retval false Stop the iteration.
- */
-typedef bool (*rtems_per_filesystem_routine)(
- const rtems_filesystem_table_t *entry,
- void *arg
-);
-
-/**
- * @brief Iterates over the file system table.
- *
- * For each file system table entry the @a routine will be called with the
- * table entry and the @a routine_arg parameter.
- */
-void
-rtems_filesystem_iterate(
- rtems_per_filesystem_routine routine,
- void *routine_arg
-);
-
-/**
* @brief Gets the mount handler for the file system @a type.
*
* @return The file system mount handler associated with the @a type, or
@@ -364,35 +324,6 @@ rtems_filesystem_get_mount_handler(
const char *type
);
-/*
- * Get the first entry in the mount table.
- */
-rtems_filesystem_mount_table_entry_t*
-rtems_filesystem_mounts_first( void );
-
-/*
- * Get the next entry in the mount table.
- */
-rtems_filesystem_mount_table_entry_t*
-rtems_filesystem_mounts_next( rtems_filesystem_mount_table_entry_t *entry );
-
-/*
- * Register a file system.
- */
-int
-rtems_filesystem_register(
- const char *type,
- rtems_filesystem_fsmount_me_t mount_h
-);
-
-/*
- * Unregister a file system.
- */
-int
-rtems_filesystem_unregister(
- const char *type
-);
-
/**
* @brief Contain file system specific information which is required to support
* fpathconf().
@@ -420,67 +351,6 @@ typedef struct {
extern const rtems_filesystem_limits_and_options_t rtems_filesystem_default_pathconf;
/**
- * @brief Mount table entry.
- */
-struct rtems_filesystem_mount_table_entry_tt {
- rtems_chain_node Node;
- rtems_filesystem_location_info_t mt_point_node;
- rtems_filesystem_location_info_t mt_fs_root;
- int options;
- void *fs_info;
-
- rtems_filesystem_limits_and_options_t pathconf_limits_and_options;
-
- /*
- * The target or mount point of the file system.
- */
- const char *target;
-
- /*
- * The type of filesystem or the name of the filesystem.
- */
- const char *type;
-
- /*
- * When someone adds a mounted filesystem on a real device,
- * this will need to be used.
- *
- * The lower layers can manage how this is managed. Leave as a
- * string.
- */
- char *dev;
-};
-
-/**
- * @brief The pathconf setting for a file system.
- */
-#define rtems_filesystem_pathconf(_mte) ((_mte)->pathconf_limits_and_options)
-
-/**
- * @brief The type of file system. Its name.
- */
-#define rtems_filesystem_type(_mte) ((_mte)->type)
-
-/**
- * @brief The mount point of a file system.
- */
-#define rtems_filesystem_mount_point(_mte) ((_mte)->target)
-
-/**
- * @brief The device entry of a file system.
- */
-#define rtems_filesystem_mount_device(_mte) ((_mte)->dev)
-
-/**
- * @brief File systems options.
- */
-typedef enum {
- RTEMS_FILESYSTEM_READ_ONLY,
- RTEMS_FILESYSTEM_READ_WRITE,
- RTEMS_FILESYSTEM_BAD_OPTIONS
-} rtems_filesystem_options_t;
-
-/**
* @brief An open file data structure.
*
* It will be indexed by 'fd'.
@@ -669,6 +539,46 @@ static inline rtems_device_minor_number rtems_filesystem_dev_minor_t(
#define rtems_libio_is_valid_perms( _perm ) \
(~ ((~RTEMS_LIBIO_PERMS_RWX) & _perm ))
+/*
+ * Prototypes for filesystem
+ */
+
+void rtems_filesystem_initialize( void );
+
+typedef void (*rtems_libio_init_functions_t)(void);
+extern rtems_libio_init_functions_t rtems_libio_init_helper;
+
+void open_dev_console(void);
+
+typedef void (*rtems_libio_supp_functions_t)(void);
+extern rtems_libio_supp_functions_t rtems_libio_supp_helper;
+
+typedef void (*rtems_fs_init_functions_t)(void);
+extern rtems_fs_init_functions_t rtems_fs_init_helper;
+
+/**
+ * @brief Creates a directory and all its parent directories according to
+ * @a path.
+ *
+ * The @a mode value selects the access permissions of the directory.
+ *
+ * @retval 0 Successful operation.
+ * @retval -1 An error occured. The @c errno indicates the error.
+ */
+extern int rtems_mkdir(const char *path, mode_t mode);
+
+/** @} */
+
+/**
+ * @defgroup FileSystemTypesAndMount File System Types and Mount
+ *
+ * @ingroup LibIO
+ *
+ * @brief File system types and mount.
+ *
+ * @{
+ */
+
/**
* @name File System Types
*
@@ -686,16 +596,132 @@ static inline rtems_device_minor_number rtems_filesystem_dev_minor_t(
/** @} */
-/*
- * Prototypes for filesystem
+/**
+ * @brief Mount table entry.
*/
+struct rtems_filesystem_mount_table_entry_tt {
+ rtems_chain_node Node;
+ rtems_filesystem_location_info_t mt_point_node;
+ rtems_filesystem_location_info_t mt_fs_root;
+ int options;
+ void *fs_info;
-void rtems_filesystem_initialize( void );
+ rtems_filesystem_limits_and_options_t pathconf_limits_and_options;
+
+ /*
+ * The target or mount point of the file system.
+ */
+ const char *target;
+
+ /*
+ * The type of filesystem or the name of the filesystem.
+ */
+ const char *type;
+
+ /*
+ * When someone adds a mounted filesystem on a real device,
+ * this will need to be used.
+ *
+ * The lower layers can manage how this is managed. Leave as a
+ * string.
+ */
+ char *dev;
+};
+/**
+ * @brief File system options.
+ */
+typedef enum {
+ RTEMS_FILESYSTEM_READ_ONLY,
+ RTEMS_FILESYSTEM_READ_WRITE,
+ RTEMS_FILESYSTEM_BAD_OPTIONS
+} rtems_filesystem_options_t;
+
+/**
+ * @brief File system table entry.
+ */
+typedef struct rtems_filesystem_table_t {
+ const char *type;
+ rtems_filesystem_fsmount_me_t mount_h;
+} rtems_filesystem_table_t;
+
+/**
+ * @brief Static table of file systems.
+ *
+ * Externally defined by confdefs.h or the user.
+ */
+extern const rtems_filesystem_table_t rtems_filesystem_table [];
+
+/**
+ * @brief Registers a file system @a type.
+ *
+ * The @a mount_h handler will be used to mount a file system of this @a type.
+ *
+ * @retval 0 Successful operation.
+ * @retval -1 An error occured. The @c errno indicates the error.
+ */
+int rtems_filesystem_register(
+ const char *type,
+ rtems_filesystem_fsmount_me_t mount_h
+);
+
+/**
+ * @brief Unregisters a file system @a type.
+ *
+ * @retval 0 Successful operation.
+ * @retval -1 An error occured. The @c errno indicates the error.
+ */
+int rtems_filesystem_unregister(
+ const char *type
+);
+
+/**
+ * @brief Unmounts the file system at @a mount_path.
+ *
+ * @todo Due to file system implementation shortcomings it is possible to
+ * unmount file systems in use. This likely leads to heap corruption. Unmount
+ * only file systems which are not in use by the application.
+ *
+ * @retval 0 Successful operation.
+ * @retval -1 An error occured. The @c errno indicates the error.
+ */
int unmount(
const char *mount_path
);
+/**
+ * @brief Mounts a file system at @a target.
+ *
+ * The @a source may be a path to the corresponding device file, or @c NULL.
+ * The @a target path must lead to an existing directory, or @c NULL. In case
+ * @a target is @c NULL, the root file system will be mounted. The @a data
+ * parameter will be forwarded to the file system initialization handler. The
+ * file system type is selected by @a filesystemtype and may be one of
+ * - RTEMS_FILESYSTEM_TYPE_DEVFS,
+ * - RTEMS_FILESYSTEM_TYPE_DOSFS,
+ * - RTEMS_FILESYSTEM_TYPE_FTPFS,
+ * - RTEMS_FILESYSTEM_TYPE_IMFS,
+ * - RTEMS_FILESYSTEM_TYPE_MINIIMFS,
+ * - RTEMS_FILESYSTEM_TYPE_NFS,
+ * - RTEMS_FILESYSTEM_TYPE_RFS, or
+ * - RTEMS_FILESYSTEM_TYPE_TFTPFS.
+ *
+ * Only configured or registered file system types are available. You can add
+ * file system types to your application configuration with
+ * - CONFIGURE_FILESYSTEM_DEVFS,
+ * - CONFIGURE_FILESYSTEM_DOSFS,
+ * - CONFIGURE_FILESYSTEM_FTPFS,
+ * - CONFIGURE_FILESYSTEM_IMFS,
+ * - CONFIGURE_FILESYSTEM_MINIIMFS,
+ * - CONFIGURE_FILESYSTEM_NFS,
+ * - CONFIGURE_FILESYSTEM_RFS, and
+ * - CONFIGURE_FILESYSTEM_TFTPFS.
+ *
+ * @see rtems_filesystem_register() and mount_and_make_target_path().
+ *
+ * @retval 0 Successful operation.
+ * @retval -1 An error occured. The @c errno indicates the error.
+ */
int mount(
const char *source,
const char *target,
@@ -723,10 +749,72 @@ int mount_and_make_target_path(
const void *data
);
-/*
- * Boot Time Mount Table Structure
+/**
+ * @brief Per file system type routine.
+ *
+ * @see rtems_filesystem_iterate().
+ *
+ * @retval true Stop the iteration.
+ * @retval false Continue the iteration.
+ */
+typedef bool (*rtems_per_filesystem_routine)(
+ const rtems_filesystem_table_t *fs_entry,
+ void *arg
+);
+
+/**
+ * @brief Iterates over all file system types.
+ *
+ * For each file system type the @a routine will be called with the entry and
+ * the @a routine_arg parameter.
+ *
+ * Do not register or unregister file system types in @a routine.
+ *
+ * The iteration is protected by the IO library mutex.
+ *
+ * @retval true Iteration stopped due to @a routine return status.
+ * @retval false Iteration through all entries.
+ */
+bool rtems_filesystem_iterate(
+ rtems_per_filesystem_routine routine,
+ void *routine_arg
+);
+
+/**
+ * @brief Per file system mount routine.
+ *
+ * @see rtems_filesystem_mount_iterate().
+ *
+ * @retval true Stop the iteration.
+ * @retval false Continue the iteration.
+ */
+typedef bool (*rtems_per_filesystem_mount_routine)(
+ const rtems_filesystem_mount_table_entry_t *mt_entry,
+ void *arg
+);
+
+/**
+ * @brief Iterates over all file system mounts.
+ *
+ * For each file system mount the @a routine will be called with the entry and
+ * the @a routine_arg parameter.
+ *
+ * Do not mount or unmount file systems in @a routine.
+ *
+ * The iteration is protected by the IO library mutex.
+ *
+ * @retval true Iteration stopped due to @a routine return status.
+ * @retval false Iteration through all entries.
*/
+bool
+rtems_filesystem_mount_iterate(
+ rtems_per_filesystem_mount_routine routine,
+ void *routine_arg
+);
+/**
+ * @brief Boot time mount table entry.
+ */
typedef struct {
const char *type;
rtems_filesystem_options_t fsoptions;
@@ -737,17 +825,6 @@ typedef struct {
extern const rtems_filesystem_mount_table_t *rtems_filesystem_mount_table;
extern const int rtems_filesystem_mount_table_size;
-typedef void (*rtems_libio_init_functions_t)(void);
-extern rtems_libio_init_functions_t rtems_libio_init_helper;
-
-void open_dev_console(void);
-
-typedef void (*rtems_libio_supp_functions_t)(void);
-extern rtems_libio_supp_functions_t rtems_libio_supp_helper;
-
-typedef void (*rtems_fs_init_functions_t)(void);
-extern rtems_fs_init_functions_t rtems_fs_init_helper;
-
/**
* @brief Creates a directory and all its parrent directories according to
* @a path.
@@ -831,6 +908,26 @@ int rtems_termios_dequeue_characters(
/** @} */
+/**
+ * @brief The pathconf setting for a file system.
+ */
+#define rtems_filesystem_pathconf(_mte) ((_mte)->pathconf_limits_and_options)
+
+/**
+ * @brief The type of file system. Its name.
+ */
+#define rtems_filesystem_type(_mte) ((_mte)->type)
+
+/**
+ * @brief The mount point of a file system.
+ */
+#define rtems_filesystem_mount_point(_mte) ((_mte)->target)
+
+/**
+ * @brief The device entry of a file system.
+ */
+#define rtems_filesystem_mount_device(_mte) ((_mte)->dev)
+
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/libcsupport/include/rtems/libio_.h b/cpukit/libcsupport/include/rtems/libio_.h
index 3f897885bb..ad00f8785f 100644
--- a/cpukit/libcsupport/include/rtems/libio_.h
+++ b/cpukit/libcsupport/include/rtems/libio_.h
@@ -40,11 +40,6 @@ extern rtems_id rtems_libio_semaphore;
extern const rtems_filesystem_file_handlers_r rtems_filesystem_null_handlers;
/*
- * Mount table list.
- */
-extern rtems_chain_control rtems_filesystem_mount_table_control;
-
-/*
* File descriptor Table Information
*/
diff --git a/cpukit/libcsupport/src/mount-mgr.c b/cpukit/libcsupport/src/mount-mgr.c
index 03ead45c9b..e2523978bb 100644
--- a/cpukit/libcsupport/src/mount-mgr.c
+++ b/cpukit/libcsupport/src/mount-mgr.c
@@ -37,38 +37,37 @@ typedef struct {
rtems_filesystem_table_t entry;
} filesystem_node;
-RTEMS_CHAIN_DEFINE_EMPTY(filesystem_chain);
+static RTEMS_CHAIN_DEFINE_EMPTY(filesystem_chain);
-void
-rtems_filesystem_iterate(
+bool rtems_filesystem_iterate(
rtems_per_filesystem_routine routine,
void *routine_arg
)
{
const rtems_filesystem_table_t *table_entry = &rtems_filesystem_table [0];
rtems_chain_node *node = NULL;
+ bool stop = false;
- while ( table_entry->type ) {
- if ( !(*routine)( table_entry, routine_arg ) ) {
- break;
- }
-
+ while ( table_entry->type && !stop ) {
+ stop = (*routine)( table_entry, routine_arg );
++table_entry;
}
- rtems_libio_lock();
- for (
- node = rtems_chain_first( &filesystem_chain );
- !rtems_chain_is_tail( &filesystem_chain, node );
- node = rtems_chain_next( node )
- ) {
- const filesystem_node *fsn = (filesystem_node *) node;
+ if ( !stop ) {
+ rtems_libio_lock();
+ for (
+ node = rtems_chain_first( &filesystem_chain );
+ !rtems_chain_is_tail( &filesystem_chain, node ) && !stop;
+ node = rtems_chain_next( node )
+ ) {
+ const filesystem_node *fsn = (filesystem_node *) node;
- if ( !(*routine)( &fsn->entry, routine_arg ) ) {
- break;
+ stop = (*routine)( &fsn->entry, routine_arg );
}
+ rtems_libio_unlock();
}
- rtems_libio_unlock();
+
+ return stop;
}
typedef struct {
@@ -81,7 +80,7 @@ static bool find_handler(const rtems_filesystem_table_t *entry, void *arg)
find_arg *fa = arg;
if ( strcmp( entry->type, fa->type ) != 0 ) {
- return true;
+ return false;
} else {
fa->mount_h = entry->mount_h;
diff --git a/cpukit/libcsupport/src/mount.c b/cpukit/libcsupport/src/mount.c
index b4f3fd4d5e..979382e8a2 100644
--- a/cpukit/libcsupport/src/mount.c
+++ b/cpukit/libcsupport/src/mount.c
@@ -36,10 +36,7 @@
#include <rtems/libio_.h>
-/*
- * Mount table list.
- */
-RTEMS_CHAIN_DEFINE_EMPTY(rtems_filesystem_mount_table_control);
+static RTEMS_CHAIN_DEFINE_EMPTY(mount_chain);
/*
* Default pathconfs.
@@ -59,37 +56,12 @@ const rtems_filesystem_limits_and_options_t rtems_filesystem_default_pathconf =
0 /* posix_vdisable: special char processing, 0=no, 1=yes */
};
-/*
- * Is_node_fs_root
- *
- * This routine will run through the entries that currently exist in the
- * mount table chain. For each entry in the mount table chain it will
- * compare the mount tables root node to the node describing the selected
- * mount point. If any match is found true is returned else false is
- * returned.
- *
- */
-
-static bool Is_node_fs_root(
- rtems_filesystem_location_info_t *loc
+static bool is_node_fs_root(
+ const rtems_filesystem_mount_table_entry_t *mt_entry,
+ void *arg
)
{
- rtems_chain_node *node = NULL;
-
- /*
- * For each mount table entry
- */
- for ( node = rtems_chain_first( &rtems_filesystem_mount_table_control );
- !rtems_chain_is_tail( &rtems_filesystem_mount_table_control, node );
- node = rtems_chain_next( node ) ) {
- rtems_filesystem_mount_table_entry_t *mount_table_entry =
- (rtems_filesystem_mount_table_entry_t *) node;
-
- if ( mount_table_entry->mt_fs_root.node_access == loc->node_access )
- return true;
- }
-
- return false;
+ return arg == mt_entry->mt_fs_root.node_access;
}
static rtems_filesystem_mount_table_entry_t *alloc_mount_table_entry(
@@ -225,7 +197,7 @@ int mount(
* You can only mount one file system onto a single mount point.
*/
- if ( Is_node_fs_root( &loc ) ){
+ if ( rtems_filesystem_mount_iterate( is_node_fs_root, loc.node_access ) ) {
errno = EBUSY;
goto cleanup_and_bail;
}
@@ -260,7 +232,7 @@ int mount(
/*
* Do we already have a base file system ?
*/
- if ( !rtems_chain_is_empty( &rtems_filesystem_mount_table_control ) ) {
+ if ( !rtems_chain_is_empty( &mount_chain ) ) {
errno = EINVAL;
goto cleanup_and_bail;
}
@@ -285,8 +257,9 @@ int mount(
/*
* Add the mount table entry to the mount table chain
*/
- rtems_chain_append( &rtems_filesystem_mount_table_control,
- &mt_entry->Node );
+ rtems_libio_lock();
+ rtems_chain_append( &mount_chain, &mt_entry->Node );
+ rtems_libio_unlock();
if ( !has_target )
rtems_filesystem_root = mt_entry->mt_fs_root;
@@ -303,33 +276,26 @@ cleanup_and_bail:
return -1;
}
-/*
- * Get the first entry in the mount table.
- */
-rtems_filesystem_mount_table_entry_t *
-rtems_filesystem_mounts_first(
- void
+bool rtems_filesystem_mount_iterate(
+ rtems_per_filesystem_mount_routine routine,
+ void *routine_arg
)
{
- rtems_filesystem_mount_table_entry_t *entry = NULL;
-
- if ( !rtems_chain_is_empty( &rtems_filesystem_mount_table_control ) )
- entry = (rtems_filesystem_mount_table_entry_t *)
- rtems_chain_first( &rtems_filesystem_mount_table_control );
+ rtems_chain_node *node = NULL;
+ bool stop = false;
+
+ rtems_libio_lock();
+ for (
+ node = rtems_chain_first( &mount_chain );
+ !rtems_chain_is_tail( &mount_chain, node ) && !stop;
+ node = rtems_chain_next( node )
+ ) {
+ const rtems_filesystem_mount_table_entry_t *mt_entry =
+ (rtems_filesystem_mount_table_entry_t *) node;
- return entry;
-}
+ stop = (*routine)( mt_entry, routine_arg );
+ }
+ rtems_libio_unlock();
-/*
- * Get the next entry in the mount table.
- */
-rtems_filesystem_mount_table_entry_t *
-rtems_filesystem_mounts_next(
- rtems_filesystem_mount_table_entry_t *entry
-)
-{
- if ( !entry )
- return NULL;
- return (rtems_filesystem_mount_table_entry_t *)
- rtems_chain_next( &entry->Node );
+ return stop;
}
diff --git a/cpukit/libcsupport/src/statvfs.c b/cpukit/libcsupport/src/statvfs.c
index 7815118d6f..24d6415c49 100644
--- a/cpukit/libcsupport/src/statvfs.c
+++ b/cpukit/libcsupport/src/statvfs.c
@@ -21,11 +21,6 @@
#include <sys/statvfs.h>
-/*
- * Data structures and routines private to mount/unmount pair.
- */
-extern rtems_chain_control rtems_filesystem_mount_table_control;
-
int
statvfs (const char *path, struct statvfs *sb)
{
diff --git a/cpukit/libcsupport/src/unmount.c b/cpukit/libcsupport/src/unmount.c
index b535ea9b53..12c659dd6d 100644
--- a/cpukit/libcsupport/src/unmount.c
+++ b/cpukit/libcsupport/src/unmount.c
@@ -22,7 +22,6 @@
#include <sys/types.h>
#include <sys/stat.h>
-#include <rtems/chain.h>
#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
@@ -32,51 +31,14 @@
#include <rtems/libio_.h>
#include <rtems/seterr.h>
+#include <rtems/chain.h>
-bool rtems_filesystem_nodes_equal(
- const rtems_filesystem_location_info_t *loc1,
- const rtems_filesystem_location_info_t *loc2
-){
- return ( loc1->node_access == loc2->node_access );
-}
-
-
-/*
- * file_systems_below_this_mountpoint
- *
- * This routine will run through the entries that currently exist in the
- * mount table chain. For each entry in the mount table chain it will
- * compare the mount tables mt_fs_root to the new_fs_root_node. If any of the
- * mount table file system root nodes matches the new file system root node
- * this indicates that we are trying to mount a file system that has already
- * been mounted. This is not a permitted operation. temp_loc is set to
- * the root node of the file system being unmounted.
- */
-
-bool file_systems_below_this_mountpoint(
- const char *path __attribute__((unused)),
- rtems_filesystem_location_info_t *fs_root_loc,
- rtems_filesystem_mount_table_entry_t *fs_to_unmount __attribute__((unused))
+static bool is_fs_below_mount_point(
+ const rtems_filesystem_mount_table_entry_t *mt_entry,
+ void *arg
)
{
- rtems_chain_node *the_node;
- rtems_filesystem_mount_table_entry_t *the_mount_entry;
-
- /*
- * Search the mount table for any mount entries referencing this
- * mount entry.
- */
-
- for ( the_node = rtems_filesystem_mount_table_control.first;
- !rtems_chain_is_tail( &rtems_filesystem_mount_table_control, the_node );
- the_node = the_node->next ) {
- the_mount_entry = ( rtems_filesystem_mount_table_entry_t * )the_node;
- if (the_mount_entry->mt_point_node.mt_entry == fs_root_loc->mt_entry ) {
- return true;
- }
- }
-
- return false;
+ return arg == mt_entry->mt_point_node.mt_entry;
}
/*
@@ -114,7 +76,7 @@ int unmount(
* Verify this is the root node for the file system to be unmounted.
*/
- if ( !rtems_filesystem_nodes_equal( fs_root_loc, &loc) ){
+ if ( fs_root_loc->node_access != loc.node_access ){
rtems_filesystem_freenode( &loc );
rtems_set_errno_and_return_minus_one( EACCES );
}
@@ -151,7 +113,8 @@ int unmount(
* Verify there are no file systems below the path specified
*/
- if ( file_systems_below_this_mountpoint( path, fs_root_loc, mt_entry ) != 0 )
+ if ( rtems_filesystem_mount_iterate( is_fs_below_mount_point,
+ fs_root_loc->mt_entry ) )
rtems_set_errno_and_return_minus_one( EBUSY );
/*
@@ -195,7 +158,9 @@ int unmount(
* Extract the mount table entry from the chain
*/
- rtems_chain_extract( ( rtems_chain_node * ) mt_entry );
+ rtems_libio_lock();
+ rtems_chain_extract( &mt_entry->Node );
+ rtems_libio_unlock();
/*
* Free the memory node that was allocated in mount