Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8beeb3bb authored by Shmulik Ladkani's avatar Shmulik Ladkani Committed by Artem Bityutskiy
Browse files

UBI: introduce new bad PEB limit



Introduce 'ubi->bad_peb_limit', which specifies an upper limit of PEBs
UBI expects to go bad.  Currently, it is initialized to a fixed percentage
of total PEBs in the UBI device (configurable via CONFIG_MTD_UBI_BEB_LIMIT).

The 'bad_peb_limit' is intended to be used for calculating the amount of PEBs
UBI needs to reserve for bad eraseblock handling.

Artem: minor amendments.

Signed-off-by: default avatarShmulik Ladkani <shmulik.ladkani@gmail.com>
Signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@linux.intel.com>
parent afe7d12b
Loading
Loading
Loading
Loading
+19 −7
Original line number Original line Diff line number Diff line
@@ -34,13 +34,25 @@ config MTD_UBI_BEB_RESERVE
	help
	help
	  If the MTD device admits of bad eraseblocks (e.g. NAND flash), UBI
	  If the MTD device admits of bad eraseblocks (e.g. NAND flash), UBI
	  reserves some amount of physical eraseblocks to handle new bad
	  reserves some amount of physical eraseblocks to handle new bad
	  eraseblocks. For example, if a flash physical eraseblock becomes bad,
	  eraseblocks. When a physical eraseblock becomes bad, UBI uses these
	  UBI uses these reserved physical eraseblocks to relocate the bad one.
	  reserved physical eraseblocks to relocate the bad one. This
	  This option specifies how many physical eraseblocks will be reserved
	  configuration option specifies how many physical eraseblocks will be
	  for bad eraseblock handling (percents of total number of good flash
	  reserved for bad eraseblock handling (percents of total number of
	  eraseblocks). If the underlying flash does not admit of bad
	  good physical eraseblocks on this MTD partition). If the underlying
	  eraseblocks (e.g. NOR flash), this value is ignored and nothing is
	  flash does not admit of bad eraseblocks (e.g. NOR flash), this value
	  reserved. Leave the default value if unsure.
	  is ignored and nothing is reserved. Leave the default value if
	  unsure.

config MTD_UBI_BEB_LIMIT
	int "Percentage of maximum expected bad eraseblocks"
	default 2
	range 0 25
	help
	  This option specifies the maximum bad physical eraseblocks UBI
	  expects on the UBI device (percents of total number of physical
	  eraseblocks on this MTD partition). If the underlying flash does not
	  admit of bad eraseblocks (e.g. NOR flash), this value is ignored.
	  Leave the default value if unsure.


config MTD_UBI_GLUEBI
config MTD_UBI_GLUEBI
	tristate "MTD devices emulation driver (gluebi)"
	tristate "MTD devices emulation driver (gluebi)"
+11 −1
Original line number Original line Diff line number Diff line
@@ -607,8 +607,18 @@ static int io_init(struct ubi_device *ubi)
	ubi->peb_count  = mtd_div_by_eb(ubi->mtd->size, ubi->mtd);
	ubi->peb_count  = mtd_div_by_eb(ubi->mtd->size, ubi->mtd);
	ubi->flash_size = ubi->mtd->size;
	ubi->flash_size = ubi->mtd->size;


	if (mtd_can_have_bb(ubi->mtd))
	if (mtd_can_have_bb(ubi->mtd)) {
		ubi->bad_allowed = 1;
		ubi->bad_allowed = 1;
		if (CONFIG_MTD_UBI_BEB_LIMIT > 0) {
			int percent = CONFIG_MTD_UBI_BEB_LIMIT;
			int limit = mult_frac(ubi->peb_count, percent, 100);

			/* Round it up */
			if (mult_frac(limit, 100, percent) < ubi->peb_count)
				limit += 1;
			ubi->bad_peb_limit = limit;
		}
	}


	if (ubi->mtd->type == MTD_NORFLASH) {
	if (ubi->mtd->type == MTD_NORFLASH) {
		ubi_assert(ubi->mtd->writesize == 1);
		ubi_assert(ubi->mtd->writesize == 1);
+2 −0
Original line number Original line Diff line number Diff line
@@ -363,6 +363,7 @@ struct ubi_wl_entry;
 * @flash_size: underlying MTD device size (in bytes)
 * @flash_size: underlying MTD device size (in bytes)
 * @peb_count: count of physical eraseblocks on the MTD device
 * @peb_count: count of physical eraseblocks on the MTD device
 * @peb_size: physical eraseblock size
 * @peb_size: physical eraseblock size
 * @bad_peb_limit: top limit of expected bad physical eraseblocks
 * @bad_peb_count: count of bad physical eraseblocks
 * @bad_peb_count: count of bad physical eraseblocks
 * @good_peb_count: count of good physical eraseblocks
 * @good_peb_count: count of good physical eraseblocks
 * @corr_peb_count: count of corrupted physical eraseblocks (preserved and not
 * @corr_peb_count: count of corrupted physical eraseblocks (preserved and not
@@ -410,6 +411,7 @@ struct ubi_device {
	int avail_pebs;
	int avail_pebs;
	int beb_rsvd_pebs;
	int beb_rsvd_pebs;
	int beb_rsvd_level;
	int beb_rsvd_level;
	int bad_peb_limit;


	int autoresize_vol_id;
	int autoresize_vol_id;
	int vtbl_slots;
	int vtbl_slots;