summaryrefslogtreecommitdiffstats
path: root/cpukit/libfs/src/jffs2/src
diff options
context:
space:
mode:
Diffstat (limited to 'cpukit/libfs/src/jffs2/src')
-rw-r--r--cpukit/libfs/src/jffs2/src/fs-rtems.c12
-rw-r--r--cpukit/libfs/src/jffs2/src/os-rtems.h7
2 files changed, 18 insertions, 1 deletions
diff --git a/cpukit/libfs/src/jffs2/src/fs-rtems.c b/cpukit/libfs/src/jffs2/src/fs-rtems.c
index 5f57a16bcb..8084776659 100644
--- a/cpukit/libfs/src/jffs2/src/fs-rtems.c
+++ b/cpukit/libfs/src/jffs2/src/fs-rtems.c
@@ -552,6 +552,15 @@ static void rtems_jffs2_get_info(
info->bad_blocks = rtems_jffs2_count_blocks(&c->bad_list);
}
+static int rtems_jffs2_on_demand_garbage_collection(struct jffs2_sb_info *c)
+{
+ if (jffs2_thread_should_wake(c)) {
+ return -jffs2_garbage_collect_pass(c);
+ } else {
+ return 0;
+ }
+}
+
static int rtems_jffs2_ioctl(
rtems_libio_t *iop,
ioctl_command_t request,
@@ -568,6 +577,9 @@ static int rtems_jffs2_ioctl(
rtems_jffs2_get_info(&inode->i_sb->jffs2_sb, buffer);
eno = 0;
break;
+ case RTEMS_JFFS2_ON_DEMAND_GARBAGE_COLLECTION:
+ eno = rtems_jffs2_on_demand_garbage_collection(&inode->i_sb->jffs2_sb);
+ break;
case RTEMS_JFFS2_FORCE_GARBAGE_COLLECTION:
eno = -jffs2_garbage_collect_pass(&inode->i_sb->jffs2_sb);
break;
diff --git a/cpukit/libfs/src/jffs2/src/os-rtems.h b/cpukit/libfs/src/jffs2/src/os-rtems.h
index 7946f85566..8dbde681d8 100644
--- a/cpukit/libfs/src/jffs2/src/os-rtems.h
+++ b/cpukit/libfs/src/jffs2/src/os-rtems.h
@@ -120,7 +120,12 @@ static inline bool jffs2_is_readonly(struct jffs2_sb_info *c)
static inline void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c)
{
- /* We don't have a GC thread in RTEMS (yet) */
+ const struct super_block *sb = OFNI_BS_2SFFJ(c);
+ rtems_jffs2_flash_control *fc = sb->s_flash_control;
+
+ if (fc->trigger_garbage_collection != NULL) {
+ (*fc->trigger_garbage_collection)(fc);
+ }
}
/* fs-rtems.c */