| ro0.inodes?, fo.inodes?, file-node-cons(fs, (ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m)), file-node-cons(fs, ri1), log-cons(log, fs), orphans-cons(fs, (ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m), ro0 -- inodekey(m)), orphans-cons(fs, ri1, ro0), replay-cons-strong(fs, ri1, ro0, fi, fo, log), ri-inj(ri1), ri-inj(fi), ubifs-cons(fs, ri1, ro0, fi, fo, log), inodekey(m) ∈ ro0, inodekey(m) ∈ ri1, ro0 ⊆ dom ri1, ∀ ino. inodekey(ino) ∈ ro0 → dentrykeys(inodekey(ino), ri1) = ∅, ∀ ino. inodekey(ino) ∈ ro0 → links(ino, fs, ri1) = ∅ ⊦ # ro0 = 0, m = ROOT_INO, ro0 = ∅, (ro0 ⊆ dom ri1 → key ≠ inodekey(key.ino) ∧ key ∈ ro0 → ¬ key ∈ ri1 ∨ ¬ key.data? ∨ key.ino ≠ m) ∧ ( ri1[key0] ∈ fs ∧ fs[ri1[key0]].key = key0 ∧ (key0.inode? → fs[ri1[key0]].inode? ∧ key0.ino ≠ 0) ∧ ( key0.dentry? → fs[ri1[key0]].dentry? ∧ inodekey(key0.ino) ∈ ri1 ∧ inodekey(fs[ri1[key0]].ino) ∈ ri1 ∧ ¬ inodekey(key0.ino) ∈ ro0 ∧ ¬ inodekey(fs[ri1[key0]].ino) ∈ ro0 ∧ fs[ri1[inodekey(key0.ino)]].directory) ∧ ( key0.data? → fs[ri1[key0]].data? ∧ inodekey(key0.ino) ∈ ri1 ∧ ¬ fs[ri1[inodekey(key0.ino)]].directory ∧ # fs[ri1[key0]].data = VFS_PAGE_SIZE) → key0 ≠ inodekey(m) ∧ key0 ∈ ri1 ∧ (¬ key0.data? ∨ key0.ino ≠ m) → (key0.data? ∧ key0.ino = m ⊃ (∅)[key0];ri1[key0]) ∈ fs ∧ fs[(key0.data? ∧ key0.ino = m ⊃ (∅)[key0];ri1[key0])].key = key0 ∧ ( key0.data? → fs[ri1[key0]].data? ∧ key0.ino ≠ m ∧ inodekey(key0.ino) ∈ ri1 ∧ ¬ fs[ri1[inodekey(key0.ino)]].directory ∧ # fs[ri1[key0]].data = VFS_PAGE_SIZE)) |
ro0.inodes?, fo.inodes?, file-node-cons(fs, (ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m)), file-node-cons(fs, ri1), log-cons(log, fs), orphans-cons(fs, (ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m), ro0 -- inodekey(m)), orphans-cons(fs, ri1, ro0), replay-cons-strong(fs, ri1, ro0, fi, fo, log), ri-inj(ri1), ri-inj(fi), ubifs-cons(fs, ri1, ro0, fi, fo, log), inodekey(m) ∈ ro0, inodekey(m) ∈ ri1, ro0 ⊆ dom ri1, ∀ ino. inodekey(ino) ∈ ro0 → dentrykeys(inodekey(ino), ri1) = ∅, ∀ ino. inodekey(ino) ∈ ro0 → links(ino, fs, ri1) = ∅ ⊦ # ro0 = 0, m = ROOT_INO, ro0 = ∅, (key ≠ inodekey(key.ino) ∧ key ∈ ro0 → ¬ key ∈ ri1 ∨ ¬ key.data? ∨ key.ino ≠ m) ∧ ( ri1[key0] ∈ fs ∧ fs[ri1[key0]].key = key0 ∧ (key0.inode? → fs[ri1[key0]].inode? ∧ key0.ino ≠ 0) ∧ ( key0.dentry? → fs[ri1[key0]].dentry? ∧ inodekey(key0.ino) ∈ ri1 ∧ inodekey(fs[ri1[key0]].ino) ∈ ri1 ∧ ¬ inodekey(key0.ino) ∈ ro0 ∧ ¬ inodekey(fs[ri1[key0]].ino) ∈ ro0 ∧ fs[ri1[inodekey(key0.ino)]].directory) ∧ ( key0.data? → fs[ri1[key0]].data? ∧ inodekey(key0.ino) ∈ ri1 ∧ ¬ fs[ri1[inodekey(key0.ino)]].directory ∧ # fs[ri1[key0]].data = VFS_PAGE_SIZE) → key0 ≠ inodekey(m) ∧ key0 ∈ ri1 ∧ (¬ key0.data? ∨ key0.ino ≠ m) → (key0.data? ∧ key0.ino = m ⊃ (∅)[key0];ri1[key0]) ∈ fs ∧ fs[(key0.data? ∧ key0.ino = m ⊃ (∅)[key0];ri1[key0])].key = key0 ∧ ( key0.data? → fs[ri1[key0]].data? ∧ key0.ino ≠ m ∧ inodekey(key0.ino) ∈ ri1 ∧ ¬ fs[ri1[inodekey(key0.ino)]].directory ∧ # fs[ri1[key0]].data = VFS_PAGE_SIZE))
Used simplifier rules: ⊦ key ∈ dom ri ↔ key ∈ ri; (s)%sub-in: ⊦ key ∈ ks ∧ ks ⊆ ks0 → key ∈ ks0; (forward) from specification set-basic[node-index]