| isdir ↔ true, err = ESUCCESS, ino = ino0, mode = MODE_R, afs-cons(dirs, files), ispath(p0, ROOT_INO, ino0, dirs, files), of-cons(of, dirs, files), pre-iget(ino, dirs, files), px-parent(user, p0, ROOT_INO, dirs, files) ⊦ ⟪fail#(; ; err); if err = ESUCCESS then if ¬(inode.directory ↔ isdir) then err := (inode.directory ⊃ EISDIR;ENOTDIR) else if (mode = MODE_R ∨ mode = MODE_RW) ∧ ¬ pr(user, inode.meta) ∨ (mode = MODE_W ∨ mode = MODE_RW) ∧ ¬ pw(user, inode.meta) then err := EACCESS; if err = ESUCCESS then afs_readdir#(inode, dirs, files, asynced; strings, err)⟫ true |
afs-cons(dirs, files), ispath(p0, ROOT_INO, ino0, dirs, files), of-cons(of, dirs, files), px-parent(user, p0, ROOT_INO, dirs, files), ino0 ∈ dirs ∨ ino0 ∈ files ⊦ ⟪fail#(; ; err); if err = ESUCCESS then if ¬ inode.directory then err := (inode.directory ⊃ EISDIR;ENOTDIR) else if ¬ pr(user, inode.meta) then err := EACCESS; if err = ESUCCESS then afs_readdir#(inode, dirs, files, asynced; strings, err)⟫ true
Used simplifier rules: ⊦ MODE_R ≠ MODE_RW; (s)% ⊦ MODE_R ≠ MODE_W; (s)% ⊦ valid-ino(ino, dirs, files) ↔ ino ∈ dirs ∨ ino ∈ files; (s)% ⊦ pre-iget(ino, dirs, files) ↔ valid-ino(ino, dirs, files); (s)