mirror of
https://github.com/torvalds/linux.git
synced 2026-09-22 20:54:03 +02:00
UBI: fastmap: Pass to_be_tortured when reusing old fastmap PEBs
In ubi_update_fastmap(), when no fresh PEB is available to replace an
old fastmap PEB, the old PEB is reused by erasing it synchronously
via ubi_sync_erase() with the torture flag hardcoded to zero.
However, old_fm->to_be_tortured[] may be non-zero: it is set during
fastmap scanning when ubi_io_read_data()/ubi_io_read_ec_hdr() reports
UBI_IO_BITFLIPS, meaning the PEB showed signs of bit decay and should
be tortured to verify it is still reliable.
When the old PEB is instead returned to the WL sub-system via
ubi_wl_put_fm_peb(), the to_be_tortured flag is honored. The
synchronous reuse path is inconsistent: it silently skips the torture
test for PEBs that exhibited bit-flips.
Fix it by passing &old_fm->to_be_tortured[i] to ubi_sync_erase().
Fixes: dbb7d2a88d ("UBI: Add fastmap core")
Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
This commit is contained in:
parent
420477a84f
commit
be04fce994
|
|
@ -1488,7 +1488,7 @@ static void return_fm_pebs(struct ubi_device *ubi,
|
|||
*/
|
||||
int ubi_update_fastmap(struct ubi_device *ubi)
|
||||
{
|
||||
int ret, i, j, torture = 0;
|
||||
int ret, i, j;
|
||||
struct ubi_fastmap_layout *new_fm, *old_fm;
|
||||
struct ubi_wl_entry *tmp_e;
|
||||
|
||||
|
|
@ -1526,7 +1526,8 @@ int ubi_update_fastmap(struct ubi_device *ubi)
|
|||
|
||||
if (!tmp_e) {
|
||||
if (old_fm && old_fm->e[i]) {
|
||||
ret = ubi_sync_erase(ubi, old_fm->e[i], &torture);
|
||||
ret = ubi_sync_erase(ubi, old_fm->e[i],
|
||||
&old_fm->to_be_tortured[i]);
|
||||
if (ret < 0) {
|
||||
ubi_err(ubi, "could not erase old fastmap PEB");
|
||||
|
||||
|
|
@ -1578,7 +1579,8 @@ int ubi_update_fastmap(struct ubi_device *ubi)
|
|||
if (old_fm) {
|
||||
/* no fresh anchor PEB was found, reuse the old one */
|
||||
if (!tmp_e) {
|
||||
ret = ubi_sync_erase(ubi, old_fm->e[0], &torture);
|
||||
ret = ubi_sync_erase(ubi, old_fm->e[0],
|
||||
&old_fm->to_be_tortured[0]);
|
||||
if (ret < 0) {
|
||||
ubi_err(ubi, "could not erase old anchor PEB");
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user