| persistence_sync#(LEBSIZE, WROOTADR, WMAXINO, WLOG, WLPT, WORPHANS, WBUFLEB; LPT, WVOL, AROFS; ERR) {if WBUFLEB.isbuf? ∧ ¬ AROFS → WBUFLEB.leb < # LPT ∧ LPT[WBUFLEB.leb].size ≤ LEB_SIZE ∧ WVOL[WBUFLEB.leb].mapped? ∧ LPT[WBUFLEB.leb].size = # WVOL[WBUFLEB.leb].data ∧ LPT[WBUFLEB.leb].flags ≠ LP_FREE ∧ is-aligned(LPT[WBUFLEB.leb].size, 2 * NODE_HEADER_SIZE) then {ERR := ESUCCESS; let WBUFLEB0 = ?, AROFS0 = ?, PAGESIZE = ? in {awbuf_get_buf#(WROOTADR, WMAXINO, WLOG, WVOL, WLPT, WORPHANS, WBUFLEB, AROFS; ; WBUFLEB0); awbuf_is_readonly#(WROOTADR, WMAXINO, WLOG, WVOL, WLPT, WORPHANS, WBUFLEB, AROFS; ; AROFS0); awbuf_get_page_size#(WROOTADR, WMAXINO, WLOG, WVOL, WLPT, WORPHANS, WBUFLEB, AROFS; ; PAGESIZE); if ¬ AROFS0 then if WBUFLEB0.isbuf? then let OFFSET = LPT[WBUFLEB0.leb].size in if ¬ is-aligned(OFFSET, PAGESIZE) then let SIZE = PAGESIZE - OFFSET % PAGESIZE in let BUF = mkbuf(SIZE) in {persistence_encode_padding_node#(; BUF; ERR); if ERR = ESUCCESS then {awbuf_write_buf#(# BUF, BUF, WROOTADR, WMAXINO, WLOG, WLPT, WORPHANS, WBUFLEB; WVOL, AROFS; ERR); if ERR = ESUCCESS then LPT[WBUFLEB0.leb].size := LPT[WBUFLEB0.leb].size + SIZE else {debug#("persistence: flushing of LEB " + WBUFLEB0.leb.toString + " failed"); LPT[WBUFLEB0.leb].size := LEBSIZE; awbuf_enter_readonly#(WROOTADR, WMAXINO, WLOG, WVOL, WLPT, WORPHANS, WBUFLEB; ; AROFS)}} else {debug#("persistence: could not encode padding node"); awbuf_enter_readonly#(WROOTADR, WMAXINO, WLOG, WVOL, WLPT, WORPHANS, WBUFLEB; ; AROFS)}} else ERR := EROFS}} else abort } |