UBI: fix eraseblock picking criteria
The 'find_wl_entry()' function expects the maximum difference as the second argument, not the maximum absolute value. So the "unknown" eraseblock picking was incorrect, as Shmulik Ladkani spotted. This patch fixes the issue. Reported-by: Shmulik Ladkani <shmulik.ladkani@gmail.com> Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> Reviewed-by: Shmulik Ladkani <shmulik.ladkani@gmail.com> Cc: stable@kernel.org
This commit is contained in:
parent
add8287e3f
commit
7eb3aa6585
|
@ -390,7 +390,7 @@ static struct ubi_wl_entry *find_wl_entry(struct rb_root *root, int diff)
|
||||||
*/
|
*/
|
||||||
int ubi_wl_get_peb(struct ubi_device *ubi, int dtype)
|
int ubi_wl_get_peb(struct ubi_device *ubi, int dtype)
|
||||||
{
|
{
|
||||||
int err, medium_ec;
|
int err;
|
||||||
struct ubi_wl_entry *e, *first, *last;
|
struct ubi_wl_entry *e, *first, *last;
|
||||||
|
|
||||||
ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM ||
|
ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM ||
|
||||||
|
@ -428,7 +428,7 @@ retry:
|
||||||
* For unknown data we pick a physical eraseblock with medium
|
* For unknown data we pick a physical eraseblock with medium
|
||||||
* erase counter. But we by no means can pick a physical
|
* erase counter. But we by no means can pick a physical
|
||||||
* eraseblock with erase counter greater or equivalent than the
|
* eraseblock with erase counter greater or equivalent than the
|
||||||
* lowest erase counter plus %WL_FREE_MAX_DIFF.
|
* lowest erase counter plus %WL_FREE_MAX_DIFF/2.
|
||||||
*/
|
*/
|
||||||
first = rb_entry(rb_first(&ubi->free), struct ubi_wl_entry,
|
first = rb_entry(rb_first(&ubi->free), struct ubi_wl_entry,
|
||||||
u.rb);
|
u.rb);
|
||||||
|
@ -437,10 +437,8 @@ retry:
|
||||||
if (last->ec - first->ec < WL_FREE_MAX_DIFF)
|
if (last->ec - first->ec < WL_FREE_MAX_DIFF)
|
||||||
e = rb_entry(ubi->free.rb_node,
|
e = rb_entry(ubi->free.rb_node,
|
||||||
struct ubi_wl_entry, u.rb);
|
struct ubi_wl_entry, u.rb);
|
||||||
else {
|
else
|
||||||
medium_ec = (first->ec + WL_FREE_MAX_DIFF)/2;
|
e = find_wl_entry(&ubi->free, WL_FREE_MAX_DIFF/2);
|
||||||
e = find_wl_entry(&ubi->free, medium_ec);
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case UBI_SHORTTERM:
|
case UBI_SHORTTERM:
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue