summaryrefslogtreecommitdiff
path: root/fs/jffs2
diff options
context:
space:
mode:
authorLi Zefan <lizefan@huawei.com>2014-02-14 10:51:40 +1100
committerStephen Rothwell <sfr@canb.auug.org.au>2014-02-14 10:51:40 +1100
commitbc9ba9980c4ad6aab40b20b31e755782bd4ae965 (patch)
tree6a9bf38e53ed5786a301aebed73f469cf91e06d5 /fs/jffs2
parentfada9b25c665ba87aa2700c8ca4a350c8e9510ff (diff)
jffs2: fix unbalanced locking
This was found by our internal debugging feature on runtime, but this bug won't lead to deadlock, as the structure that this lock is embedded in is freed on error. Signed-off-by: Li Zefan <lizefan@huawei.com> Cc: David Woodhouse <dwmw2@infradead.org> Cc: Brian Norris <computersforpeace@gmail.com> Cc: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Cc: <stable@vger.kernel.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Diffstat (limited to 'fs/jffs2')
-rw-r--r--fs/jffs2/readinode.c3
1 files changed, 3 insertions, 0 deletions
diff --git a/fs/jffs2/readinode.c b/fs/jffs2/readinode.c
index 386303dca382..8261021620f8 100644
--- a/fs/jffs2/readinode.c
+++ b/fs/jffs2/readinode.c
@@ -1143,6 +1143,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
JFFS2_ERROR("cannot read nodes for ino %u, returned error is %d\n", f->inocache->ino, ret);
if (f->inocache->state == INO_STATE_READING)
jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
+ mutex_unlock(&f->sem);
return ret;
}
@@ -1159,6 +1160,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
jffs2_free_tmp_dnode_info(rii.mdata_tn);
rii.mdata_tn = NULL;
}
+ mutex_unlock(&f->sem);
return ret;
}
@@ -1183,6 +1185,7 @@ static int jffs2_do_read_inode_internal(struct jffs2_sb_info *c,
if (!rii.fds) {
if (f->inocache->state == INO_STATE_READING)
jffs2_set_inocache_state(c, f->inocache, INO_STATE_CHECKEDABSENT);
+ mutex_unlock(&f->sem);
return -EIO;
}
JFFS2_NOTICE("but it has children so we fake some modes for it\n");