UBI fastmap torture script
Subsystems (2)
Richard Weinberger
maintainerHi!
If you want to test UBI fastmap you can use my torture.sh script. Please adjust it to your needs (N, MTD device, UBI device, volume size).
WARNING: It erases the MTD device!
paranoia.diff is also very useful to catch errors.
It turns all ubi_asserts() into BUG() and adds an extra self check to detect duplicated PEBs.
Also bit flip emulation and all other UBI self-checks are enabled by default.
Have fun!
//richard
drivers/mtd/ubi/build.c +3 -0
@@ -928,6 +928,9 @@ int ubi_attach_mtd_dev(struct mtd_info *mtd, int ubi_num, int vid_hdr_offset)if (err) goto out_free; + ubi->dbg->chk_gen =1 ; + ubi->dbg->emulate_bitflips =1 ; + err =ubi_attach (ubi);if (err) {ubi_err ("failed to attach mtd%d, error %d" , mtd->index, err);
drivers/mtd/ubi/debug.h +1 -1
@@ -31,7 +31,7 @@ void ubi_dump_vid_hdr(const struct ubi_vid_hdr *vid_hdr);if (unlikely (!(expr))) { \printk (KERN_CRIT "UBI assert failed in %s at %u (pid %d)\n" , \ __func__, __LINE__, current->pid); \ -dump_stack (); \ +BUG (); \ } \ }while (0 )
drivers/mtd/ubi/wl.c +26 -4
@@ -1632,7 +1632,7 @@ int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai)int err, i, found_pebs =0 ;struct rb_node *rb1, *rb2;struct ubi_ainf_volume *av; -struct ubi_ainf_peb *aeb, *tmp; +struct ubi_ainf_peb *aeb, *tmp, *x;struct ubi_wl_entry *e; ubi->used = ubi->erroneous = ubi->free = ubi->scrub =RB_ROOT ;
@@ -1653,6 +1653,28 @@ int ubi_wl_init(struct ubi_device *ubi, struct ubi_attach_info *ai)INIT_LIST_HEAD (&ubi->pq[i]); ubi->pq_head =0 ; +ubi_rb_for_each_entry (rb1, av, &ai->volumes, rb) { +ubi_rb_for_each_entry (rb2, aeb, &av->root, u.rb) { +list_for_each_entry (x, &ai->erase, u.list) { +if (x->pnum == aeb->pnum) { +ubi_err ("PEB: %i is in used/scrub and erase!" , x->pnum); + } + } +list_for_each_entry (x, &ai->free, u.list) { +if (x->pnum == aeb->pnum) { +ubi_err ("PEB: %i is in used/scrub and free!" , x->pnum); + } + } + } + } +list_for_each_entry (aeb, &ai->erase, u.list) { +list_for_each_entry (x, &ai->free, u.list) { +if (x->pnum == aeb->pnum) { +ubi_err ("PEB: %i is in erase and free!" , x->pnum); + } + } + } +list_for_each_entry_safe (aeb, tmp, &ai->erase, u.list) {cond_resched ();
@@ -1819,7 +1841,7 @@ static int self_check_ec(struct ubi_device *ubi, int pnum, int ec)if (ec != read_ec && read_ec - ec >1 ) {ubi_err ("self-check failed for PEB %d" , pnum);ubi_err ("read EC is %lld, should be %d" , read_ec, ec); -dump_stack (); +BUG (); err =1 ; }else err =0 ;
@@ -1849,7 +1871,7 @@ static int self_check_in_wl_tree(const struct ubi_device *ubi,ubi_err ("self-check failed for PEB %d, EC %d, RB-tree %p " , e->pnum, e->ec, root); -dump_stack (); +BUG ();return -EINVAL ; }
@@ -1877,6 +1899,6 @@ static int self_check_in_pq(const struct ubi_device *ubi,ubi_err ("self-check failed for PEB %d, EC %d, Protect queue" , e->pnum, e->ec); -dump_stack (); +BUG ();return -EINVAL ; }