| root[q].dir? ↔ ino1 ∈ dirs, err1 = ESUCCESS, 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_create#(ino1, negdentry((q + str ').last), user, dirs, files, asynced; inode, err1); if err1 = ESUCCESS then afs_check_commit#(dirs, files; err1; asynced); fs := abs-files(files); if err1 = ESUCCESS then {dent := negdentry((q + str ').last); afs_mkdir#(md; inode, c_inode, dent, err1, dirs, files; asynced)}] ( of-cons(of, dirs, files) ∧ afs-cons(dirs, files) → ⟨posix_mkdir#(q + str ', md, user, fs, abs-of(of); err0, root; psynced)⟩ (fs = abs-files(files) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ err1 = err0)) |
root[q].dir? ↔ ino1 ∈ dirs, dent = negdentry((q + str ').last), err = err1, err1 = ESUCCESS, ino = ino1, 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 err := EEXISTS else if err = ENOENT then err := ESUCCESS}; err1 := err; if err1 = ESUCCESS then afs_check_commit#(dirs, files; err1; asynced); fs := abs-files(files); if err1 = ESUCCESS then {dent := negdentry((q + str ').last); afs_mkdir#(md; inode, c_inode, dent, err1, dirs, files; asynced)}] ( of-cons(of, dirs, files) ∧ afs-cons(dirs, files) → ⟨posix_mkdir#(q + str ', md, user, fs, abs-of(of); err0, root; psynced)⟩ (fs = abs-files(files) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ err1 = err0)), q + str ' = ε
Used simplifier rules: vfs_may_create#(INO, DENT, USER, DIRS, FILES, ASYNCED; INODE, 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 ERR := EEXISTS else if ERR = ENOENT then ERR := ESUCCESS} };