aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd
diff options
context:
space:
mode:
authorArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2012-03-07 12:08:36 -0500
committerArtem Bityutskiy <artem.bityutskiy@linux.intel.com>2012-03-09 02:39:31 -0500
commit7eb3aa65853e1b223bfc786b023b702018cb76c0 (patch)
tree3242d8bbff42f7ec5c2678790683471ff4c54861 /drivers/mtd
parentadd8287e3fa2160229117c9e1b7c9ca8cb661423 (diff)
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
Diffstat (limited to 'drivers/mtd')
-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 8616f52144c..512eab07c60 100644
--- a/drivers/mtd/ubi/wl.c
+++ b/drivers/mtd/ubi/wl.c
@@ -390,7 +390,7 @@ static struct ubi_wl_entry *find_wl_entry(struct rb_root *root, int diff)
390 */ 390 */
391int ubi_wl_get_peb(struct ubi_device *ubi, int dtype) 391int ubi_wl_get_peb(struct ubi_device *ubi, int dtype)
392{ 392{
393 int err, medium_ec; 393 int err;
394 struct ubi_wl_entry *e, *first, *last; 394 struct ubi_wl_entry *e, *first, *last;
395 395
396 ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM || 396 ubi_assert(dtype == UBI_LONGTERM || dtype == UBI_SHORTTERM ||
@@ -428,7 +428,7 @@ retry:
428 * For unknown data we pick a physical eraseblock with medium 428 * For unknown data we pick a physical eraseblock with medium
429 * erase counter. But we by no means can pick a physical 429 * erase counter. But we by no means can pick a physical
430 * eraseblock with erase counter greater or equivalent than the 430 * eraseblock with erase counter greater or equivalent than the
431 * lowest erase counter plus %WL_FREE_MAX_DIFF. 431 * lowest erase counter plus %WL_FREE_MAX_DIFF/2.
432 */ 432 */
433 first = rb_entry(rb_first(&ubi->free), struct ubi_wl_entry, 433 first = rb_entry(rb_first(&ubi->free), struct ubi_wl_entry,
434 u.rb); 434 u.rb);
@@ -437,10 +437,8 @@ retry:
437 if (last->ec - first->ec < WL_FREE_MAX_DIFF) 437 if (last->ec - first->ec < WL_FREE_MAX_DIFF)
438 e = rb_entry(ubi->free.rb_node, 438 e = rb_entry(ubi->free.rb_node,
439 struct ubi_wl_entry, u.rb); 439 struct ubi_wl_entry, u.rb);
440 else { 440 else
441 medium_ec = (first->ec + WL_FREE_MAX_DIFF)/2; 441 e = find_wl_entry(&ubi->free, WL_FREE_MAX_DIFF/2);
442 e = find_wl_entry(&ubi->free, medium_ec);
443 }
444 break; 442 break;
445 case UBI_SHORTTERM: 443 case UBI_SHORTTERM:
446 /* 444 /*