| 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 |
| @@ -926,6 +926,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 |
| @@ -958,9 +965,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 |
| @@ -780,6 +780,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; |