jffs2: Require jffs2_garbage_collect_trigger() to be called with lock held

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Wed May 19 17:59:02 EDT 2010


Gitweb:     http://git.infradead.org/?p=mtd-2.6.git;a=commit;h=acb64a43e4503fbea9faf123f2403da7af8831eb
Commit:     acb64a43e4503fbea9faf123f2403da7af8831eb
Parent:     d6ce171069635f05737935adc813b4d48d71a583
Author:     David Woodhouse <David.Woodhouse at intel.com>
AuthorDate: Wed May 19 17:00:10 2010 +0100
Committer:  David Woodhouse <David.Woodhouse at intel.com>
CommitDate: Wed May 19 17:10:22 2010 +0100

    jffs2: Require jffs2_garbage_collect_trigger() to be called with lock held
    
    We're about to call this from a bunch of places which already hold
    c->erase_completion_lock, so add an assertion and change its existing
    callers to do the same.
    
    Signed-off-by: David Woodhouse <David.Woodhouse at intel.com>
---
 fs/jffs2/background.c |    3 +--
 fs/jffs2/nodemgmt.c   |    2 ++
 fs/jffs2/super.c      |    2 ++
 3 files changed, 5 insertions(+), 2 deletions(-)

diff --git a/fs/jffs2/background.c b/fs/jffs2/background.c
index 3ff50da..55f1dde 100644
--- a/fs/jffs2/background.c
+++ b/fs/jffs2/background.c
@@ -23,10 +23,9 @@ static int jffs2_garbage_collect_thread(void *);
 
 void jffs2_garbage_collect_trigger(struct jffs2_sb_info *c)
 {
-	spin_lock(&c->erase_completion_lock);
+	assert_spin_locked(&c->erase_completion_lock);
 	if (c->gc_task && jffs2_thread_should_wake(c))
 		send_sig(SIGHUP, c->gc_task, 1);
-	spin_unlock(&c->erase_completion_lock);
 }
 
 /* This must only ever be called when no GC thread is currently running */
diff --git a/fs/jffs2/nodemgmt.c b/fs/jffs2/nodemgmt.c
index 5ab5c85..dd2d920 100644
--- a/fs/jffs2/nodemgmt.c
+++ b/fs/jffs2/nodemgmt.c
@@ -481,7 +481,9 @@ struct jffs2_raw_node_ref *jffs2_add_physical_node_ref(struct jffs2_sb_info *c,
 void jffs2_complete_reservation(struct jffs2_sb_info *c)
 {
 	D1(printk(KERN_DEBUG "jffs2_complete_reservation()\n"));
+	spin_lock(&c->erase_completion_lock);
 	jffs2_garbage_collect_trigger(c);
+	spin_unlock(&c->erase_completion_lock);
 	mutex_unlock(&c->alloc_sem);
 }
 
diff --git a/fs/jffs2/super.c b/fs/jffs2/super.c
index 9a80e8e..12cc967 100644
--- a/fs/jffs2/super.c
+++ b/fs/jffs2/super.c
@@ -63,7 +63,9 @@ static void jffs2_write_super(struct super_block *sb)
 
 	if (!(sb->s_flags & MS_RDONLY)) {
 		D1(printk(KERN_DEBUG "jffs2_write_super()\n"));
+		spin_lock(&c->erase_completion_lock);
 		jffs2_garbage_collect_trigger(c);
+		spin_unlock(&c->erase_completion_lock);
 		jffs2_erase_pending_blocks(c, 0);
 		jffs2_flush_wbuf_gc(c, 0);
 	}



More information about the linux-mtd-cvs mailing list