| replay-log(log, fs, fi ⊖ fo) = ri1 ⊖ ro0, fo.inodes?, ro0.inodes?, file-node-cons(fs, ri1), file-node-cons(fs, (ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m)), log-cons(log, fs), orphans-cons(fs, ri1, ro0), orphans-cons(fs, (ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m), ro0 -- inodekey(m)), replay-safe(log, fs, fi ⊖ fo), ri-inj(fi), ri-inj(ri1), ubifs-cons(fs, ri1, ro0, fi, fo, log), inodekey(m) ∈ ri1, inodekey(m) ∈ ro0, ∀ ino. inodekey(ino) ∈ ro0 → links(ino, fs, ri1) = ∅, ∀ ino. inodekey(ino) ∈ ro0 → dentrykeys(inodekey(ino), ri1) = ∅ ⊦ # ro0 = 0, m = ROOT_INO, ro0 = ∅, (key ∈ ri1 ⊖ ro0 → key ∈ ri1 ∧ (¬ key.data? ∨ key.ino ≠ m) ∧ ¬ key ∈ ro0 ∧ (key.data? → key.ino = m ∨ ¬ inodekey(key.ino) ∈ ro0)) ∧ (ri1 ⊖ ro0)[key] = (((ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m)) ⊖ (ro0 -- inodekey(m)))[key], key ∈ ri1 ∧ ¬ key ∈ ro0 ∧ ¬ key.data? |
replay-log(log, fs, fi ⊖ fo) = ri1 ⊖ ro0, 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-safe(log, fs, fi ⊖ fo), ri-inj(ri1), ri-inj(fi), ubifs-cons(fs, ri1, ro0, fi, fo, log), inodekey(m) ∈ ro0, inodekey(m) ∈ ri1, ∀ ino. inodekey(ino) ∈ ro0 → dentrykeys(inodekey(ino), ri1) = ∅, ∀ ino. inodekey(ino) ∈ ro0 → links(ino, fs, ri1) = ∅ ⊦ # ro0 = 0, (ri1 ⊖ ro0)[key] = (((ri1 \ datakeys(inodekey(m), ri1)) -- inodekey(m)) ⊖ (ro0 -- inodekey(m)))[key], m = ROOT_INO, ro0 = ∅, key ∈ ri1 ∧ ¬ key ∈ ro0 ∧ ¬ key.data?
Used simplifier rules: elim-data: ⊦ key.data? ↔ (∃ ino, n. key = datakey(ino, n));%⊦ key ∈ ri ⊖ ks ↔ key ∈ ri ∧ ¬ key ∈ ks ∧ (key.data? → ¬ inodekey(key.ino) ∈ ks); (ws)% ⊦ ks.inodes? → ¬ datakey(ino, n) ∈ ks; (s)% ⊦ datakey(m, m0).data?; (s)% ⊦ datakey(m, m0).ino = m; (s)