linux/drivers/mtd
Sascha Hauer 197190bc5c mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM
[ Upstream commit fdf2e82105 ]

When erased subpages are read then the BCH decoder returns STATUS_ERASED
if they are all empty, or STATUS_UNCORRECTABLE if there are bitflips.
When there are bitflips, we have to set these bits again to show the
upper layers a completely erased page. When a bitflip happens in the
exact byte where the bad block marker is, then this byte is swapped
with another byte in block_mark_swapping(). The correction code then
detects a bitflip in another subpage and no longer corrects the bitflip
where it really happens.

Correct this behaviour by calling block_mark_swapping() after the
bitflips have been corrected.

In our case UBIFS failed with this bug because it expects erased
pages to be really empty:

UBIFS error (pid 187): ubifs_scan: corrupt empty space at LEB 36:118735
UBIFS error (pid 187): ubifs_scanned_corruption: corruption at LEB 36:118735
UBIFS error (pid 187): ubifs_scanned_corruption: first 8192 bytes from LEB 36:118735
UBIFS error (pid 187): ubifs_scan: LEB 36 scanning failed
UBIFS error (pid 187): do_commit: commit failed, error -117

Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Reviewed-by: Richard Weinberger <richard@nod.at>
Acked-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-03-03 10:19:41 +01:00
..
chips mtd: cfi: enforce valid geometry configuration 2018-02-25 11:03:46 +01:00
devices MTD updates for 4.4-rc1: 2015-11-06 11:50:24 -08:00
lpddr mtd: lpddr: show parent device in sysfs 2015-10-13 09:21:17 -07:00
maps mtd: maps: add __init attribute 2018-02-25 11:03:44 +01:00
nand mtd: nand: gpmi: Fix failure when a erased page has a bitflip at BBM 2018-03-03 10:19:41 +01:00
onenand mtd: onenand: fix deadlock in onenand_block_markbad 2016-04-12 09:09:05 -07:00
spi-nor mtd: spi-nor: fix spansion quad enable 2017-06-29 12:48:52 +02:00
tests mtd: tests: Replace timeval with ktime_t 2015-10-26 13:23:47 -07:00
ubi ubi: block: Fix locking for idr_alloc/idr_remove 2018-02-16 20:09:41 +01:00
afs.c
ar7part.c
bcm47xxpart.c mtd: bcm47xxpart: don't fail because of bit-flips 2017-07-05 14:37:18 +02:00
bcm63xxpart.c
cmdlinepart.c mtd: cmdlinepart: convert printk() to pr_*() 2015-09-28 18:37:32 -07:00
ftl.c
inftlcore.c
inftlmount.c
Kconfig mtd: part: Create the master device node when partitioned 2015-04-05 17:44:01 -07:00
Makefile
mtd_blkdevs.c mtd: blkdevs: fix potential deadlock + lockdep warnings 2015-10-30 17:24:43 -07:00
mtdblock_ro.c
mtdblock.c mtd: mtdblock: remove the needless mtdblks_lock 2015-01-07 12:51:56 -08:00
mtdchar.c mtd: provide proper 32/64-bit compat_ioctl() support for BLKPG 2015-09-29 13:37:04 -07:00
mtdconcat.c MTD updates for 3.20-rc1 2015-02-18 08:01:44 -08:00
mtdcore.c mtd: fix cmdlinepart parser, early naming for auto-filled MTD 2016-01-04 10:54:18 -08:00
mtdcore.h
mtdoops.c
mtdpart.c mtd: mtdpart: Do not fail mtd probe when parsing partitions fails 2015-10-26 18:43:48 -07:00
mtdsuper.c
mtdswap.c
nftlcore.c
nftlmount.c mtd: nftl: reorganize operations in condition check 2015-01-09 15:26:29 -08:00
ofpart.c doc: dt: mtd: partitions: add compatible property to "partitions" node 2015-12-08 17:10:20 -08:00
redboot.c
rfd_ftl.c
sm_ftl.c
sm_ftl.h
ssfdc.c