| isbuf ↔ false, adr0 = @(0, 0, 0), avol = fill(mkavolume(m3), unmapped), bleb = nobuffer, err = ESUCCESS, err = err0, log0 = [], lpt = fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)), lpt0 = fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)), m0 = m6, ns = ∅, err = ESUCCESS → synced(avol) ∧ awbuf-inv(avol, bleb) ∧ # lpt = # avol, ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ ⟪if err ≠ ESUCCESS then debug#("persistence: wbuf format failed") else {awbuf_get_leb_size#(adr0, m0, log0, avol, lpt, ns, bleb, isbuf; ; m); log1 := []; persistence_create_freelist#(lpt0; freelist); gc_heap_empty#(; gch)}⟫ ( ( err = ESUCCESS → ⟨apersistence_format#(m3, LEB_SIZE, m6; ; adr1, istore1, istore2, ginval, gstore1, gstore2, log2, maxino, ns2, pstate0, isbuf1, err1)⟩ ( abs-istore(avol, lpt0, istore1) ∧ abs-gstore(avol, lpt0, gstore1, ginval) ∧ adr1 = adr0 ∧ maxino = m0 ∧ log2 = log1 ∧ ginval < # lpt0 ∧ ns2 = ns ∧ flash-lpt-cons(lpt, istore2, gstore2) ∧ (isbuf1 → synced(avol)) ∧ (pstate0 = unbuffered → bleb = nobuffer) ∧ (pstate0 = readonly ↔ isbuf) ∧ (pstate0 ≠ unbuffered ∧ pstate0 ≠ readonly → bleb = buffered(pstate0.lnum)) ∧ ESUCCESS = err1)) ∧ ( err ≠ ESUCCESS → (∀ adr, istore, istore0, ns, gstore, gstore0, log, m, ns0, pstate, isbuf. ⟨apersistence_format# (m3, LEB_SIZE, m6; ; adr1, istore1, istore2, ginval, gstore1, gstore2, log2, maxino, ns2, pstate0, isbuf1, err1)⟩ ( adr = adr1 ∧ istore = istore1 ∧ istore0 = istore2 ∧ ns = ginval ∧ gstore = gstore1 ∧ gstore0 = gstore2 ∧ log = log2 ∧ m = maxino ∧ ns0 = ns2 ∧ pstate = pstate0 ∧ (isbuf ↔ isbuf1) ∧ err = err1)))) |
isbuf ↔ false, adr0 = @(0, 0, 0), avol = fill(mkavolume(m3), unmapped), bleb = nobuffer, err = err0, err = ESUCCESS, log0 = [], lpt = fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)), lpt0 = fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)), m0 = m6, ns = ∅, err = ESUCCESS → synced(avol) ∧ awbuf-inv(avol, bleb) ∧ # lpt = # avol, ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ ⟪awbuf_get_leb_size#(adr0, m0, log0, avol, lpt, ns, bleb, isbuf; ; m); log1 := []; persistence_create_freelist#(lpt0; freelist); gc_heap_empty#(; gch)⟫ ( ( err = ESUCCESS → ⟨apersistence_format#(m3, LEB_SIZE, m6; ; adr1, istore1, istore2, ginval, gstore1, gstore2, log2, maxino, ns2, pstate0, isbuf1, err1)⟩ ( abs-istore(avol, lpt0, istore1) ∧ abs-gstore(avol, lpt0, gstore1, ginval) ∧ adr1 = adr0 ∧ maxino = m0 ∧ log2 = log1 ∧ ginval < # lpt0 ∧ ns2 = ns ∧ flash-lpt-cons(lpt, istore2, gstore2) ∧ (isbuf1 → synced(avol)) ∧ (pstate0 = unbuffered → bleb = nobuffer) ∧ (pstate0 = readonly ↔ isbuf) ∧ (pstate0 ≠ unbuffered ∧ pstate0 ≠ readonly → bleb = buffered(pstate0.lnum)) ∧ ESUCCESS = err1)) ∧ ( err ≠ ESUCCESS → (∀ adr, istore, istore0, ns, gstore, gstore0, log, m, ns0, pstate, isbuf. ⟨apersistence_format# (m3, LEB_SIZE, m6; ; adr1, istore1, istore2, ginval, gstore1, gstore2, log2, maxino, ns2, pstate0, isbuf1, err1)⟩ ( adr = adr1 ∧ istore = istore1 ∧ istore0 = istore2 ∧ ns = ginval ∧ gstore = gstore1 ∧ gstore0 = gstore2 ∧ log = log2 ∧ m = maxino ∧ ns0 = ns2 ∧ pstate = pstate0 ∧ (isbuf ↔ isbuf1) ∧ err = err1))))