JFFS2 locking regression fix.
authorDavid Woodhouse <[email protected]>
Mon, 20 Aug 2007 10:05:29 +0000 (11:05 +0100)
committerLinus Torvalds <[email protected]>
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 <[email protected]>

Signed-off-by: David Woodhouse <[email protected]>
Signed-off-by: Linus Torvalds <[email protected]>
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) {