Index: cpukit/include/rtems/confdefs.h
===================================================================
--- cpukit/include/rtems/confdefs.h	(revision 16fc3f9a5463dfbc7b942fd1ea1275eaa834e914)
+++ cpukit/include/rtems/confdefs.h	(revision b17bcb3855abff75117811fce528b26eb65539a0)
@@ -450,12 +450,6 @@
     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
 
@@ -468,6 +462,5 @@
      _CONFIGURE_SEMAPHORES_FOR_NFS + \
      _CONFIGURE_SEMAPHORES_FOR_DOSFS + \
-     _CONFIGURE_SEMAPHORES_FOR_RFS + \
-     _CONFIGURE_SEMAPHORES_FOR_JFFS2)
+     _CONFIGURE_SEMAPHORES_FOR_RFS)
 
 #ifdef CONFIGURE_INIT
Index: cpukit/libfs/src/jffs2/src/fs-rtems.c
===================================================================
--- cpukit/libfs/src/jffs2/src/fs-rtems.c	(revision 16fc3f9a5463dfbc7b942fd1ea1275eaa834e914)
+++ cpukit/libfs/src/jffs2/src/fs-rtems.c	(revision b17bcb3855abff75117811fce528b26eb65539a0)
@@ -316,16 +316,12 @@
 } rtems_jffs2_fs_info;
 
-static void rtems_jffs2_do_lock(const 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 */
-}
-
-static void rtems_jffs2_do_unlock(const struct super_block *sb)
-{
-	rtems_status_code sc = rtems_semaphore_release(sb->s_mutex);
-	assert(sc == RTEMS_SUCCESSFUL);
-	(void) sc; /* avoid unused variable warning */
+static void rtems_jffs2_do_lock(struct super_block *sb)
+{
+	rtems_recursive_mutex_lock(&sb->s_mutex);
+}
+
+static void rtems_jffs2_do_unlock(struct super_block *sb)
+{
+	rtems_recursive_mutex_unlock(&sb->s_mutex);
 }
 
@@ -367,13 +363,7 @@
 	}
 
-	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);
 }
@@ -884,6 +874,6 @@
 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);
@@ -892,6 +882,6 @@
 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);
@@ -1246,4 +1236,8 @@
 
 	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;
 
@@ -1259,16 +1253,4 @@
 			err = -EINVAL;
 		}
-	}
-
-	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;
 	}
 
Index: cpukit/libfs/src/jffs2/src/os-rtems.h
===================================================================
--- cpukit/libfs/src/jffs2/src/os-rtems.h	(revision 16fc3f9a5463dfbc7b942fd1ea1275eaa834e914)
+++ cpukit/libfs/src/jffs2/src/os-rtems.h	(revision b17bcb3855abff75117811fce528b26eb65539a0)
@@ -33,4 +33,5 @@
 
 #include <rtems/jffs2.h>
+#include <rtems/thread.h>
 
 #define CONFIG_JFFS2_RTIME
@@ -105,5 +106,5 @@
 	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];
 };
