diff options
author | Artem B. Bityuckiy <dedekind@infradead.org> | 2005-04-05 08:51:58 -0400 |
---|---|---|
committer | Thomas Gleixner <tglx@mtd.linutronix.de> | 2005-05-23 07:09:29 -0400 |
commit | 894214d1a75745a283d5f1921125b3ad36d7ba26 (patch) | |
tree | 70dd3913dfb671871348878b1f2a4c30427e2d73 /fs/jffs2/wbuf.c | |
parent | 22c60f5fb7b8184a2d00a607f965b54c586fb40e (diff) |
[JFFS2] Fix race problems with wbuf.
Signed-off-by: Artem B. Bityuckiy <dedekind@infradead.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Diffstat (limited to 'fs/jffs2/wbuf.c')
-rw-r--r-- | fs/jffs2/wbuf.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c index 0a7676819df0..996d922e503e 100644 --- a/fs/jffs2/wbuf.c +++ b/fs/jffs2/wbuf.c | |||
@@ -9,7 +9,7 @@ | |||
9 | * | 9 | * |
10 | * For licensing information, see the file 'LICENCE' in this directory. | 10 | * For licensing information, see the file 'LICENCE' in this directory. |
11 | * | 11 | * |
12 | * $Id: wbuf.c,v 1.91 2005/03/18 09:58:06 dedekind Exp $ | 12 | * $Id: wbuf.c,v 1.92 2005/04/05 12:51:54 dedekind Exp $ |
13 | * | 13 | * |
14 | */ | 14 | */ |
15 | 15 | ||
@@ -873,6 +873,7 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re | |||
873 | return c->mtd->read(c->mtd, ofs, len, retlen, buf); | 873 | return c->mtd->read(c->mtd, ofs, len, retlen, buf); |
874 | 874 | ||
875 | /* Read flash */ | 875 | /* Read flash */ |
876 | down_read(&c->wbuf_sem); | ||
876 | if (jffs2_cleanmarker_oob(c)) | 877 | if (jffs2_cleanmarker_oob(c)) |
877 | ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, c->oobinfo); | 878 | ret = c->mtd->read_ecc(c->mtd, ofs, len, retlen, buf, NULL, c->oobinfo); |
878 | else | 879 | else |
@@ -896,16 +897,11 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re | |||
896 | 897 | ||
897 | /* if no writebuffer available or write buffer empty, return */ | 898 | /* if no writebuffer available or write buffer empty, return */ |
898 | if (!c->wbuf_pagesize || !c->wbuf_len) | 899 | if (!c->wbuf_pagesize || !c->wbuf_len) |
899 | return ret;; | 900 | goto exit; |
900 | 901 | ||
901 | /* if we read in a different block, return */ | 902 | /* if we read in a different block, return */ |
902 | if (SECTOR_ADDR(ofs) != SECTOR_ADDR(c->wbuf_ofs)) | 903 | if (SECTOR_ADDR(ofs) != SECTOR_ADDR(c->wbuf_ofs)) |
903 | return ret; | 904 | goto exit; |
904 | |||
905 | /* Lock only if we have reason to believe wbuf contains relevant data, | ||
906 | so that checking an erased block during wbuf recovery space allocation | ||
907 | does not deadlock. */ | ||
908 | down_read(&c->wbuf_sem); | ||
909 | 905 | ||
910 | if (ofs >= c->wbuf_ofs) { | 906 | if (ofs >= c->wbuf_ofs) { |
911 | owbf = (ofs - c->wbuf_ofs); /* offset in write buffer */ | 907 | owbf = (ofs - c->wbuf_ofs); /* offset in write buffer */ |