| p_ino = ino, afs-cons(dirs, files), ispath(q, ROOT_INO, ino, dirs, files), ino ∈ dirs, q ≠ ε → px(user, parent(q), ROOT_INO, dirs, files) ⊦ [vfs_walk#(p, user, dirs, files, asynced; ino, err)] ( ⌊err⌋ ∨ err = ESUCCESS ∧ ispath(p, p_ino, ino, dirs, files) ∧ px-parent(user, q + p, ROOT_INO, dirs, files) ∨ err = ENOENT ∧ ¬ ispath(p, p_ino, dirs, files) ∨ err = EACCESS ∧ p ≠ ε ∧ (∃ p'. p' ⊑ parent(p) ∧ ispath(p', p_ino, dirs, files) ∧ ¬ px(user, q + p', ROOT_INO, dirs, files))) |
⊦
p_ino = ino, afs-cons(dirs, files), ispath(q, ROOT_INO, ino, dirs, files), ino ∈ dirs, q ≠ ε → px(user, parent(q), ROOT_INO, dirs, files) ⊦ [err := ESUCCESS; let p = p in 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}}}] ( ⌊err⌋ ∨ err = ESUCCESS ∧ ispath(p, p_ino, ino, dirs, files) ∧ px-parent(user, q + p, ROOT_INO, dirs, files) ∨ err = ENOENT ∧ ¬ ispath(p, p_ino, dirs, files) ∨ err = EACCESS ∧ p ≠ ε ∧ (∃ p'. p' ⊑ parent(p) ∧ ispath(p', p_ino, dirs, files) ∧ ¬ px(user, q + p', ROOT_INO, dirs, files)))
Used simplifier rules: walk: ⊦ ;