[PATCH 08/12] JFFS2: Use self-contained recursive mutex
Sebastian Huber
sebastian.huber at embedded-brains.de
Thu Dec 21 14:09:56 UTC 2017
Update #2843.
---
cpukit/libfs/src/jffs2/src/fs-rtems.c | 44 +++++++++++------------------------
cpukit/libfs/src/jffs2/src/os-rtems.h | 3 ++-
cpukit/sapi/include/confdefs.h | 9 +------
3 files changed, 16 insertions(+), 40 deletions(-)
diff --git a/cpukit/libfs/src/jffs2/src/fs-rtems.c b/cpukit/libfs/src/jffs2/src/fs-rtems.c
index 262bec9b27..652a8e7dbe 100644
--- a/cpukit/libfs/src/jffs2/src/fs-rtems.c
+++ b/cpukit/libfs/src/jffs2/src/fs-rtems.c
@@ -315,18 +315,14 @@ typedef struct {
struct jffs2_inode_cache *inode_cache[];
} rtems_jffs2_fs_info;
-static void rtems_jffs2_do_lock(const struct super_block *sb)
+static void rtems_jffs2_do_lock(struct super_block *sb)
{
- rtems_status_code sc = rtems_semaphore_obtain(sb->s_mutex, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
- assert(sc == RTEMS_SUCCESSFUL);
- (void) sc; /* avoid unused variable warning */
+ rtems_recursive_mutex_lock(&sb->s_mutex);
}
-static void rtems_jffs2_do_unlock(const struct super_block *sb)
+static void rtems_jffs2_do_unlock(struct super_block *sb)
{
- rtems_status_code sc = rtems_semaphore_release(sb->s_mutex);
- assert(sc == RTEMS_SUCCESSFUL);
- (void) sc; /* avoid unused variable warning */
+ rtems_recursive_mutex_unlock(&sb->s_mutex);
}
static void rtems_jffs2_free_directory_entries(struct _inode *inode)
@@ -366,15 +362,9 @@ static void rtems_jffs2_free_fs_info(rtems_jffs2_fs_info *fs_info, bool do_mount
free(c->blocks);
}
- if (sb->s_mutex != 0) {
- rtems_status_code sc = rtems_semaphore_delete(sb->s_mutex);
- assert(sc == RTEMS_SUCCESSFUL);
- (void) sc; /* avoid unused variable warning */
- }
-
rtems_jffs2_flash_control_destroy(fs_info->sb.s_flash_control);
rtems_jffs2_compressor_control_destroy(fs_info->sb.s_compressor_control);
-
+ rtems_recursive_mutex_destroy(&sb->s_mutex);
free(fs_info);
}
@@ -883,16 +873,16 @@ static const rtems_filesystem_eval_path_generic_config rtems_jffs2_eval_config =
static void rtems_jffs2_lock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
- const rtems_jffs2_fs_info *fs_info = mt_entry->fs_info;
- const struct super_block *sb = &fs_info->sb;
+ rtems_jffs2_fs_info *fs_info = mt_entry->fs_info;
+ struct super_block *sb = &fs_info->sb;
rtems_jffs2_do_lock(sb);
}
static void rtems_jffs2_unlock(const rtems_filesystem_mount_table_entry_t *mt_entry)
{
- const rtems_jffs2_fs_info *fs_info = mt_entry->fs_info;
- const struct super_block *sb = &fs_info->sb;
+ rtems_jffs2_fs_info *fs_info = mt_entry->fs_info;
+ struct super_block *sb = &fs_info->sb;
rtems_jffs2_do_unlock(sb);
}
@@ -1245,6 +1235,10 @@ int rtems_jffs2_initialize(
c = JFFS2_SB_INFO(sb);
if (err == 0) {
+ rtems_recursive_mutex_init(&sb->s_mutex, RTEMS_FILESYSTEM_TYPE_JFFS2);
+ }
+
+ if (err == 0) {
uint32_t blocks = fc->flash_size / fc->block_size;
if ((fc->block_size * blocks) != fc->flash_size) {
@@ -1261,18 +1255,6 @@ int rtems_jffs2_initialize(
}
if (err == 0) {
- rtems_status_code sc = rtems_semaphore_create(
- rtems_build_name('J', 'F', 'F', 'S'),
- 1,
- RTEMS_PRIORITY | RTEMS_INHERIT_PRIORITY | RTEMS_BINARY_SEMAPHORE,
- 0,
- &sb->s_mutex
- );
-
- err = sc == RTEMS_SUCCESSFUL ? 0 : -ENOMEM;
- }
-
- if (err == 0) {
sb->s_is_readonly = !mt_entry->writeable;
sb->s_flash_control = fc;
sb->s_compressor_control = jffs2_mount_data->compressor_control;
diff --git a/cpukit/libfs/src/jffs2/src/os-rtems.h b/cpukit/libfs/src/jffs2/src/os-rtems.h
index 8dbde681d8..ab4f6d72bf 100644
--- a/cpukit/libfs/src/jffs2/src/os-rtems.h
+++ b/cpukit/libfs/src/jffs2/src/os-rtems.h
@@ -32,6 +32,7 @@
#include <time.h>
#include <rtems/jffs2.h>
+#include <rtems/thread.h>
#define CONFIG_JFFS2_RTIME
@@ -104,7 +105,7 @@ struct super_block {
rtems_jffs2_compressor_control *s_compressor_control;
bool s_is_readonly;
unsigned char s_gc_buffer[PAGE_CACHE_SIZE]; // Avoids malloc when user may be under memory pressure
- rtems_id s_mutex;
+ rtems_recursive_mutex s_mutex;
char s_name_buf[JFFS2_MAX_NAME_LEN];
};
diff --git a/cpukit/sapi/include/confdefs.h b/cpukit/sapi/include/confdefs.h
index eee4c1fe47..27f5b3eedd 100755
--- a/cpukit/sapi/include/confdefs.h
+++ b/cpukit/sapi/include/confdefs.h
@@ -449,14 +449,8 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
#if !defined(CONFIGURE_FILESYSTEM_ENTRY_JFFS2) && \
defined(CONFIGURE_FILESYSTEM_JFFS2)
#include <rtems/jffs2.h>
- #if !defined(CONFIGURE_MAXIMUM_JFFS2_MOUNTS)
- #define CONFIGURE_MAXIMUM_JFFS2_MOUNTS 1
- #endif
#define CONFIGURE_FILESYSTEM_ENTRY_JFFS2 \
{ RTEMS_FILESYSTEM_TYPE_JFFS2, rtems_jffs2_initialize }
- #define _CONFIGURE_SEMAPHORES_FOR_JFFS2 CONFIGURE_MAXIMUM_JFFS2_MOUNTS
-#else
- #define _CONFIGURE_SEMAPHORES_FOR_JFFS2 0
#endif
/**
@@ -467,8 +461,7 @@ extern rtems_initialization_tasks_table Initialization_tasks[];
(_CONFIGURE_SEMAPHORES_FOR_FIFOS + \
_CONFIGURE_SEMAPHORES_FOR_NFS + \
_CONFIGURE_SEMAPHORES_FOR_DOSFS + \
- _CONFIGURE_SEMAPHORES_FOR_RFS + \
- _CONFIGURE_SEMAPHORES_FOR_JFFS2)
+ _CONFIGURE_SEMAPHORES_FOR_RFS)
#ifdef CONFIGURE_INIT
--
2.12.3
More information about the devel
mailing list