| # avol0 = # avol, # lpt0 = # avol, # buf = EB_PAGE_SIZE, bleb = bleb0, wbuf = mkwbuf(buf, m1, m3), abs(avol, bleb0, mkwbuf(buf, m1, m3), avol0, rofs), awbuf-inv(avol, bleb0), ebm-vol-inv(avol0), bleb0 ≠ nobuffer → bleb0.leb < # avol ∧ wbuf-cons(mkwbuf(buf, m1, m3), avol0[bleb0.leb], rofs), bleb0 = buffered(m) ∨ (bleb0 = nobuffer ∨ is-aligned(# avol[bleb0.leb].data, EB_PAGE_SIZE)) ∧ m < # avol ∧ avol[m].mapped? ∧ m0 = # avol[m].data ⊦ ⟪wbuf_move_buf#(m, m0, rofs, avol0; bleb0, wbuf; err)⟫ ⟨awbuf_move_buf#(m, m0, adr0, m2, plog0, avol, lpt0, ns0, rofs; bleb; err0)⟩ (abs(avol, bleb0, wbuf, avol0, rofs) ∧ bleb = bleb0 ∧ err = err0) |
# buf = EB_PAGE_SIZE, # lpt0 = # avol1, # avol0 = # avol1, avol = avol0, bleb = bleb0, bleb1 = bleb0, m = m4, m0 = m5, wbuf = mkwbuf(buf, m1, m3), abs(avol1, bleb0, mkwbuf(buf, m1, m3), avol0, rofs), awbuf-inv(avol1, bleb0), ebm-vol-inv(avol0), bleb0 ≠ nobuffer → bleb0.leb < # avol1 ∧ wbuf-cons(mkwbuf(buf, m1, m3), avol0[bleb0.leb], rofs), bleb0 = buffered(m5) ∨ (bleb0 = nobuffer ∨ is-aligned(# avol1[bleb0.leb].data, EB_PAGE_SIZE)) ∧ m5 < # avol1 ∧ avol1[m5].mapped? ∧ m4 = # avol1[m5].data ⊦ ⟪if ¬ rofs → bleb = buffered(m0) ∨ (bleb = nobuffer ∨ wbuf.nbytes = 0) ∧ m0 < # avol ∧ avol[m0].mapped? ∧ m = # avol[m0].data then if rofs then err := EROFS else {err := ESUCCESS; if bleb ≠ buffered(m0) then {bleb := buffered(m0); wbuf.offset := m; wbuf.nbytes := 0}} else abort⟫ ⟨awbuf_move_buf#(m5, m4, adr0, m2, plog0, avol1, lpt0, ns0, rofs; bleb1; err0)⟩ (abs(avol1, bleb, wbuf, avol0, rofs) ∧ bleb1 = bleb ∧ err = err0)
Used simplifier rules: wbuf_move_buf#(LNUM, OFFSET, ROFS, PVOL; BUFLEB, WBUF; ERR) {if ¬ ROFS → BUFLEB = buffered(LNUM) ∨ (BUFLEB = nobuffer ∨ WBUF.nbytes = 0) ∧ LNUM < # PVOL ∧ PVOL[LNUM].mapped? ∧ OFFSET = # PVOL[LNUM].data then if ROFS then ERR := EROFS else {ERR := ESUCCESS; if BUFLEB ≠ buffered(LNUM) then {BUFLEB := buffered(LNUM); WBUF.offset := OFFSET; WBUF.nbytes := 0}} else abort };