| From 7eb3aa65853e1b223bfc786b023b702018cb76c0 Mon Sep 17 00:00:00 2001 |
| From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| Date: Wed, 7 Mar 2012 19:08:36 +0200 |
| Subject: UBI: fix eraseblock picking criteria |
| |
| From: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| |
| commit 7eb3aa65853e1b223bfc786b023b702018cb76c0 upstream. |
| |
| 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> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mtd/ubi/wl.c | 10 ++++------ |
| 1 file changed, 4 insertions(+), 6 deletions(-) |
| |
| --- a/drivers/mtd/ubi/wl.c |
| +++ b/drivers/mtd/ubi/wl.c |
| @@ -389,7 +389,7 @@ static struct ubi_wl_entry *find_wl_entr |
| */ |
| 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 || |
| @@ -427,7 +427,7 @@ retry: |
| * 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); |
| @@ -436,10 +436,8 @@ retry: |
| 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: |
| /* |