aboutsummaryrefslogtreecommitdiffstats
path: root/fs/jffs2/write.c
diff options
context:
space:
mode:
authorDavid Woodhouse <dwmw2@infradead.org>2007-08-20 06:05:29 -0400
committerLinus Torvalds <torvalds@woody.linux-foundation.org>2007-08-21 01:44:27 -0400
commitb5748643332bf75274e0b639926d57e86fb133cf (patch)
treeb649c2d0abe6149343ec17dd0f4a8a5827759082 /fs/jffs2/write.c
parent2046219364a40bcb13482ff68eb6ccec13405633 (diff)
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 <giulio.fedel@andorsystems.com> Signed-off-by: David Woodhouse <dwmw2@infradead.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'fs/jffs2/write.c')
-rw-r--r--fs/jffs2/write.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c
index bc6185933664..664c164aa67c 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,
566 struct jffs2_full_dirent **prev = &dir_f->dents; 566 struct jffs2_full_dirent **prev = &dir_f->dents;
567 uint32_t nhash = full_name_hash(name, namelen); 567 uint32_t nhash = full_name_hash(name, namelen);
568 568
569 /* We don't actually want to reserve any space, but we do
570 want to be holding the alloc_sem when we write to flash */
571 down(&c->alloc_sem);
569 down(&dir_f->sem); 572 down(&dir_f->sem);
570 573
571 while ((*prev) && (*prev)->nhash <= nhash) { 574 while ((*prev) && (*prev)->nhash <= nhash) {