[JFFS2] Fix race in post-mount node checking

Linux-MTD Mailing List linux-mtd at lists.infradead.org
Wed May 3 13:56:31 EDT 2006


commit d96fb997c6174f98a2a0a98200f99ac13b053bd6
tree bd2400a8553975a6463ef0160a7aaad914a9b236
parent fb6a82c94a9c69adfb6b9f6ce9f84be36884e471
author David Woodhouse <dwmw2 at infradead.org> Mon, 17 Apr 2006 00:19:48 +0100
committer David Woodhouse <dwmw2 at infradead.org> Mon, 17 Apr 2006 00:19:48 +0100

[JFFS2] Fix race in post-mount node checking

For a while now, we've postponed CRC-checking of data nodes to be done
by the GC thread, instead of being done while the user is waiting for
mount to finish. The GC thread would iterate through all the inodes on
the system and check each of their data nodes. It would skip over inodes
which had already been used or were already being read in by
read_inode(), because their data nodes would have been examined anyway.

However, we could sometimes reach the end of the for-each-inode loop and
still have some unchecked space left, if an inode we'd skipped was
_still_ in the process of being read. This fixes that race by actually
waiting for read_inode() to finish rather than just moving on.

Thanks to Ladislav Michl for coming up with a reproducible test case and
helping to track it down.

Signed-off-by: David Woodhouse <dwmw2 at infradead.org>

 fs/jffs2/gc.c |    4 ++++
 1 files changed, 4 insertions(+)

diff --git a/fs/jffs2/gc.c b/fs/jffs2/gc.c
index f9ffece..967fb2c 100644
--- a/fs/jffs2/gc.c
+++ b/fs/jffs2/gc.c
@@ -181,6 +181,10 @@ int jffs2_garbage_collect_pass(struct jf
 			   and trigger the BUG() above while we haven't yet
 			   finished checking all its nodes */
 			D1(printk(KERN_DEBUG "Waiting for ino #%u to finish reading\n", ic->ino));
+			/* We need to come back again for the _same_ inode. We've
+			 made no progress in this case, but that should be OK */
+			c->checked_ino--;
+
 			up(&c->alloc_sem);
 			sleep_on_spinunlock(&c->inocache_wq, &c->inocache_lock);
 			return 0;




More information about the linux-mtd-cvs mailing list