| ubi_write#(VOLID, LNUM, OFFSET, N0, N, BUF, PAGESIZE; VOLS, WLARRAY, ERASEQ, BFLIPSET, VTBLPNUM, SQNUM, APEBS; ERR) {if VOLID ∈ VOLS ∧ LNUM < # VOLS[VOLID] ∧ OFFSET + N ≤ LEB_SIZE ∧ N0 + N ≤ # BUF ∧ is-aligned(N, EB_PAGE_SIZE) ∧ is-aligned(OFFSET, EB_PAGE_SIZE) ∧ (VOLS[VOLID][LNUM] ≠ unmapped → APEBS[VOLS[VOLID][LNUM].pnum].fill ≤ OFFSET) then let EBAENT = VOLS[VOLID][LNUM] in if EBAENT = unmapped then ubi_write_multiple#(VOLID, LNUM, OFFSET, N0, N, BUF, BFLIPSET, VTBLPNUM; VOLS, WLARRAY, ERASEQ, SQNUM, APEBS; ERR) else if N ≠ 0 then {aubi_io_write_data#(EBAENT.pnum, OFFSET, N0, N, BUF; APEBS; ERR); if ERR ≠ ESUCCESS then {debug#("ubi: failed to write to PEB " + EBAENT.pnum.toString); let BUF0 = mkbuf(OFFSET + N), BITFLIPS = ? in {aubi_io_read_data#(EBAENT.pnum, 0, 0, OFFSET, APEBS; BUF0; BITFLIPS, ERR); if ERR = ESUCCESS then {BUF0 := copy(BUF, N0, BUF0, OFFSET, N); debug#("ubi: moving data from PEB " + EBAENT.pnum.toString); ubi_change# (VOLID, LNUM, OFFSET + N, BUF0, PAGESIZE; VOLS, WLARRAY, ERASEQ, BFLIPSET, VTBLPNUM, SQNUM, APEBS; ERR)} else debug#("ubi: failed to read data from PEB " + EBAENT.pnum.toString)}}} else ERR := ESUCCESS else abort } |