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 | |
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')
-rw-r--r-- | fs/jffs2/erase.c | 8 | ||||
-rw-r--r-- | fs/jffs2/wbuf.c | 12 |
2 files changed, 10 insertions, 10 deletions
diff --git a/fs/jffs2/erase.c b/fs/jffs2/erase.c index bed6e1b8d824..bb47673c1e59 100644 --- a/fs/jffs2/erase.c +++ b/fs/jffs2/erase.c | |||
@@ -7,7 +7,7 @@ | |||
7 | * | 7 | * |
8 | * For licensing information, see the file 'LICENCE' in this directory. | 8 | * For licensing information, see the file 'LICENCE' in this directory. |
9 | * | 9 | * |
10 | * $Id: erase.c,v 1.74 2005/03/20 17:46:20 dedekind Exp $ | 10 | * $Id: erase.c,v 1.75 2005/04/05 12:51:54 dedekind Exp $ |
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
@@ -332,7 +332,11 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb | |||
332 | 332 | ||
333 | bad_offset = ofs; | 333 | bad_offset = ofs; |
334 | 334 | ||
335 | ret = jffs2_flash_read(c, ofs, readlen, &retlen, ebuf); | 335 | if (!jffs2_is_writebuffered(c) || !jffs2_cleanmarker_oob(c)) |
336 | ret = c->mtd->read(c->mtd, ofs, readlen, &retlen, ebuf); | ||
337 | else | ||
338 | ret = c->mtd->read_ecc(c->mtd, ofs, readlen, &retlen, ebuf, NULL, c->oobinfo); | ||
339 | |||
336 | if (ret) { | 340 | if (ret) { |
337 | printk(KERN_WARNING "Read of newly-erased block at 0x%08x failed: %d. Putting on bad_list\n", ofs, ret); | 341 | printk(KERN_WARNING "Read of newly-erased block at 0x%08x failed: %d. Putting on bad_list\n", ofs, ret); |
338 | goto bad; | 342 | goto bad; |
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 */ |