Skip to content

Commit

Permalink
UBI: fix eraseblock picking criteria
Browse files Browse the repository at this point in the history
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 <[email protected]>
Signed-off-by: Artem Bityutskiy <[email protected]>
Reviewed-by: Shmulik Ladkani <[email protected]>
Cc: [email protected]
  • Loading branch information
dedekind committed Mar 9, 2012
1 parent add8287 commit 7eb3aa6
Showing 1 changed file with 4 additions and 6 deletions.
10 changes: 4 additions & 6 deletions drivers/mtd/ubi/wl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 err, medium_ec;
int err;
struct ubi_wl_entry *e, *first, *last;

ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM ||
Expand Down Expand Up @@ -428,7 +428,7 @@ int ubi_wl_get_peb(struct ubi_device *ubi, int dtype)
* For unknown data we pick a physical eraseblock with medium
* erase counter. But we by no means can pick a physical
* 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,
u.rb);
Expand All @@ -437,10 +437,8 @@ int ubi_wl_get_peb(struct ubi_device *ubi, int dtype)
if (last->ec - first->ec < WL_FREE_MAX_DIFF)
e = rb_entry(ubi->free.rb_node,
struct ubi_wl_entry, u.rb);
else {
medium_ec = (first->ec + WL_FREE_MAX_DIFF)/2;
e = find_wl_entry(&ubi->free, medium_ec);
}
else
e = find_wl_entry(&ubi->free, WL_FREE_MAX_DIFF/2);
break;
case UBI_SHORTTERM:
/*
Expand Down

0 comments on commit 7eb3aa6

Please sign in to comment.