Commit 08a42678 authored by Zhihao Cheng's avatar Zhihao Cheng Committed by Richard Weinberger

ubi: fastmap: erase_block: Get erase counter from wl_entry rather than flash

Just like sync_erase() does, getting erase counter from wl_entry is
faster than reading from flash.
Signed-off-by: default avatarZhihao Cheng <chengzhihao1@huawei.com>
Signed-off-by: default avatarRichard Weinberger <richard@nod.at>
parent 4d18b5a5
......@@ -1399,36 +1399,27 @@ static int ubi_write_fastmap(struct ubi_device *ubi,
*/
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;
}
/**
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment