Commit 8596813a authored by Richard Weinberger's avatar Richard Weinberger

ubi: Don't do anchor move within fastmap area

To make sure that Fastmap can use a PEB within the first 64
PEBs, UBI moves blocks away from that area.
It uses regular wear-leveling for that job.

An anchor move can be triggered if no PEB is free in this area
or because of anticipation. In the latter case it can happen
that UBI decides to move a block but finds a free PEB
within the same area.
This case is in vain an increases only erase counters.

Catch this case and cancel wear-leveling if this happens.
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent cbc898d5
...@@ -710,6 +710,12 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, ...@@ -710,6 +710,12 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,
if (!e2) if (!e2)
goto out_cancel; goto out_cancel;
/*
* Anchor move within the anchor area is useless.
*/
if (e2->pnum < UBI_FM_MAX_START)
goto out_cancel;
self_check_in_wl_tree(ubi, e1, &ubi->used); self_check_in_wl_tree(ubi, e1, &ubi->used);
rb_erase(&e1->u.rb, &ubi->used); rb_erase(&e1->u.rb, &ubi->used);
dbg_wl("anchor-move PEB %d to PEB %d", e1->pnum, e2->pnum); dbg_wl("anchor-move PEB %d to PEB %d", e1->pnum, e2->pnum);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment