/branches/18.06.1/target/linux/generic/pending-4.14/494-mtd-ubi-add-EOF-marker-support.patch |
@@ -0,0 +1,60 @@ |
From: Gabor Juhos <juhosg@openwrt.org> |
Subject: mtd: add EOF marker support to the UBI layer |
|
Signed-off-by: Gabor Juhos <juhosg@openwrt.org> |
--- |
drivers/mtd/ubi/attach.c | 25 ++++++++++++++++++++++--- |
drivers/mtd/ubi/ubi.h | 1 + |
2 files changed, 23 insertions(+), 3 deletions(-) |
|
--- a/drivers/mtd/ubi/attach.c |
+++ b/drivers/mtd/ubi/attach.c |
@@ -939,6 +939,13 @@ static bool vol_ignored(int vol_id) |
#endif |
} |
|
+static bool ec_hdr_has_eof(struct ubi_ec_hdr *ech) |
+{ |
+ return ech->padding1[0] == 'E' && |
+ ech->padding1[1] == 'O' && |
+ ech->padding1[2] == 'F'; |
+} |
+ |
/** |
* scan_peb - scan and process UBI headers of a PEB. |
* @ubi: UBI device description object |
@@ -971,9 +978,21 @@ static int scan_peb(struct ubi_device *u |
return 0; |
} |
|
- err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); |
- if (err < 0) |
- return err; |
+ if (!ai->eof_found) { |
+ err = ubi_io_read_ec_hdr(ubi, pnum, ech, 0); |
+ if (err < 0) |
+ return err; |
+ |
+ if (ec_hdr_has_eof(ech)) { |
+ pr_notice("UBI: EOF marker found, PEBs from %d will be erased\n", |
+ pnum); |
+ ai->eof_found = true; |
+ } |
+ } |
+ |
+ if (ai->eof_found) |
+ err = UBI_IO_FF_BITFLIPS; |
+ |
switch (err) { |
case 0: |
break; |
--- a/drivers/mtd/ubi/ubi.h |
+++ b/drivers/mtd/ubi/ubi.h |
@@ -785,6 +785,7 @@ struct ubi_attach_info { |
int mean_ec; |
uint64_t ec_sum; |
int ec_count; |
+ bool eof_found; |
struct kmem_cache *aeb_slab_cache; |
struct ubi_ec_hdr *ech; |
struct ubi_vid_io_buf *vidb; |