|
Jiri Slaby |
831413 |
From: Bang Li <libang.linuxer@gmail.com>
|
|
Jiri Slaby |
831413 |
Date: Wed, 29 Mar 2023 00:30:12 +0800
|
|
Jiri Slaby |
831413 |
Subject: [PATCH] mtdblock: tolerate corrected bit-flips
|
|
Jiri Slaby |
831413 |
References: bsc#1012628
|
|
Jiri Slaby |
831413 |
Patch-mainline: 6.2.12
|
|
Jiri Slaby |
831413 |
Git-commit: 0c3089601f064d80b3838eceb711fcac04bceaad
|
|
Jiri Slaby |
831413 |
|
|
Jiri Slaby |
831413 |
commit 0c3089601f064d80b3838eceb711fcac04bceaad upstream.
|
|
Jiri Slaby |
831413 |
|
|
Jiri Slaby |
831413 |
mtd_read() may return -EUCLEAN in case of corrected bit-flips.This
|
|
Jiri Slaby |
831413 |
particular condition should not be treated like an error.
|
|
Jiri Slaby |
831413 |
|
|
Jiri Slaby |
831413 |
Signed-off-by: Bang Li <libang.linuxer@gmail.com>
|
|
Jiri Slaby |
831413 |
Fixes: e47f68587b82 ("mtd: check for max_bitflips in mtd_read_oob()")
|
|
Jiri Slaby |
831413 |
Cc: <stable@vger.kernel.org> # v3.7
|
|
Jiri Slaby |
831413 |
Acked-by: Richard Weinberger <richard@nod.at>
|
|
Jiri Slaby |
831413 |
Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
|
|
Jiri Slaby |
831413 |
Link: https://lore.kernel.org/linux-mtd/20230328163012.4264-1-libang.linuxer@gmail.com
|
|
Jiri Slaby |
831413 |
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
Jiri Slaby |
831413 |
Signed-off-by: Jiri Slaby <jslaby@suse.cz>
|
|
Jiri Slaby |
831413 |
---
|
|
Jiri Slaby |
831413 |
drivers/mtd/mtdblock.c | 12 ++++++++----
|
|
Jiri Slaby |
831413 |
1 file changed, 8 insertions(+), 4 deletions(-)
|
|
Jiri Slaby |
831413 |
|
|
Jiri Slaby |
831413 |
diff --git a/drivers/mtd/mtdblock.c b/drivers/mtd/mtdblock.c
|
|
Jiri Slaby |
831413 |
index 1e94e7d1..a0a1194d 100644
|
|
Jiri Slaby |
831413 |
--- a/drivers/mtd/mtdblock.c
|
|
Jiri Slaby |
831413 |
+++ b/drivers/mtd/mtdblock.c
|
|
Jiri Slaby |
831413 |
@@ -153,7 +153,7 @@ static int do_cached_write (struct mtdblk_dev *mtdblk, unsigned long pos,
|
|
Jiri Slaby |
831413 |
mtdblk->cache_state = STATE_EMPTY;
|
|
Jiri Slaby |
831413 |
ret = mtd_read(mtd, sect_start, sect_size,
|
|
Jiri Slaby |
831413 |
&retlen, mtdblk->cache_data);
|
|
Jiri Slaby |
831413 |
- if (ret)
|
|
Jiri Slaby |
831413 |
+ if (ret && !mtd_is_bitflip(ret))
|
|
Jiri Slaby |
831413 |
return ret;
|
|
Jiri Slaby |
831413 |
if (retlen != sect_size)
|
|
Jiri Slaby |
831413 |
return -EIO;
|
|
Jiri Slaby |
831413 |
@@ -188,8 +188,12 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos,
|
|
Jiri Slaby |
831413 |
pr_debug("mtdblock: read on \"%s\" at 0x%lx, size 0x%x\n",
|
|
Jiri Slaby |
831413 |
mtd->name, pos, len);
|
|
Jiri Slaby |
831413 |
|
|
Jiri Slaby |
831413 |
- if (!sect_size)
|
|
Jiri Slaby |
831413 |
- return mtd_read(mtd, pos, len, &retlen, buf);
|
|
Jiri Slaby |
831413 |
+ if (!sect_size) {
|
|
Jiri Slaby |
831413 |
+ ret = mtd_read(mtd, pos, len, &retlen, buf);
|
|
Jiri Slaby |
831413 |
+ if (ret && !mtd_is_bitflip(ret))
|
|
Jiri Slaby |
831413 |
+ return ret;
|
|
Jiri Slaby |
831413 |
+ return 0;
|
|
Jiri Slaby |
831413 |
+ }
|
|
Jiri Slaby |
831413 |
|
|
Jiri Slaby |
831413 |
while (len > 0) {
|
|
Jiri Slaby |
831413 |
unsigned long sect_start = (pos/sect_size)*sect_size;
|
|
Jiri Slaby |
831413 |
@@ -209,7 +213,7 @@ static int do_cached_read (struct mtdblk_dev *mtdblk, unsigned long pos,
|
|
Jiri Slaby |
831413 |
memcpy (buf, mtdblk->cache_data + offset, size);
|
|
Jiri Slaby |
831413 |
} else {
|
|
Jiri Slaby |
831413 |
ret = mtd_read(mtd, pos, size, &retlen, buf);
|
|
Jiri Slaby |
831413 |
- if (ret)
|
|
Jiri Slaby |
831413 |
+ if (ret && !mtd_is_bitflip(ret))
|
|
Jiri Slaby |
831413 |
return ret;
|
|
Jiri Slaby |
831413 |
if (retlen != size)
|
|
Jiri Slaby |
831413 |
return -EIO;
|
|
Jiri Slaby |
831413 |
--
|
|
Jiri Slaby |
831413 |
2.35.3
|
|
Jiri Slaby |
831413 |
|