JFFS2: don't fail on bitflips in OOB
JFFS2 was designed without thought for OOB bitflips, it seems, but they can occur and will be reported to JFFS2 via mtd_read_oob()[1]. We don't want to fail on these transactions, since the data was corrected. [1] Few drivers report bitflips for OOB-only transactions. With such drivers, this patch should have no effect. Signed-off-by: Brian Norris <computersforpeace@gmail.com> Cc: stable@vger.kernel.org Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
This commit is contained in:
parent
6f12f59a5f
commit
74d83beaa2
1 changed files with 4 additions and 4 deletions
|
@ -1044,10 +1044,10 @@ int jffs2_check_oob_empty(struct jffs2_sb_info *c,
|
||||||
ops.datbuf = NULL;
|
ops.datbuf = NULL;
|
||||||
|
|
||||||
ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
|
ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
|
||||||
if (ret || ops.oobretlen != ops.ooblen) {
|
if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) {
|
||||||
pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n",
|
pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n",
|
||||||
jeb->offset, ops.ooblen, ops.oobretlen, ret);
|
jeb->offset, ops.ooblen, ops.oobretlen, ret);
|
||||||
if (!ret)
|
if (!ret || mtd_is_bitflip(ret))
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1086,10 +1086,10 @@ int jffs2_check_nand_cleanmarker(struct jffs2_sb_info *c,
|
||||||
ops.datbuf = NULL;
|
ops.datbuf = NULL;
|
||||||
|
|
||||||
ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
|
ret = mtd_read_oob(c->mtd, jeb->offset, &ops);
|
||||||
if (ret || ops.oobretlen != ops.ooblen) {
|
if ((ret && !mtd_is_bitflip(ret)) || ops.oobretlen != ops.ooblen) {
|
||||||
pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n",
|
pr_err("cannot read OOB for EB at %08x, requested %zd bytes, read %zd bytes, error %d\n",
|
||||||
jeb->offset, ops.ooblen, ops.oobretlen, ret);
|
jeb->offset, ops.ooblen, ops.oobretlen, ret);
|
||||||
if (!ret)
|
if (!ret || mtd_is_bitflip(ret))
|
||||||
ret = -EIO;
|
ret = -EIO;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue