| avol = fill(mkavolume(m3), unmapped), err = err0, err = ESUCCESS, lpt = fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)), ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ [ns := ∅; bleb := nobuffer; isbuf := false] ( (err = ESUCCESS → synced(avol) ∧ awbuf-inv(avol, bleb) ∧ # lpt = # avol) → ⟪lpt0 := fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)); log0 := [], m0 := m6, adr0 := @(0, 0, 0); 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))))) |
avol = fill(mkavolume(m3), unmapped), err = ESUCCESS, err = err0, lpt = fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)), ns = ∅, ⌊err0⌋ ∨ err0 = ESUCCESS ⊦ [bleb := nobuffer; isbuf := false] ( (err = ESUCCESS → synced(avol) ∧ awbuf-inv(avol, bleb) ∧ # lpt = # avol) → ⟪lpt0 := fill(mklparray(m3), mklp(0, 0, LP_FREE, 0)); log0 := [], m0 := m6, adr0 := @(0, 0, 0); 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)))))