From: David Woodhouse Date: Mon, 20 Aug 2007 10:05:29 +0000 (+0100) Subject: JFFS2 locking regression fix. X-Git-Tag: v2.6.23-rc4~104 X-Git-Url: https://err.no/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b5748643332bf75274e0b639926d57e86fb133cf;p=linux-2.6 JFFS2 locking regression fix. 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 Signed-off-by: David Woodhouse Signed-off-by: Linus Torvalds --- diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c index bc61859336..664c164aa6 100644 --- a/fs/jffs2/write.c +++ b/fs/jffs2/write.c @@ -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) {