| dirs[ino0] = mkdir(m, md0, # links(ino0, dirs), m1, entries), dent = negdentry(str), err0 = ESUCCESS, inode = mkinode(ino0, md0, true, # links(ino0, dirs), m1, m), afs-cons(dirs, files), ispath(q, ROOT_INO, ino0, dirs, files), of-cons(of, dirs, files), pw(user, md0), px(user, md0), px-parent(user, q, ROOT_INO, dirs, files), ino0 ∈ dirs, ¬ str ∈ entries, links(ino0, dirs) ≠ ∅ ∨ ino0 = ROOT_INO ⊦ ⟪afs_mkdir#(md; inode, c_inode, dent, err0, dirs, files; asynced)⟫ (of-cons(of, dirs, files) ∧ afs-cons(dirs, files)) |
afs-cons(dirs, files), pre-mkdir(p_inode, dent, md, dirs, files) ⊦ ⟪afs_mkdir#(md; p_inode, c_inode, dent, err, dirs, files; asynced)⟫ afs-cons(dirs, files)
dirs[ino0] = mkdir(m, md0, # links(ino0, dirs), m1, entries), dent = negdentry(str), err0 = ESUCCESS, inode = mkinode(ino0, md0, true, # links(ino0, dirs), m1, m), md1 = md, afs-cons(dirs, files), ispath(q, ROOT_INO, ino0, dirs, files), of-cons(of, dirs, files), pre-mkdir(inode, dent, md, dirs, files), pw(user, md0), px(user, md0), px-parent(user, q, ROOT_INO, dirs, files), ino0 ∈ dirs, links(ino0, dirs) ≠ ∅ ∨ ino0 = ROOT_INO ⊦ [afs_mkdir#(md; inode, c_inode, dent, err0, dirs, files; asynced)] (afs-cons(dirs, files) → of-cons(of, dirs, files) ∧ afs-cons(dirs, files)), str ∈ entries
Used simplifier rules: ⊦ pre-mkdir(p_inode, dent, md, dirs, files) ↔ valid-negdentry(p_inode.ino, dent, dirs, files) ∧ valid-dir-inode(p_inode, dirs, files); (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).ino = m; (s)%⊦ valid-negdentry(ino, dent, dirs, files) ↔ valid-parent-ino(ino, dirs, files) ∧ ¬ dent.name ∈ dirs[ino].entries ∧ dent.negdentry?; (s)%⊦ valid-parent-ino(ino, dirs, files) ↔ ino ∈ dirs ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO); (s)% ⊦ negdentry(str).name = str; (s)% ⊦ negdentry(str).negdentry?; (s)%⊦ valid-dir-inode(inode, dirs, files) ↔ valid-dir-ino(inode.ino, dirs, files) ∧ inode.nlink = dirs[inode.ino].nlink ∧ inode.size = dirs[inode.ino].size ∧ inode.nsubdirs = dirs[inode.ino].nsubdirs ∧ inode.directory; (s)% ⊦ valid-dir-ino(ino, dirs, files) ↔ ino ∈ dirs; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).nlink = m0; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).size = m2; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).nsubdirs = m1; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).directory ↔ boolvar; (s)% ⊦ mkdir(m, md, m0, m1, entries).entries = entries; (s)% ⊦ mkdir(m, md, m0, m1, entries).nlink = m0; (s)% ⊦ mkdir(m, md, m0, m1, entries).size = m; (s)% ⊦ mkdir(m, md, m0, m1, entries).nsubdirs = m1; (s)