| ro.inodes?, fo.inodes?, ri[datakey(m, n)] ∈ fs, inodekey(m) ∈ ri, datakey(m, n) ∈ ri, ro ⊆ dom ri, fo ⊆ dom fi, fs[ri[datakey(m, n)]].dentry? → inodekey(fs[ri[datakey(m, n)]].key.ino) ∈ ri ∧ ¬ inodekey(fs[ri[datakey(m, n)]].key.ino) ∈ ro ∧ fs[ri[inodekey(fs[ri[datakey(m, n)]].key.ino)]].directory ∧ inodekey(fs[ri[datakey(m, n)]].ino) ∈ ri ∧ ¬ inodekey(fs[ri[datakey(m, n)]].ino) ∈ ro, fs[ri[datakey(m, n)]].data? → inodekey(fs[ri[datakey(m, n)]].key.ino) ∈ ri ∧ ¬ fs[ri[inodekey(fs[ri[datakey(m, n)]].key.ino)]].directory ∧ # fs[ri[datakey(m, n)]].data = VFS_PAGE_SIZE, ∀ adr. adr ∈ log → adr ∈ fs ∧ node-cons(fs[adr].key, fs[adr]), ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]) ⊦ # fs[ri[datakey(m, n)]].data = VFS_PAGE_SIZE, fs[ri[inodekey(m)]].directory, dups(log), inodekey(0) ∈ ri |
fo.inodes?, ro.inodes?, datakey(m, n) ∈ ri, inodekey(m) ∈ ri, ri[datakey(m, n)] ∈ fs, fo ⊆ dom fi, ro ⊆ dom ri, fs[ri[datakey(m, n)]].dentry? → inodekey(fs[ri[datakey(m, n)]].key.ino) ∈ ri ∧ ¬ inodekey(fs[ri[datakey(m, n)]].key.ino) ∈ ro ∧ fs[ri[inodekey(fs[ri[datakey(m, n)]].key.ino)]].directory ∧ inodekey(fs[ri[datakey(m, n)]].ino) ∈ ri ∧ ¬ inodekey(fs[ri[datakey(m, n)]].ino) ∈ ro, ∀ key. key ∈ ri → ri[key] ∈ fs ∧ key-cons(key, fs[ri[key]]), ∀ adr. adr ∈ log → adr ∈ fs ∧ node-cons(fs[adr].key, fs[adr]) ⊦ # fs[ri[datakey(m, n)]].data = VFS_PAGE_SIZE, fs[ri[datakey(m, n)]].data?, fs[ri[inodekey(m)]].directory, dups(log), inodekey(0) ∈ ri