Patchwork UBI: Fix PEB leak in wear_leveling_worker()

login
register
mail settings
Submitter Richard Weinberger
Date Aug. 19, 2013, 6:48 a.m.
Message ID <1376894892-31519-1-git-send-email-richard@nod.at>
Download mbox | patch
Permalink /patch/268123/
State Accepted
Commit 5ef4414f4bc26a19cfd5cd11aee9697a863e4d51
Headers show

Comments

Richard Weinberger - Aug. 19, 2013, 6:48 a.m.
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()).

Cc: <stable@vger.kernel.org> # 3.7.x
Signed-off-by: Richard Weinberger <richard@nod.at>
---
 drivers/mtd/ubi/wl.c | 3 +++
 1 file changed, 3 insertions(+)
Artem Bityutskiy - Aug. 19, 2013, 3:21 p.m.
On Mon, 2013-08-19 at 08:48 +0200, Richard Weinberger wrote:
> 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()).
> 
> Cc: <stable@vger.kernel.org> # 3.7.x
> Signed-off-by: Richard Weinberger <richard@nod.at>

Pushed to linux-ubi.git, thanks.

And special thanks for taking care about Ccing -stable.

Patch

diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c
index 5df49d3..c95bfb1 100644
--- a/drivers/mtd/ubi/wl.c
+++ b/drivers/mtd/ubi/wl.c
@@ -1069,6 +1069,9 @@  static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk,
 		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);