From d614fc1e3434ff07fd13c2bba3a7c814ee686bdb Mon Sep 17 00:00:00 2001 From: Bhavesh Parekh Date: Wed, 30 Nov 2011 17:43:42 +0530 Subject: [PATCH] --- yaml --- r: 282927 b: refs/heads/master c: e801e128b2200c40a0ec236cf2330b2586b6e05a h: refs/heads/master i: 282925: b50a179a646d3b2831d55c5d915bf4fa7ed356b9 282923: 27d4aa60b9139feec10e5792b4eca6973c0cad21 282919: d41d22bd1e90ad4b4094f242d2a48b920e267d50 282911: 2820ab4b11c42af363a460b32b31a3dfc034b0e9 v: v3 --- [refs] | 2 +- trunk/drivers/mtd/ubi/eba.c | 6 ++++-- trunk/drivers/mtd/ubi/ubi.h | 2 ++ trunk/drivers/mtd/ubi/wl.c | 5 ++++- 4 files changed, 11 insertions(+), 4 deletions(-) diff --git a/[refs] b/[refs] index 1e002b777da4..6d6637c8adaa 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: eaecf43a6970c8d0ef54a31427c82a99e4863fe8 +refs/heads/master: e801e128b2200c40a0ec236cf2330b2586b6e05a diff --git a/trunk/drivers/mtd/ubi/eba.c b/trunk/drivers/mtd/ubi/eba.c index fb7f19b62d91..cd26da8ad225 100644 --- a/trunk/drivers/mtd/ubi/eba.c +++ b/trunk/drivers/mtd/ubi/eba.c @@ -1028,12 +1028,14 @@ int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to, * 'ubi_wl_put_peb()' function on the @ubi->move_mutex. In turn, we are * holding @ubi->move_mutex and go sleep on the LEB lock. So, if the * LEB is already locked, we just do not move it and return - * %MOVE_CANCEL_RACE, which means that UBI will re-try, but later. + * %MOVE_RETRY. Note, we do not return %MOVE_CANCEL_RACE here because + * we do not know the reasons of the contention - it may be just a + * normal I/O on this LEB, so we want to re-try. */ err = leb_write_trylock(ubi, vol_id, lnum); if (err) { dbg_wl("contention on LEB %d:%d, cancel", vol_id, lnum); - return MOVE_CANCEL_RACE; + return MOVE_RETRY; } /* diff --git a/trunk/drivers/mtd/ubi/ubi.h b/trunk/drivers/mtd/ubi/ubi.h index dc64c767fd21..d51d75d34446 100644 --- a/trunk/drivers/mtd/ubi/ubi.h +++ b/trunk/drivers/mtd/ubi/ubi.h @@ -120,6 +120,7 @@ enum { * PEB * MOVE_CANCEL_BITFLIPS: canceled because a bit-flip was detected in the * target PEB + * MOVE_RETRY: retry scrubbing the PEB */ enum { MOVE_CANCEL_RACE = 1, @@ -127,6 +128,7 @@ enum { MOVE_TARGET_RD_ERR, MOVE_TARGET_WR_ERR, MOVE_CANCEL_BITFLIPS, + MOVE_RETRY, }; /** diff --git a/trunk/drivers/mtd/ubi/wl.c b/trunk/drivers/mtd/ubi/wl.c index 42c684cf3688..277c429a138f 100644 --- a/trunk/drivers/mtd/ubi/wl.c +++ b/trunk/drivers/mtd/ubi/wl.c @@ -795,7 +795,10 @@ static int wear_leveling_worker(struct ubi_device *ubi, struct ubi_work *wrk, protect = 1; goto out_not_moved; } - + if (err == MOVE_RETRY) { + scrubbing = 1; + goto out_not_moved; + } if (err == MOVE_CANCEL_BITFLIPS || err == MOVE_TARGET_WR_ERR || err == MOVE_TARGET_RD_ERR) { /*