| ubi_recover#(APEBS; VOLS, WLARRAY, ERASEQ, BFLIPSET, VTBLPNUM, SQNUM, LEBSIZE; PAGESIZE, ERR) {aubi_io_recovery#(APEBS); VOLS := ∅; aubi_io_get_leb_size#(APEBS; ; LEBSIZE); aubi_io_get_page_size#(APEBS; ; PAGESIZE); let RECS = ∅, INVALIDECS = [], VALIDCOUNT = 0, VALIDECSUM = 0 in {ubi_scan_all#(LEBSIZE, APEBS; RECS, WLARRAY, ERASEQ, BFLIPSET, SQNUM; VALIDCOUNT, VALIDECSUM, INVALIDECS, ERR); if ¬ VTBL_VOLID × VTBL_LNUM ∈ RECS then ERR := EINVAL; if ERR = ESUCCESS then let BUF = mkbuf(LEBSIZE), BITFLIPS = ? in {VTBLPNUM := RECS[VTBL_VOLID × VTBL_LNUM].pnum; aubi_io_read_data#(VTBLPNUM, 0, 0, LEBSIZE, APEBS; BUF; BITFLIPS, ERR); if BITFLIPS then BFLIPSET := BFLIPSET ++ VTBLPNUM; if ERR = ESUCCESS then let VTBL = ? in {decode_vtbl#(BUF; ; VTBL, ERR); if ERR = ESUCCESS then {ubi_init_vols_sizes#(RECS, WLARRAY, APEBS; VTBL, VOLS); ubi_init_vols_mappings#(VTBLPNUM, APEBS; RECS, VOLS, WLARRAY, ERASEQ, BFLIPSET); let N = (VALIDCOUNT = 0 ⊃ 0;VALIDECSUM / VALIDCOUNT) in ubi_fix_ecs#(N; INVALIDECS, WLARRAY)}}}} } |