| 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 |
# links(ino0, dirs) = dirs[ino0].nlink, dirs[ino0] = mkdir(dirs[ino0].size, md0, dirs[ino0].nlink, dirs[ino0].nsubdirs, entries), dent = negdentry(str), err0 = ESUCCESS, inode = mkinode(ino0, md0, true, dirs[ino0].nlink, dirs[ino0].nsubdirs, dirs[ino0].size), 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 ∈ dirs[ino0].entries, ¬ str ∈ entries, 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))
Used simplifier rules: afs-cons-dir-nlink: ⊦ afs-cons(dirs, files) ∧ ino ∈ dirs ∧ dirs[ino] = mkdir(n0, md, n, n1, entries) → # links(ino, dirs) = n; (forward) from specification afs-base% ⊦ mkinode(m, md, boolvar, m0, m1, m2).directory ↔ boolvar; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).nsubdirs = m1; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).size = m2; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).nlink = m0; (s)% ⊦ valid-dir-ino(ino, dirs, files) ↔ ino ∈ dirs; (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)% ⊦ negdentry(str).negdentry?; (s)% ⊦ negdentry(str).name = str; (s)%⊦ valid-parent-ino(ino, dirs, files) ↔ ino ∈ dirs ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO); (s)%⊦ valid-negdentry(ino, dent, dirs, files) ↔ valid-parent-ino(ino, dirs, files) ∧ ¬ dent.name ∈ dirs[ino].entries ∧ dent.negdentry?; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).ino = m; (s)%⊦ pre-mkdir(p_inode, dent, md, dirs, files) ↔ valid-negdentry(p_inode.ino, dent, dirs, files) ∧ valid-dir-inode(p_inode, dirs, files); (s)