| replay-log(log0, fs0, fi0 ⊖ fo0) = ri ⊖ ro, fo0.inodes?, ro.inodes?, file-node-cons(fs0, ri), log-cons(log0, fs0), orphans-cons(fs0, ri, ro), replay-safe(log0, fs0, fi0 ⊖ fo0), ri-closed(ri, fs0, ro), ri-cons(ri, fs0), ri-inj(ri), ri-inj(fi0), key ∈ ri, ro ⊆ dom ri, fo0 ⊆ dom fi0 ⊦ key.data?, dups(log0), key ∈ ro, inodekey(0) ∈ ri, inodekey(0) ∈ ri ⊖ ro, (ri[key] ∈ fs0 ∧ node-closed(fs0[ri[key]], ri, fs0, ro) → key ∈ ri ⊖ ro → node-closed(fs0[ri[key]], ri ⊖ ro, fs0, ∅)) ∧ file-node-cons(fs0, ri ⊖ ro) ∧ orphans-cons(fs0, ri ⊖ ro, ∅) |
⊦ node-closed(nd, ri, fs, ro) ↔ ( nd.dentry? → inodekey(nd.key.ino) ∈ ri ∧ ¬ inodekey(nd.key.ino) ∈ ro ∧ fs[ri[inodekey(nd.key.ino)]].directory ∧ inodekey(nd.ino) ∈ ri ∧ ¬ inodekey(nd.ino) ∈ ro) ∧ (nd.data? → inodekey(nd.key.ino) ∈ ri ∧ ¬ fs[ri[inodekey(nd.key.ino)]].directory ∧ # nd.data = VFS_PAGE_SIZE)
replay-log(log0, fs0, fi0 ⊖ fo0) = ri ⊖ ro, ro.inodes?, fo0.inodes?, file-node-cons(fs0, ri), log-cons(log0, fs0), orphans-cons(fs0, ri, ro), replay-safe(log0, fs0, fi0 ⊖ fo0), ri-closed(ri, fs0, ro), ri-cons(ri, fs0), ri-inj(fi0), ri-inj(ri), key ∈ ri, fo0 ⊆ dom fi0, ro ⊆ dom ri ⊦ key.data?, dups(log0), inodekey(0) ∈ ri ⊖ ro, inodekey(0) ∈ ri, key ∈ ro, ( ri[key] ∈ fs0 ∧ node-closed(fs0[ri[key]], ri, fs0, ro) → key ∈ ri ⊖ ro → ( fs0[ri[key]].dentry? → inodekey(fs0[ri[key]].key.ino) ∈ ri ⊖ ro ∧ ¬ inodekey(fs0[ri[key]].key.ino) ∈ ∅ ∧ fs0[(ri ⊖ ro)[inodekey(fs0[ri[key]].key.ino)]].directory ∧ inodekey(fs0[ri[key]].ino) ∈ ri ⊖ ro ∧ ¬ inodekey(fs0[ri[key]].ino) ∈ ∅) ∧ ( fs0[ri[key]].data? → inodekey(fs0[ri[key]].key.ino) ∈ ri ⊖ ro ∧ ¬ fs0[(ri ⊖ ro)[inodekey(fs0[ri[key]].key.ino)]].directory ∧ # fs0[ri[key]].data = VFS_PAGE_SIZE)) ∧ file-node-cons(fs0, ri ⊖ ro) ∧ orphans-cons(fs0, ri ⊖ ro, ∅)
Used terms: ∅, fs0, ri ⊖ ro, fs0[ri[key]]