summaryrefslogtreecommitdiffstats
path: root/cpukit/include/rtems/fs.h
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/include/rtems/fs.h')
-rw-r--r--cpukit/include/rtems/fs.h59
1 files changed, 50 insertions, 9 deletions
diff --git a/cpukit/include/rtems/fs.h b/cpukit/include/rtems/fs.h
index 84b18370b5..bf5026f645 100644
--- a/cpukit/include/rtems/fs.h
+++ b/cpukit/include/rtems/fs.h
@@ -8,6 +8,9 @@
* COPYRIGHT (c) 1989-2011.
* 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.
@@ -18,6 +21,8 @@
#ifndef _RTEMS_FS_H
#define _RTEMS_FS_H
+#include <rtems/chain.h>
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -31,9 +36,6 @@ extern "C" {
/* FIXME: shouldn't this better not be here? */
typedef struct rtems_libio_tt rtems_libio_t;
-typedef struct rtems_filesystem_location_info_tt
- rtems_filesystem_location_info_t;
-
struct rtems_filesystem_mount_table_entry_tt;
typedef struct rtems_filesystem_mount_table_entry_tt
rtems_filesystem_mount_table_entry_t;
@@ -43,18 +45,57 @@ typedef struct _rtems_filesystem_file_handlers_r
typedef struct _rtems_filesystem_operations_table
rtems_filesystem_operations_table;
-/*
- * Structure used to determine a location/filesystem in the tree.
+/**
+ * @brief File system location.
+ *
+ * @ingroup LibIO
*/
-
-struct rtems_filesystem_location_info_tt
-{
+typedef struct rtems_filesystem_location_info_tt {
+ rtems_chain_node mt_entry_node;
void *node_access;
void *node_access_2;
const rtems_filesystem_file_handlers_r *handlers;
const rtems_filesystem_operations_table *ops;
rtems_filesystem_mount_table_entry_t *mt_entry;
-};
+} rtems_filesystem_location_info_t;
+
+/**
+ * @brief Global file system location.
+ *
+ * @ingroup LibIO
+ *
+ * The global file system locations are used for
+ * - the mount point location in the mount table entry,
+ * - the file system root location in the mount table entry,
+ * - the root directory location in the user environment, and
+ * - the current directory location in the user environment.
+ *
+ * During the path evaluation global start locations are obtained to ensure
+ * that the current file system will be not unmounted in the meantime.
+ *
+ * To support a release within critical sections of the operating system a
+ * deferred release is supported. This is similar to malloc() and free().
+ *
+ * @see rtems_filesystem_global_location_obtain() and
+ * rtems_filesystem_global_location_release().
+ */
+typedef struct rtems_filesystem_global_location_t {
+ rtems_filesystem_location_info_t location;
+ int reference_count;
+
+ /**
+ * A release within a critical section of the operating system will add this
+ * location to a list of deferred released locations. This list is processed
+ * in the next rtems_filesystem_global_location_obtain() in FIFO order.
+ */
+ struct rtems_filesystem_global_location_t *deferred_released_next;
+
+ /**
+ * A release within a critical section can happen multiple times. This field
+ * counts the deferred releases.
+ */
+ int deferred_released_count;
+} rtems_filesystem_global_location_t;
/*
* Return the mount table entry for a path location.