| err = EACCESS, err0 = ESUCCESS, err1 = ESUCCESS, getinode(ino, dirs, files).directory, afs-cons(dirs, files), links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO, ino ∈ dirs ∨ ino ∈ files, ∀ p0, err, dirs, files, ino, user, asynced. # p0 < # p → err = ESUCCESS ∧ afs-cons(dirs, files) ∧ (ino ∈ dirs ∨ ino ∈ files) ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO) → ⟪while p0 ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p0.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p0 := p0.tail}}}⟫ true ⊦ ⟪while p ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p := p.tail}}}⟫ true, p = ε, px(user, getinode(ino, dirs, files).meta) |
err = EACCESS, p ≠ ε, afs-cons(dirs, files), ino ∈ dirs, ¬ px(user, dirs[ino].meta), links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO, ∀ p0, err, dirs, files, ino, user, asynced. # p0 < # p → err = ESUCCESS ∧ afs-cons(dirs, files) ∧ (ino ∈ dirs ∨ ino ∈ files) ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO) → ⟪while p0 ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p0.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p0 := p0.tail}}}⟫ true ⊦ ⟪while p ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p := p.tail}}}⟫ true
Used simplifier rules: ⊦ mkinode(m, md, boolvar, m0, m1, m2).meta = md; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).directory ↔ boolvar; (s)%⊦ getinode(ino, dirs, files) = (ino ∈ dirs ⊃ mkinode (ino, dirs[ino].meta, true, dirs[ino].nlink, dirs[ino].nsubdirs, dirs[ino].size) ;mkinode (ino, files[ino].meta, false, files[ino].nlink, 0, files[ino].size) ); (s)