JFFS2 locking regression fix.
authorDavid Woodhouse <dwmw2@infradead.org>
Mon, 20 Aug 2007 10:05:29 +0000 (11:05 +0100)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Tue, 21 Aug 2007 05:44:27 +0000 (22:44 -0700)
Commit a491486a2087ac3dfc00efb4f838c8d684afaf54 introduced a locking
problem in JFFS2 -- we up() the alloc_sem when we weren't previously
holding it. This leads to all kinds of fun behaviour later.

There was a _reason_ for the
if (1 /* alternative path needs testing */ ||
which the above-mentioned commit removed :)

Discovered and debugged by Giulio Fedel <giulio.fedel@andorsystems.com>

Signed-off-by: David Woodhouse <dwmw2@infradead.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
fs/jffs2/write.c

index bc6185933664b68e76694de35ed1df68c6408699..664c164aa67c19bef7583ce6fa7014cc715ffef5 100644 (file)
@@ -566,6 +566,9 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
                struct jffs2_full_dirent **prev = &dir_f->dents;
                uint32_t nhash = full_name_hash(name, namelen);
 
+               /* We don't actually want to reserve any space, but we do
+                  want to be holding the alloc_sem when we write to flash */
+               down(&c->alloc_sem);
                down(&dir_f->sem);
 
                while ((*prev) && (*prev)->nhash <= nhash) {