| From 5ef4414f4bc26a19cfd5cd11aee9697a863e4d51 Mon Sep 17 00:00:00 2001 |
| From: Richard Weinberger <richard@nod.at> |
| Date: Mon, 19 Aug 2013 08:48:12 +0200 |
| Subject: UBI: Fix PEB leak in wear_leveling_worker() |
| |
| From: Richard Weinberger <richard@nod.at> |
| |
| commit 5ef4414f4bc26a19cfd5cd11aee9697a863e4d51 upstream. |
| |
| get_peb_for_wl() removes the PEB from the free list. |
| If the WL subsystem detects that no wear leveling is needed |
| it cancels the operation and drops the gained PEB. |
| In this case we have to put the PEB back into the free list. |
| |
| This issue was introduced with commit ed4b7021c |
| (UBI: remove PEB from free tree in get_peb_for_wl()). |
| |
| Signed-off-by: Richard Weinberger <richard@nod.at> |
| Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/mtd/ubi/wl.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/drivers/mtd/ubi/wl.c |
| +++ b/drivers/mtd/ubi/wl.c |
| @@ -1069,6 +1069,9 @@ static int wear_leveling_worker(struct u |
| if (!(e2->ec - e1->ec >= UBI_WL_THRESHOLD)) { |
| dbg_wl("no WL needed: min used EC %d, max free EC %d", |
| e1->ec, e2->ec); |
| + |
| + /* Give the unused PEB back */ |
| + wl_tree_add(e2, &ubi->free); |
| goto out_cancel; |
| } |
| self_check_in_wl_tree(ubi, e1, &ubi->used); |