| ⟨afs_lookup#(pageno, dirs1, files1, asynced0; dent, err)⟩ (dent = old_dent ∧ err = err1), dirs1[pageno] = mkdir(m, md, m0, m1, entries), pageno ∈ dirs1, links(pageno, dirs1) ≠ ∅ ∨ pageno = ROOT_INO ⊦ ∃ err0. ⌊err0⌋ ∧ ⟨err := err0⟩ (dent = old_dent ∧ err = err1), ⟨if dent.name ∈ entries then {dent := mkdentry(dent.name, entries[dent.name]); err := ESUCCESS} else {dent := negdentry(dent.name); err := ENOENT}⟩ (dent = old_dent ∧ err = err1) |
⟨if pre-lookup(p_ino, dent, dirs, files) then { if dent.name ∈ dirs[p_ino].entries then {dent := mkdentry(dent.name, dirs[p_ino].entries[dent.name]); err := ESUCCESS} else {dent := negdentry(dent.name); err := ENOENT} or fail#(; ; err)} else abort⟩ (dent = old_dent ∧ err = err1), asynced ↔ asynced0, dirs1[pageno] = mkdir(m, md, m0, m1, entries), dirs = dirs1, files = files1, p_ino = pageno, pageno ∈ dirs1, links(pageno, dirs1) ≠ ∅ ∨ pageno = ROOT_INO ⊦ ∃ err0. ⌊err0⌋ ∧ ⟨err := err0⟩ (dent = old_dent ∧ err = err1), ⟨if dent.name ∈ entries then {dent := mkdentry(dent.name, entries[dent.name]); err := ESUCCESS} else {dent := negdentry(dent.name); err := ENOENT}⟩ (dent = old_dent ∧ err = err1)
Used simplifier rules: afs_lookup#(P_INO, DIRS, FILES, ASYNCED; DENT, ERR) {if pre-lookup(P_INO, DENT, DIRS, FILES) then { if DENT.name ∈ DIRS[P_INO].entries then {DENT := mkdentry(DENT.name, DIRS[P_INO].entries[DENT.name]); ERR := ESUCCESS} else {DENT := negdentry(DENT.name); ERR := ENOENT} or fail#(; ; ERR)} else abort };