Merge git://git.kernel.org/pub/scm/linux/kernel/git/steve/gfs2-2.6-fixes
[pandora-kernel.git] / fs / jffs2 / gc.c
index 3b6f2fa..f5e96bd 100644 (file)
@@ -214,6 +214,19 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c)
                return ret;
        }
 
+       /* If there are any blocks which need erasing, erase them now */
+       if (!list_empty(&c->erase_complete_list) ||
+           !list_empty(&c->erase_pending_list)) {
+               spin_unlock(&c->erase_completion_lock);
+               D1(printk(KERN_DEBUG "jffs2_garbage_collect_pass() erasing pending blocks\n"));
+               if (jffs2_erase_pending_blocks(c, 1)) {
+                       mutex_unlock(&c->alloc_sem);
+                       return 0;
+               }
+               D1(printk(KERN_DEBUG "No progress from erasing blocks; doing GC anyway\n"));
+               spin_lock(&c->erase_completion_lock);
+       }
+
        /* First, work out which block we're garbage-collecting */
        jeb = c->gcblock;
 
@@ -222,7 +235,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c)
 
        if (!jeb) {
                /* Couldn't find a free block. But maybe we can just erase one and make 'progress'? */
-               if (!list_empty(&c->erase_pending_list)) {
+               if (c->nr_erasing_blocks) {
                        spin_unlock(&c->erase_completion_lock);
                        mutex_unlock(&c->alloc_sem);
                        return -EAGAIN;
@@ -435,7 +448,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c)
                list_add_tail(&c->gcblock->list, &c->erase_pending_list);
                c->gcblock = NULL;
                c->nr_erasing_blocks++;
-               jffs2_erase_pending_trigger(c);
+               jffs2_garbage_collect_trigger(c);
        }
        spin_unlock(&c->erase_completion_lock);