| # lpt = # avol, m0 = m, n0 = n, awbuf-inv(avol, bleb), n ≤ # buf, # avol[bleb.leb].data + n ≤ LEB_SIZE ⊦ ⟪if bleb ≠ nobuffer ∧ # avol[bleb.leb].data + n0 ≤ LEB_SIZE ∧ n0 ≤ # buf then if isbuf then err := EROFS else {fail_or_success#(; ; err); let m = bleb.leb in if err = ESUCCESS then avol[m] := mapped(avol[m].data + subarray(buf, 0, n0)) else { choose n with n ≠ 0 ∧ n < n0 ∧ is-aligned(# avol[m].data + n, EB_PAGE_SIZE) in avol[m] := mapped(avol[m].data + subarray(buf, 0, n)) ifnone skip or skip; isbuf := true}} else abort⟫ (awbuf-inv(avol, bleb) ∧ # lpt = # avol), bleb = nobuffer |
# lpt = # avol, m0 = m, n0 = n, awbuf-inv(avol, bleb), # avol[bleb.leb].data + n0 ≤ LEB_SIZE, n0 ≤ # buf, # avol[bleb.leb].data + n ≤ LEB_SIZE, n ≤ # buf, bleb ≠ nobuffer → avol[bleb.leb].mapped? ∧ bleb.leb < # avol ∧ bleb.isbuf? ⊦ ⟪if isbuf then err := EROFS else {fail_or_success#(; ; err); let m = bleb.leb in if err = ESUCCESS then avol[m] := mapped(avol[m].data + subarray(buf, 0, n0)) else { choose n with n ≠ 0 ∧ n < n0 ∧ is-aligned(# avol[m].data + n, EB_PAGE_SIZE) in avol[m] := mapped(avol[m].data + subarray(buf, 0, n)) ifnone skip or skip; isbuf := true}}⟫ (awbuf-inv(avol, bleb) ∧ # lpt = # avol), bleb = nobuffer
# lpt = # avol, m0 = m, n0 = n, awbuf-inv(avol, bleb), # avol[bleb.leb].data + n ≤ LEB_SIZE, n ≤ # buf, bleb ≠ nobuffer → avol[bleb.leb].mapped? ∧ bleb.leb < # avol ∧ bleb.isbuf? ⊦ ⟪abort⟫ (awbuf-inv(avol, bleb) ∧ # lpt = # avol), bleb = nobuffer, bleb ≠ nobuffer ∧ # avol[bleb.leb].data + n0 ≤ LEB_SIZE ∧ n0 ≤ # buf
# lpt = # avol, m0 = m, n0 = n, awbuf-inv(avol, bleb), # avol[bleb.leb].data + n ≤ LEB_SIZE, n ≤ # buf ⊦ bleb = nobuffer, avol[bleb.leb].mapped? ∧ bleb.leb < # avol ∧ bleb.isbuf?