aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/ubi
diff options
context:
space:
mode:
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2012-03-07 12:08:36 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2012-04-02 12:27:17 -0400
commit5f1968d427434ea1c0745d75428008e26334bde8 (patch)
treec60d6ab234ac32f5e12eb33fbb322753c891858b /drivers/mtd/ubi
parent8f418747ea2d87c1394d357b1996ffd6579ae9f4 (diff)
UBI: fix eraseblock picking criteria
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>
Diffstat (limited to 'drivers/mtd/ubi')
-rw-r--r--drivers/mtd/ubi/wl.c10
1 files changed, 4 insertions, 6 deletions
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c
index 12e44c90b32..25f18e9b643 100644
--- a/drivers/mtd/ubi/wl.c
+++ b/drivers/mtd/ubi/wl.c
@@ -386,7 +386,7 @@ static struct ubi_wl_entry *find_wl_entry(struct rb_root *root, int max)
386 */ 386 */
387int ubi_wl_get_peb(struct ubi_device *ubi, int dtype) 387int ubi_wl_get_peb(struct ubi_device *ubi, int dtype)
388{ 388{
389 int err, medium_ec; 389 int err;
390 struct ubi_wl_entry *e, *first, *last; 390 struct ubi_wl_entry *e, *first, *last;
391 391
392 ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM || 392 ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM ||
@@ -424,7 +424,7 @@ retry:
424 * For unknown data we pick a physical eraseblock with medium 424 * For unknown data we pick a physical eraseblock with medium
425 * erase counter. But we by no means can pick a physical 425 * erase counter. But we by no means can pick a physical
426 * eraseblock with erase counter greater or equivalent than the 426 * eraseblock with erase counter greater or equivalent than the
427 * lowest erase counter plus %WL_FREE_MAX_DIFF. 427 * lowest erase counter plus %WL_FREE_MAX_DIFF/2.
428 */ 428 */
429 first = rb_entry(rb_first(&ubi->free), struct ubi_wl_entry, 429 first = rb_entry(rb_first(&ubi->free), struct ubi_wl_entry,
430 u.rb); 430 u.rb);
@@ -433,10 +433,8 @@ retry:
433 if (last->ec - first->ec < WL_FREE_MAX_DIFF) 433 if (last->ec - first->ec < WL_FREE_MAX_DIFF)
434 e = rb_entry(ubi->free.rb_node, 434 e = rb_entry(ubi->free.rb_node,
435 struct ubi_wl_entry, u.rb); 435 struct ubi_wl_entry, u.rb);
436 else { 436 else
437 medium_ec = (first->ec + WL_FREE_MAX_DIFF)/2; 437 e = find_wl_entry(&ubi->free, WL_FREE_MAX_DIFF/2);
438 e = find_wl_entry(&ubi->free, medium_ec);
439 }
440 break; 438 break;
441 case UBI_SHORTTERM: 439 case UBI_SHORTTERM:
442 /* 440 /*