| ∃ lpt, log, orphans. persistence-io-inv(sb, logoff, avol, lpt, log, orphans), m = EB_PAGE_SIZE, m0 = LEB_SIZE, ebm-vol-inv(avol), # lpt + sb.main = # avol, ns = orphans, sb0 = sb, avol0 = avol ⊦ ⟪persistence_io_commit#(lpt, adr, m1, m, m0; orphans, sb, avol, logoff; err)⟫ ( (∃ lpt, log, orphans. persistence-io-inv(sb, logoff, avol, lpt, log, orphans)) ∧ ebm-vol-inv(avol) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → sb.indexaddr = adr ∧ sb.maxino = m1 ∧ is-encoded([], avol[sb.log].data) ∧ is-encoded(lpt, lebs(avol, sb.lpt, lptlebs(# avol - sb.main, LEB_SIZE))) ∧ is-encoded-pad(ns, sb.orphsize, avol[sb.orph].data)) ∧ ( err ≠ ESUCCESS → sb = sb0 ∧ avol[sb.log] = avol0[sb.log] ∧ avol[sb.orph] = avol0[sb.orph] ∧ lebs(avol, sb.lpt, lptlebs(# avol - sb.main, LEB_SIZE)) = lebs(avol0, sb.lpt, lptlebs(# avol - sb.main, LEB_SIZE))) ∧ sb.main = sb0.main ∧ # avol = # avol0 ∧ subarray(avol, sb.main, # avol - sb.main) = subarray(avol0, sb.main, # avol - sb.main)) |
# lpt + sb.main = # avol, avol0 = avol, m = EB_PAGE_SIZE, m0 = LEB_SIZE, ns = orphans, sb0 = sb, ebm-vol-inv(avol), ∃ lpt, log, orphans. persistence-io-inv(sb, logoff, avol, lpt, log, orphans) ⊦ ⟪persistence_io_commit#(lpt, adr, m1, m, m0; orphans, sb, avol, logoff; err)⟫ ( (∃ lpt, log, orphans. persistence-io-inv(sb, logoff, avol, lpt, log, orphans)) ∧ ebm-vol-inv(avol) ∧ (err = ESUCCESS ∨ ⌊err⌋ ) ∧ ( err = ESUCCESS → sb.indexaddr = adr ∧ sb.maxino = m1 ∧ is-encoded([], avol[sb.log].data) ∧ is-encoded(lpt, lebs(avol, sb.lpt, lptlebs(# avol - sb.main, LEB_SIZE))) ∧ is-encoded-pad(ns, sb.orphsize, avol[sb.orph].data)) ∧ ( err ≠ ESUCCESS → sb = sb0 ∧ avol[sb.log] = avol0[sb.log] ∧ avol[sb.orph] = avol0[sb.orph] ∧ lebs(avol, sb.lpt, lptlebs(# avol - sb.main, LEB_SIZE)) = lebs(avol0, sb.lpt, lptlebs(# avol - sb.main, LEB_SIZE))) ∧ sb.main = sb0.main ∧ # avol = # avol0 ∧ subarray(avol, sb.main, # avol - sb.main) = subarray(avol0, sb.main, # avol - sb.main))