UBI: introduce flash dump helper
Useful for debugging problems, compiled in only if UBI debugging is enabled. This patch also makes the UBI writing function dump the flash if it fails to write. Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
This commit is contained in:
parent
758d8e4634
commit
867996b15c
|
@ -196,4 +196,36 @@ void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req)
|
||||||
printk(KERN_DEBUG "\t1st 16 characters of name: %s\n", nm);
|
printk(KERN_DEBUG "\t1st 16 characters of name: %s\n", nm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ubi_dbg_dump_flash - dump a region of flash.
|
||||||
|
* @ubi: UBI device description object
|
||||||
|
* @pnum: the physical eraseblock number to dump
|
||||||
|
* @offset: the starting offset within the physical eraseblock to dump
|
||||||
|
* @len: the length of the region to dump
|
||||||
|
*/
|
||||||
|
void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len)
|
||||||
|
{
|
||||||
|
int err;
|
||||||
|
size_t read;
|
||||||
|
void *buf;
|
||||||
|
loff_t addr = (loff_t)pnum * ubi->peb_size + offset;
|
||||||
|
|
||||||
|
buf = vmalloc(len);
|
||||||
|
if (!buf)
|
||||||
|
return;
|
||||||
|
err = ubi->mtd->read(ubi->mtd, addr, len, &read, buf);
|
||||||
|
if (err && err != -EUCLEAN) {
|
||||||
|
ubi_err("error %d while reading %d bytes from PEB %d:%d, "
|
||||||
|
"read %zd bytes", err, len, pnum, offset, read);
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
dbg_msg("dumping %d bytes of data from PEB %d, offset %d",
|
||||||
|
len, pnum, offset);
|
||||||
|
print_hex_dump(KERN_DEBUG, "", DUMP_PREFIX_OFFSET, 32, 1, buf, len, 1);
|
||||||
|
out:
|
||||||
|
vfree(buf);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_MTD_UBI_DEBUG */
|
#endif /* CONFIG_MTD_UBI_DEBUG */
|
||||||
|
|
|
@ -55,6 +55,7 @@ void ubi_dbg_dump_vtbl_record(const struct ubi_vtbl_record *r, int idx);
|
||||||
void ubi_dbg_dump_sv(const struct ubi_scan_volume *sv);
|
void ubi_dbg_dump_sv(const struct ubi_scan_volume *sv);
|
||||||
void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type);
|
void ubi_dbg_dump_seb(const struct ubi_scan_leb *seb, int type);
|
||||||
void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req);
|
void ubi_dbg_dump_mkvol_req(const struct ubi_mkvol_req *req);
|
||||||
|
void ubi_dbg_dump_flash(struct ubi_device *ubi, int pnum, int offset, int len);
|
||||||
|
|
||||||
#ifdef CONFIG_MTD_UBI_DEBUG_MSG
|
#ifdef CONFIG_MTD_UBI_DEBUG_MSG
|
||||||
/* General debugging messages */
|
/* General debugging messages */
|
||||||
|
@ -167,6 +168,7 @@ static inline int ubi_dbg_is_erase_failure(void)
|
||||||
#define ubi_dbg_dump_sv(sv) ({})
|
#define ubi_dbg_dump_sv(sv) ({})
|
||||||
#define ubi_dbg_dump_seb(seb, type) ({})
|
#define ubi_dbg_dump_seb(seb, type) ({})
|
||||||
#define ubi_dbg_dump_mkvol_req(req) ({})
|
#define ubi_dbg_dump_mkvol_req(req) ({})
|
||||||
|
#define ubi_dbg_dump_flash(ubi, pnum, offset, len) ({})
|
||||||
|
|
||||||
#define UBI_IO_DEBUG 0
|
#define UBI_IO_DEBUG 0
|
||||||
#define DBG_DISABLE_BGT 0
|
#define DBG_DISABLE_BGT 0
|
||||||
|
|
|
@ -269,6 +269,7 @@ int ubi_io_write(struct ubi_device *ubi, const void *buf, int pnum, int offset,
|
||||||
ubi_err("error %d while writing %d bytes to PEB %d:%d, written "
|
ubi_err("error %d while writing %d bytes to PEB %d:%d, written "
|
||||||
"%zd bytes", err, len, pnum, offset, written);
|
"%zd bytes", err, len, pnum, offset, written);
|
||||||
ubi_dbg_dump_stack();
|
ubi_dbg_dump_stack();
|
||||||
|
ubi_dbg_dump_flash(ubi, pnum, offset, len);
|
||||||
} else
|
} else
|
||||||
ubi_assert(written == len);
|
ubi_assert(written == len);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue