| ubi_write_once#(VOLID, LNUM, OFFSET, N0, N, BUF; VOLS, WLARRAY, ERASEQ, SQNUM, APEBS; ERR) {let PNUM = ? in {ubi_wl_get_peb#(; PNUM, WLARRAY, ERASEQ, APEBS; ERR); if ERR = ESUCCESS then let M = ? in {ubi_next_sqnum#(; SQNUM; M); aubi_io_write_vidhdr#(PNUM, avidhdr(VOLID, LNUM, M, 0, 0); APEBS; ERR); if ERR = ESUCCESS then {if N ≠ 0 then aubi_io_write_data#(PNUM, OFFSET, N0, N, BUF; APEBS; ERR); if ERR = ESUCCESS then {VOLS[VOLID][LNUM] := ⌜PNUM⌝ ; WLARRAY[PNUM].status := used} else ubi_wl_put_peb#(VOLID × LNUM, PNUM; WLARRAY, ERASEQ); skip} else ubi_wl_put_peb#(none, PNUM; WLARRAY, ERASEQ)}} } |