ubi: fastmap: erase_block: Get erase counter from wl_entry rather than flash
authorZhihao Cheng <chengzhihao1@huawei.com>
Mon, 28 Aug 2023 06:38:35 +0000 (14:38 +0800)
committerRichard Weinberger <richard@nod.at>
Sat, 28 Oct 2023 20:32:58 +0000 (22:32 +0200)
Just like sync_erase() does, getting erase counter from wl_entry is
faster than reading from flash.

Signed-off-by: Zhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: Richard Weinberger <richard@nod.at>
drivers/mtd/ubi/fastmap.c

index f8c230acc55e744e8fad5d200217bd31aac69f52..05ecdc0493434984e66f39374b5f66d61f91ae68 100644 (file)
@@ -1399,36 +1399,27 @@ out:
  */
 static int erase_block(struct ubi_device *ubi, struct ubi_wl_entry *e)
 {
-       int ret;
+       int err;
        struct ubi_ec_hdr *ec_hdr;
-       long long ec;
+       long long ec = e->ec;
 
        ec_hdr = kzalloc(ubi->ec_hdr_alsize, GFP_KERNEL);
        if (!ec_hdr)
                return -ENOMEM;
 
-       ret = ubi_io_read_ec_hdr(ubi, e->pnum, ec_hdr, 0);
-       if (ret < 0)
-               goto out;
-       else if (ret && ret != UBI_IO_BITFLIPS) {
-               ret = -EINVAL;
-               goto out;
-       }
-
-       ret = ubi_io_sync_erase(ubi, e->pnum, 0);
-       if (ret < 0)
+       err = ubi_io_sync_erase(ubi, e->pnum, 0);
+       if (err < 0)
                goto out;
 
-       ec = be64_to_cpu(ec_hdr->ec);
-       ec += ret;
+       ec += err;
        if (ec > UBI_MAX_ERASECOUNTER) {
-               ret = -EINVAL;
+               err = -EINVAL;
                goto out;
        }
 
        ec_hdr->ec = cpu_to_be64(ec);
-       ret = ubi_io_write_ec_hdr(ubi, e->pnum, ec_hdr);
-       if (ret < 0)
+       err = ubi_io_write_ec_hdr(ubi, e->pnum, ec_hdr);
+       if (err < 0)
                goto out;
 
        e->ec = ec;
@@ -1439,7 +1430,7 @@ static int erase_block(struct ubi_device *ubi, struct ubi_wl_entry *e)
 
 out:
        kfree(ec_hdr);
-       return ret;
+       return err;
 }
 
 /**