[PATCH] ubi: Remove ubi_io_is_bad call from scan_peb

Hyunchul Lee hyc.lee at gmail.com
Mon Sep 25 21:54:57 PDT 2017


From: Hyunchul Lee <cheol.lee at lge.com>

When erase count and volume identifier headers are read,
ubi_io_is_bad is called. So instead of calling ubi_io_is_bad
from scan_peb, use the result.

this patch reduces the attach time by about 15% in my
environment.

ARMv7 1GHZ based board, 66.8MiB MTD partition
                before          after
attach time     308.365 usec    257.100 usec

Signed-off-by: Hyunchul Lee <cheol.lee at lge.com>
---
 drivers/mtd/ubi/attach.c | 15 ++++++---------
 drivers/mtd/ubi/io.c     |  9 ++++++---
 drivers/mtd/ubi/ubi.h    |  2 ++
 3 files changed, 14 insertions(+), 12 deletions(-)

diff --git a/drivers/mtd/ubi/attach.c b/drivers/mtd/ubi/attach.c
index 93ceea4..07b9162 100644
--- a/drivers/mtd/ubi/attach.c
+++ b/drivers/mtd/ubi/attach.c
@@ -962,15 +962,6 @@ static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
 
 	dbg_bld("scan PEB %d", pnum);
 
-	/* Skip bad physical eraseblocks */
-	err = ubi_io_is_bad(ubi, pnum);
-	if (err < 0)
-		return err;
-	else if (err) {
-		ai->bad_peb_count += 1;
-		return 0;
-	}
-
 	err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0);
 	if (err < 0)
 		return err;
@@ -999,6 +990,9 @@ static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
 		ec = UBI_UNKNOWN;
 		bitflips = 1;
 		break;
+	case UBI_IO_BAD_BLK:
+		ai->bad_peb_count += 1;
+		return 0;
 	default:
 		ubi_err(ubi, "'ubi_io_read_ec_hdr()' returned unknown code %d",
 			err);
@@ -1136,6 +1130,9 @@ static int scan_peb(struct ubi_device *ubi, struct ubi_attach_info *ai,
 		if (err)
 			return err;
 		goto adjust_mean_ec;
+	case UBI_IO_BAD_BLK:
+		ai->bad_peb_count += 1;
+		return 0;
 	default:
 		ubi_err(ubi, "'ubi_io_read_vid_hdr()' returned unknown code %d",
 			err);
diff --git a/drivers/mtd/ubi/io.c b/drivers/mtd/ubi/io.c
index 8290432..ae52e7e 100644
--- a/drivers/mtd/ubi/io.c
+++ b/drivers/mtd/ubi/io.c
@@ -117,6 +117,7 @@ static int self_check_write(struct ubi_device *ubi, const void *buf, int pnum,
  * o %UBI_IO_BITFLIPS if all the requested data were successfully read, but
  *   correctable bit-flips were detected; this is harmless but may indicate
  *   that this eraseblock may become bad soon (but do not have to);
+ * o %UBI_IO_BAD_BLK if the erabse block is bad
  * o %-EBADMSG if the MTD subsystem reported about data integrity problems, for
  *   example it can be an ECC error in case of NAND; this most probably means
  *   that the data is corrupted;
@@ -137,7 +138,9 @@ int ubi_io_read(const struct ubi_device *ubi, void *buf, int pnum, int offset,
 	ubi_assert(len > 0);
 
 	err = self_check_not_bad(ubi, pnum);
-	if (err)
+	if (err == -EBADSLT)
+		return UBI_IO_BAD_BLK;
+	else if (err)
 		return err;
 
 	/*
@@ -1131,7 +1134,7 @@ int ubi_io_write_vid_hdr(struct ubi_device *ubi, int pnum,
  * @ubi: UBI device description object
  * @pnum: physical eraseblock number to check
  *
- * This function returns zero if the physical eraseblock is good, %-EINVAL if
+ * This function returns zero if the physical eraseblock is good, %-EBADSLT if
  * it is bad and a negative error code if an error occurred.
  */
 static int self_check_not_bad(const struct ubi_device *ubi, int pnum)
@@ -1147,7 +1150,7 @@ static int self_check_not_bad(const struct ubi_device *ubi, int pnum)
 
 	ubi_err(ubi, "self-check failed for PEB %d", pnum);
 	dump_stack();
-	return err > 0 ? -EINVAL : err;
+	return err > 0 ? -EBADSLT : err;
 }
 
 /**
diff --git a/drivers/mtd/ubi/ubi.h b/drivers/mtd/ubi/ubi.h
index 5fe6265..5c5207d 100644
--- a/drivers/mtd/ubi/ubi.h
+++ b/drivers/mtd/ubi/ubi.h
@@ -107,6 +107,7 @@
  *                         data integrity error reported by the MTD driver
  *                         (uncorrectable ECC error in case of NAND)
  * UBI_IO_BITFLIPS: bit-flips were detected and corrected
+ * UBI_IO_BAD_BLK: bad erase block
  *
  * Note, it is probably better to have bit-flip and ebadmsg as flags which can
  * be or'ed with other error code. But this is a big change because there are
@@ -118,6 +119,7 @@ enum {
 	UBI_IO_BAD_HDR,
 	UBI_IO_BAD_HDR_EBADMSG,
 	UBI_IO_BITFLIPS,
+	UBI_IO_BAD_BLK,
 };
 
 /*
-- 
1.9.1




More information about the linux-mtd mailing list