From d7aa1ab86fc06799286eb5a648eeb488446c4bbc Mon Sep 17 00:00:00 2001 From: Kinsey Moore Date: Wed, 4 Oct 2023 12:26:57 -0500 Subject: [PATCH] cpukit/jffs2: Implement JFFS2 spinlocks This provides a non-noop implementation of spinlocks for JFFS2 in terms of RTEMS mutexes. POSIX spinlocks are not appropriate for the types of actions that occur during a held JFFS2 spinlock and can cause bad dispatch level conditions. --- .../libfs/src/jffs2/include/linux/spinlock.h | 30 ++++--------------- cpukit/libfs/src/jffs2/src/fs-rtems.c | 2 ++ 2 files changed, 8 insertions(+), 24 deletions(-) diff --git a/cpukit/libfs/src/jffs2/include/linux/spinlock.h b/cpukit/libfs/src/jffs2/include/linux/spinlock.h index 22eba0ba55..44f6b7c53e 100644 --- a/cpukit/libfs/src/jffs2/include/linux/spinlock.h +++ b/cpukit/libfs/src/jffs2/include/linux/spinlock.h @@ -1,34 +1,16 @@ #ifndef __LINUX_SPINLOCK_H__ #define __LINUX_SPINLOCK_H__ +#include -typedef struct { } spinlock_t; -#define SPIN_LOCK_UNLOCKED (spinlock_t) { } -#define DEFINE_SPINLOCK(x) spinlock_t x = SPIN_LOCK_UNLOCKED +typedef struct { rtems_mutex r_m; } spinlock_t; -#define spin_lock_init(lock) \ -CYG_MACRO_START; \ -CYG_UNUSED_PARAM(spinlock_t *, lock); \ -CYG_MACRO_END +#define DEFINE_SPINLOCK(x) spinlock_t x -#define spin_lock(lock) \ -CYG_MACRO_START; \ -CYG_UNUSED_PARAM(spinlock_t *, lock); \ -CYG_MACRO_END +#define spin_lock_init(x) rtems_mutex_init(&(x)->r_m, "JFFS2 Spinlock"); -#define spin_unlock(lock) \ -CYG_MACRO_START; \ -CYG_UNUSED_PARAM(spinlock_t *, lock); \ -CYG_MACRO_END +#define spin_lock(x) rtems_mutex_lock(&(x)->r_m); -#define spin_lock_bh(lock) \ -CYG_MACRO_START; \ -CYG_UNUSED_PARAM(spinlock_t *, lock); \ -CYG_MACRO_END - -#define spin_unlock_bh(lock) \ -CYG_MACRO_START; \ -CYG_UNUSED_PARAM(spinlock_t *, lock); \ -CYG_MACRO_END +#define spin_unlock(x) rtems_mutex_unlock(&(x)->r_m); #endif /* __LINUX_SPINLOCK_H__ */ diff --git a/cpukit/libfs/src/jffs2/src/fs-rtems.c b/cpukit/libfs/src/jffs2/src/fs-rtems.c index e47f2e7fd2..0d97e7a6fb 100644 --- a/cpukit/libfs/src/jffs2/src/fs-rtems.c +++ b/cpukit/libfs/src/jffs2/src/fs-rtems.c @@ -1384,6 +1384,8 @@ int rtems_jffs2_initialize( #ifdef CONFIG_JFFS2_FS_WRITEBUFFER add_delayed_work_to_chain(&c->wbuf_dwork); #endif + spin_lock_init(&c->erase_completion_lock); + spin_lock_init(&c->inocache_lock); c->mtd = NULL; rtems_recursive_mutex_init(&sb->s_mutex, RTEMS_FILESYSTEM_TYPE_JFFS2); }