diff mbox

[MTD:UBI] Missing scrub when there is a bit-flip

Message ID 1322655222-28348-2-git-send-email-bparekh@nvidia.com
State New, archived
Headers show

Commit Message

Bhavesh Parekh Nov. 30, 2011, 12:13 p.m. UTC
Under some cases, when scrubbing the PEB if we didnot get the lock on
the PEB it fails to scrub. Add that PEB again to the scrub list

Signed-off-by: Bhavesh Parekh <bparekh@nvidia.com>
---
 drivers/mtd/ubi/eba.c |    2 +-
 drivers/mtd/ubi/ubi.h |    3 +++
 drivers/mtd/ubi/wl.c  |    5 ++++-
 3 files changed, 8 insertions(+), 2 deletions(-)

Comments

Artem Bityutskiy Nov. 30, 2011, 12:33 p.m. UTC | #1
On Wed, 2011-11-30 at 17:43 +0530, Bhavesh Parekh wrote:
> Under some cases, when scrubbing the PEB if we didnot get the lock on
> the PEB it fails to scrub. Add that PEB again to the scrub list
> 
> Signed-off-by: Bhavesh Parekh <bparekh@nvidia.com>

I think we need to send it to -stable as well. Could you please confirm
that you verified that this patch solves the issue you reported - I ask
this to make double sure we are sending a good patch to the stable tree.

Thanks!
Artem Bityutskiy Dec. 4, 2011, 2:09 p.m. UTC | #2
On Wed, 2011-11-30 at 17:43 +0530, Bhavesh Parekh wrote:
> Under some cases, when scrubbing the PEB if we didnot get the lock on
> the PEB it fails to scrub. Add that PEB again to the scrub list
> 
> Signed-off-by: Bhavesh Parekh <bparekh@nvidia.com>

Pushed to ubi-2.6.git with minor amendments, but please, do confirm that
you verify that this patch fixes the issue you described.

Thanks!
Bhavesh Parekh Dec. 5, 2011, 5:59 a.m. UTC | #3
Artem,

Currently we have K36 setup with most of the critical ubi fixes in it. Verified that this patch fixes the mentioned issue.
Also we have K39 tree and I am planning to verify the this issue in that tree as well after porting the change and fixes from the ubi tree.

Thanks!
Bhavesh

nvpublic

>-----Original Message-----
>From: Artem Bityutskiy [mailto:dedekind1@gmail.com]
>Sent: Sunday, December 04, 2011 7:40 PM
>To: Bhavesh Parekh
>Cc: linux-mtd@lists.infradead.org
>Subject: Re: [PATCH] [MTD:UBI] Missing scrub when there is a bit-flip
>
>* PGP Signed by an unknown key
>
>On Wed, 2011-11-30 at 17:43 +0530, Bhavesh Parekh wrote:
>> Under some cases, when scrubbing the PEB if we didnot get the lock on
>> the PEB it fails to scrub. Add that PEB again to the scrub list
>>
>> Signed-off-by: Bhavesh Parekh <bparekh@nvidia.com>
>
>Pushed to ubi-2.6.git with minor amendments, but please, do confirm that
>you verify that this patch fixes the issue you described.
>
>Thanks!
>
>--
>Best Regards,
>Artem Bityutskiy
>
>* Unknown Key
>* 0x7DC2A2B4
Artem Bityutskiy Dec. 5, 2011, 6:51 a.m. UTC | #4
On Mon, 2011-12-05 at 11:29 +0530, Bhavesh Parekh wrote:
> Artem,
> 
> Currently we have K36 setup with most of the critical ubi fixes in it. Verified that this patch fixes the mentioned issue.
> Also we have K39 tree and I am planning to verify the this issue in that tree as well after porting the change and fixes from the ubi tree.

Thanks. I've added CC to stable in the commit message.

Artem.
diff mbox

Patch

diff --git a/drivers/mtd/ubi/eba.c b/drivers/mtd/ubi/eba.c
index fb7f19b..fb808d6 100644
--- a/drivers/mtd/ubi/eba.c
+++ b/drivers/mtd/ubi/eba.c
@@ -1033,7 +1033,7 @@  int ubi_eba_copy_leb(struct ubi_device *ubi, int from, int to,
 	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/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index dc64c76..15aba00 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -120,6 +120,8 @@  enum {
  *                     PEB
  * MOVE_CANCEL_BITFLIPS: canceled because a bit-flip was detected in the
  *                       target PEB
+ * MOVE_RETRY: Retry scrubbing the given PEB, as we didnot got lock last-time on
+ *                it
  */
 enum {
 	MOVE_CANCEL_RACE = 1,
@@ -127,6 +129,7 @@  enum {
 	MOVE_TARGET_RD_ERR,
 	MOVE_TARGET_WR_ERR,
 	MOVE_CANCEL_BITFLIPS,
+	MOVE_RETRY,
 };
 
 /**
diff --git a/drivers/mtd/ubi/wl.c b/drivers/mtd/ubi/wl.c
index 42c684c..277c429 100644
--- a/drivers/mtd/ubi/wl.c
+++ b/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) {
 			/*