diff options
author | David Woodhouse <dwmw2@infradead.org> | 2007-08-20 11:05:29 +0100 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-08-22 16:23:27 -0700 |
commit | 1d8715b388c978b0f1b1bf4812fcee0e73b023d7 (patch) | |
tree | 36d8dd95075849be6b7d23953130cfc59bf9c2ef | |
parent | dad2f19424a2f4d30009e5aa51aca05a0bba7020 (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>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
-rw-r--r-- | fs/jffs2/write.c | 3 |
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/jffs2/write.c b/fs/jffs2/write.c index c9fe0ab3a329..1b68a521acfc 100644 --- a/fs/jffs2/write.c +++ b/fs/jffs2/write.c @@ -553,6 +553,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) { |