Commit 332873d6 authored by Artem Bityutskiy's avatar Artem Bityutskiy

UBI: allocate erase checking buffer on demand

Instead of using pre-allocated 'ubi->dbg_peb_buf' buffer in
'ubi_dbg_check_all_ff()', dynamically allocate it when needed. The
intend is to get rid of the pre-allocated 'ubi->dbg_peb_buf' buffer
completely. And the need for this arises because we want to change
to dynamic debugging control instead of compile-time control, i.e.,
we are going to kill the CONFIG_MTD_UBI_DEBUG_PARANOID Kconfig
option, which would mean that 'ubi->dbg_peb_buf' is always allocated,
which would be wasteful.

Thus, we are getting rid of 'ubi->dbg_peb_buf', and this is a
preparation for that.
signed-off-by: default avatarArtem Bityutskiy <Artem.Bityutskiy@nokia.com>
parent a7586743
...@@ -1387,35 +1387,40 @@ int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len) ...@@ -1387,35 +1387,40 @@ int ubi_dbg_check_all_ff(struct ubi_device *ubi, int pnum, int offset, int len)
{ {
size_t read; size_t read;
int err; int err;
void *buf;
loff_t addr = (loff_t)pnum * ubi->peb_size + offset; loff_t addr = (loff_t)pnum * ubi->peb_size + offset;
mutex_lock(&ubi->dbg_buf_mutex); buf = __vmalloc(len, GFP_KERNEL | GFP_NOFS, PAGE_KERNEL);
err = ubi->mtd->read(ubi->mtd, addr, len, &read, ubi->dbg_peb_buf); if (!buf) {
ubi_err("cannot allocate memory to check for 0xFFs");
return 0;
}
err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf);
if (err && err != -EUCLEAN) { if (err && err != -EUCLEAN) {
ubi_err("error %d while reading %d bytes from PEB %d:%d, " ubi_err("error %d while reading %d bytes from PEB %d:%d, "
"read %zd bytes", err, len, pnum, offset, read); "read %zd bytes", err, len, pnum, offset, read);
goto error; goto error;
} }
err = ubi_check_pattern(ubi->dbg_peb_buf, 0xFF, len); err = ubi_check_pattern(buf, 0xFF, len);
if (err == 0) { if (err == 0) {
ubi_err("flash region at PEB %d:%d, length %d does not " ubi_err("flash region at PEB %d:%d, length %d does not "
"contain all 0xFF bytes", pnum, offset, len); "contain all 0xFF bytes", pnum, offset, len);
goto fail; goto fail;
} }
mutex_unlock(&ubi->dbg_buf_mutex);
vfree(buf);
return 0; return 0;
fail: fail:
ubi_err("paranoid check failed for PEB %d", pnum); ubi_err("paranoid check failed for PEB %d", pnum);
ubi_msg("hex dump of the %d-%d region", offset, offset + len); ubi_msg("hex dump of the %d-%d region", offset, offset + len);
print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, buf, len, 1);
ubi->dbg_peb_buf, len, 1);
err = -EINVAL; err = -EINVAL;
error: error:
ubi_dbg_dump_stack(); ubi_dbg_dump_stack();
mutex_unlock(&ubi->dbg_buf_mutex); vfree(buf);
return err; 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