| fs[ri1[key0]].key = key0, 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, ri1[key0] ∈ fs, key0 ∈ ri1, inodekey(key0.ino) ∈ ro0, inodekey(key0.ino) ∈ ri1, ro0 ⊆ dom ri1, key0.inode? → fs[ri1[key0]].inode?, key0.data? → fs[ri1[key0]].data? ∧ ¬ fs[ri1[inodekey(key0.ino)]].directory ∧ # fs[ri1[key0]].data = VFS_PAGE_SIZE, ∀ ino. inodekey(ino) ∈ ro0 → dentrykeys(inodekey(ino), ri1) = ∅, ∀ ino. inodekey(ino) ∈ ro0 → links(ino, fs, ri1) = ∅, ¬ key0.data? ∨ key0.ino ≠ m ⊦ # ro0 = 0, key0.ino = 0, key0 = inodekey(m), m = ROOT_INO, ro0 = ∅, key0.dentry?, (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 ∧ ¬ fs[ri1[inodekey(key0.ino)]].directory ∧ # fs[ri1[key0]].data = VFS_PAGE_SIZE) |
Used simplifier rules: elim-data: ⊦ key.data? ↔ (∃ ino, n. key = datakey(ino, n));%data-ubifs-cons: ⊦ datakey(ino, n) ∈ ri ∧ ri[datakey(ino, n)] ∈ fs ∧ ubifs-cons(fs, ri, ro, fi, fo, log) → fs[ri[datakey(ino, n)]].data?;% ⊦ key ∈ ri ∧ ubifs-cons(fs, ri, ro, fi, fo, log) → ri[key] ∈ fs; (ss)% ⊦ datakey(m, m0).ino = m; (s)% ⊦ inodekey(m) ≠ datakey(m0, m1); (s)% ⊦ ¬ datakey(m, m0).dentry?; (s)% ⊦ datakey(m, m0).data?; (s)%⊦ datakey(m, n) ∈ ri ∧ ubifs-cons(fs, ri, ro, fi, fo, log) → # fs[ri[datakey(m, n)]].data = VFS_PAGE_SIZE; (s)% ⊦ ¬ datakey(m, m0).inode?; (s) Used formulas: key0.data?