From 986b3ba46ac5b1b80458ba7f1ba655910bad9459 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Sat, 13 Oct 2007 11:31:23 +0100 Subject: [PATCH] --- yaml --- r: 68535 b: refs/heads/master c: 2665ea842dc9f4c04bdb57f8b7c2023759ac8c85 h: refs/heads/master i: 68533: b4cf05edfe0b9248ed374b226d7702d9ba4cf87c 68531: e17c264ba91059144d67ba7a7257c6089ed59ac4 68527: 4a41e5c3962862aaada341f2286f8c80001a012d v: v3 --- [refs] | 2 +- trunk/fs/jffs2/gc.c | 14 ++++++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index 7000ee118ce1..42ab6a17d24e 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 85becc535b7f33be5aefdb8ecea9fac4998e4b6f +refs/heads/master: 2665ea842dc9f4c04bdb57f8b7c2023759ac8c85 diff --git a/trunk/fs/jffs2/gc.c b/trunk/fs/jffs2/gc.c index eded819df235..95be264fe9b6 100644 --- a/trunk/fs/jffs2/gc.c +++ b/trunk/fs/jffs2/gc.c @@ -122,6 +122,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) struct jffs2_inode_cache *ic; struct jffs2_eraseblock *jeb; struct jffs2_raw_node_ref *raw; + uint32_t gcblock_dirty; int ret = 0, inum, nlink; int xattr = 0; @@ -236,6 +237,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) } raw = jeb->gc_node; + gcblock_dirty = jeb->dirty_size; while(ref_obsolete(raw)) { D1(printk(KERN_DEBUG "Node at 0x%08x is obsolete... skipping\n", ref_offset(raw))); @@ -282,7 +284,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) } else { ret = jffs2_garbage_collect_xattr_ref(c, (struct jffs2_xattr_ref *)ic, raw); } - goto release_sem; + goto test_gcnode; } #endif @@ -376,7 +378,7 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) if (ret != -EBADFD) { spin_unlock(&c->inocache_lock); - goto release_sem; + goto test_gcnode; } /* Fall through if it wanted us to, with inocache_lock held */ @@ -407,6 +409,14 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) jffs2_gc_release_inode(c, f); + test_gcnode: + if (jeb->dirty_size == gcblock_dirty && !ref_obsolete(jeb->gc_node)) { + /* Eep. This really should never happen. GC is broken */ + printk(KERN_ERR "Error garbage collecting node at %08x!\n", ref_offset(jeb->gc_node)); + ret = -ENOSPC; + } else if (ref_offset(jeb->gc_node) == 0x1c616bdc) + printk(KERN_ERR "Wheee. Correctly GC'd node at %08x\n", ref_offset(jeb->gc_node)); + release_sem: up(&c->alloc_sem);