| root[q].dir? ↔ ino1 ∈ dirs, dent = negdentry(str), err = ESUCCESS, isdir0, root.dir?, dom of < ino0, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q, ROOT_INO, ino1, dirs, files), of-cons(of, dirs, files), px-parent(user, q, ROOT_INO, dirs, files), psynced → asynced ⊦ [vfs_may_delete#(ino1, false, user, dirs, files, asynced; inode, dent, p_inode, isdir0, err); isdir := true; if isdir ∧ ¬ isdir0 then err := ENOTDIR; if ¬ isdir ∧ isdir0 then err := EISDIR; err1 := err; if err1 = ESUCCESS then afs_check_commit#(dirs, files; err1; asynced); fs := abs-files(files); if err1 = ESUCCESS then {afs_rmdir#(; inode, p_inode, dent, err1, dirs, files; asynced); vfs_put_inode#(p_inode, of, asynced; err1, dirs, files)}] ( of-cons(of, dirs, files) ∧ afs-cons(dirs, files) → ⟨posix_rmdir#(q + str ', user, fs, abs-of(of); err0, root; psynced)⟩ (fs = abs-files(files) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ err1 = err0)) |
isrename ↔ false, isdir ↔ isdir0, root[q].dir? ↔ ino1 ∈ dirs, dent = negdentry(str), err = ESUCCESS, ino = ino1, isdir0, root.dir?, dom of < ino0, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q, ROOT_INO, ino1, dirs, files), of-cons(of, dirs, files), px-parent(user, q, ROOT_INO, dirs, files), psynced → asynced ⊦ [afs_iget#(ino, dirs, files, asynced; inode, err); if err = ESUCCESS then if ¬ inode.directory then err := ENOTDIR else if ¬ px(user, inode.meta) ∨ ¬ pw(user, inode.meta) then err := EACCESS else {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {afs_iget#(dent.ino, dirs, files, asynced; p_inode, err); if err = ESUCCESS then {isdir := p_inode.directory; if isdir then if p_inode.ino = ROOT_INO then err := EACCESS else if isrename ∧ ¬ pw(user, p_inode.meta) then err := EACCESS else if ¬ isrename ∧ p_inode.size ≠ 0 then err := ENOTEMPTY}}}; isdir1 := true; isdir0 := isdir; if isdir1 ∧ ¬ isdir0 then err := ENOTDIR; if ¬ isdir1 ∧ isdir0 then err := EISDIR; err1 := err; if err1 = ESUCCESS then afs_check_commit#(dirs, files; err1; asynced); fs := abs-files(files); if err1 = ESUCCESS then {afs_rmdir#(; inode, p_inode, dent, err1, dirs, files; asynced); vfs_put_inode#(p_inode, of, asynced; err1, dirs, files)}] ( of-cons(of, dirs, files) ∧ afs-cons(dirs, files) → ⟨posix_rmdir#(q + str ', user, fs, abs-of(of); err0, root; psynced)⟩ (fs = abs-files(files) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ err1 = err0))
Used simplifier rules: vfs_may_delete# (INO, ISRENAME, USER, DIRS, FILES, ASYNCED ; INODE, DENT, DENT_INODE, ISDIR, ERR ) {afs_iget#(INO, DIRS, FILES, ASYNCED; INODE, ERR); if ERR = ESUCCESS then if ¬ INODE.directory then ERR := ENOTDIR else if ¬ px(USER, INODE.meta) ∨ ¬ pw(USER, INODE.meta) then ERR := EACCESS else {afs_lookup#(INO, DIRS, FILES, ASYNCED; DENT, ERR); if ERR = ESUCCESS then {afs_iget# (DENT.ino, DIRS, FILES, ASYNCED ; DENT_INODE, ERR); if ERR = ESUCCESS then {ISDIR := DENT_INODE.directory; if ISDIR then if DENT_INODE.ino = ROOT_INO then ERR := EACCESS else if ISRENAME ∧ ¬ pw(USER, DENT_INODE.meta) then ERR := EACCESS else if ¬ ISRENAME ∧ DENT_INODE.size ≠ 0 then ERR := ENOTEMPTY}}} };