public inbox for linux-mtd@lists.infradead.org
 help / color / mirror / Atom feed
* [PATCH 1/2] jffs:2 Move erasing from write_super to GC.
@ 2010-02-15 16:03 Joakim Tjernlund
  2010-02-15 16:03 ` [PATCH 2/2] s/jffs2_erase_pending_trigger/jffs2_garbage_collect_trigger/ Joakim Tjernlund
  2010-02-16  8:57 ` [PATCH 1/2] jffs:2 Move erasing from write_super to GC Artem Bityutskiy
  0 siblings, 2 replies; 16+ messages in thread
From: Joakim Tjernlund @ 2010-02-15 16:03 UTC (permalink / raw)
  To: linux-mtd; +Cc: Joakim Tjernlund

Erasing blocks is a form of GC and therefor it should live in the
GC task. By moving it there two problems will be solved:
1) umounting will not hang until all pending blocks has
   been erased.
2) Erasing can be paused by sending a SIGSTOP to the GC thread which
   allowes for time critical tasks work in peace.

Signed-off-by: Joakim Tjernlund <Joakim.Tjernlund@transmode.se>
---
 fs/jffs2/background.c |    1 +
 fs/jffs2/erase.c      |    5 +++++
 fs/jffs2/nodemgmt.c   |    4 ++++
 fs/jffs2/super.c      |    1 -
 4 files changed, 10 insertions(+), 1 deletions(-)

diff --git a/fs/jffs2/background.c b/fs/jffs2/background.c
index 3ff50da..a8e0140 100644
--- a/fs/jffs2/background.c
+++ b/fs/jffs2/background.c
@@ -146,6 +146,7 @@ static int jffs2_garbage_collect_thread(void *_c)
 		disallow_signal(SIGHUP);
 
 		D1(printk(KERN_DEBUG "jffs2_garbage_collect_thread(): pass\n"));
+		jffs2_erase_pending_blocks(c, 0);
 		if (jffs2_garbage_collect_pass(c) == -ENOSPC) {
 			printk(KERN_NOTICE "No space for garbage collection. Aborting GC thread\n");
 			goto die;
diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c
index b47679b..1ca2559 100644
--- a/fs/jffs2/erase.c
+++ b/fs/jffs2/erase.c
@@ -114,6 +114,11 @@ void jffs2_erase_pending_blocks(struct jffs2_sb_info *c, int count)
 	while (!list_empty(&c->erase_complete_list) ||
 	       !list_empty(&c->erase_pending_list)) {
 
+		if (signal_pending(current)) {
+			spin_unlock(&c->erase_completion_lock);
+			mutex_unlock(&c->erase_free_sem);
+			goto done;
+		}
 		if (!list_empty(&c->erase_complete_list)) {
 			jeb = list_entry(c->erase_complete_list.next, struct jffs2_eraseblock, list);
 			list_move(&jeb->list, &c->erase_checking_list);
diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c
index 21a0529..155fd63 100644
--- a/fs/jffs2/nodemgmt.c
+++ b/fs/jffs2/nodemgmt.c
@@ -733,6 +733,10 @@ int jffs2_thread_should_wake(struct jffs2_sb_info *c)
 	int nr_very_dirty = 0;
 	struct jffs2_eraseblock *jeb;
 
+	if (!list_empty(&c->erase_complete_list) ||
+	    !list_empty(&c->erase_pending_list))
+		return 1;
+
 	if (c->unchecked_size) {
 		D1(printk(KERN_DEBUG "jffs2_thread_should_wake(): unchecked_size %d, checked_ino #%d\n",
 			  c->unchecked_size, c->checked_ino));
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
index 9a80e8e..5162329 100644
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -64,7 +64,6 @@ static void jffs2_write_super(struct super_block *sb)
 	if (!(sb->s_flags & MS_RDONLY)) {
 		D1(printk(KERN_DEBUG "jffs2_write_super()\n"));
 		jffs2_garbage_collect_trigger(c);
-		jffs2_erase_pending_blocks(c, 0);
 		jffs2_flush_wbuf_gc(c, 0);
 	}
 
-- 
1.6.4.4

^ permalink raw reply related	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2010-02-17  8:23 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-15 16:03 [PATCH 1/2] jffs:2 Move erasing from write_super to GC Joakim Tjernlund
2010-02-15 16:03 ` [PATCH 2/2] s/jffs2_erase_pending_trigger/jffs2_garbage_collect_trigger/ Joakim Tjernlund
2010-02-16  8:59   ` Artem Bityutskiy
2010-02-16  9:32     ` Joakim Tjernlund
2010-02-16 14:27     ` Joakim Tjernlund
2010-02-17  7:18       ` Artem Bityutskiy
2010-02-17  7:35         ` Joakim Tjernlund
2010-02-17  7:48           ` Artem Bityutskiy
2010-02-17  7:55             ` Joakim Tjernlund
2010-02-17  8:07               ` Artem Bityutskiy
2010-02-17  8:19                 ` Joakim Tjernlund
2010-02-16  8:57 ` [PATCH 1/2] jffs:2 Move erasing from write_super to GC Artem Bityutskiy
2010-02-16  9:18   ` Joakim Tjernlund
2010-02-16  9:45     ` Artem Bityutskiy
2010-02-16 11:49       ` Joakim Tjernlund
2010-02-16 11:59         ` Artem Bityutskiy

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox