| dirs[ino0] = mkdir(m, md1, # links(ino0, dirs), m1, entries0), dent = negdentry(str), err = err0, err0 = ESUCCESS, inode = mkinode(ino0, md1, true, # links(ino0, dirs), m1, m), p_inode = inode, afs-cons(dirs, files), ispath(q, ROOT_INO, ino0, dirs, files), of-cons(of, dirs, files), pre-create(p_inode, dent, md, dirs, files), pw(user, md1), px(user, md1), px-parent(user, q, ROOT_INO, dirs, files), ino0 ∈ dirs, links(ino0, dirs) ≠ ∅ ∨ ino0 = ROOT_INO ⊦ [afs_create_ino#(p_inode.ino, md, ino; dent, err, dirs, files); afs_inode_sync#(p_inode; dirs, files); p_inode := getinode(p_inode.ino, dirs, files); c_inode := getinode(dent.ino, dirs, files); asynced := ?] (afs-cons(dirs, files) → of-cons(of, dirs, files)), ino = 0, str ∈ entries0, ino ∈ files, ino ∈ dirs |
# links(ino0, dirs) = dirs[ino0].nlink, dirs[ino0] = mkdir(dirs[ino0].size, md1, dirs[ino0].nlink, dirs[ino0].nsubdirs, entries0), dent = negdentry(str), err = ESUCCESS, inode = mkinode(ino0, md1, true, dirs[ino0].nlink, dirs[ino0].nsubdirs, dirs[ino0].size), ino ≠ 0, afs-cons(dirs, files), ispath(q, ROOT_INO, ino0, dirs, files), of-cons(of, dirs, files), pw(user, md1), px(user, md1), px-parent(user, q, ROOT_INO, dirs, files), ino0 ∈ dirs, ¬ str ∈ dirs[ino0].entries, ¬ str ∈ entries0, ¬ ino ∈ files, ¬ ino ∈ dirs, links(ino0, dirs) ≠ ∅ ∨ ino0 = ROOT_INO ⊦ [afs_create_ino#(ino0, md, ino; dent, err, dirs, files); afs_inode_sync#(inode; dirs, files); inode := (inode.ino ∈ dirs ⊃ mkinode(inode.ino, dirs[inode.ino].meta, true, dirs[inode.ino].nlink, dirs[inode.ino].nsubdirs, dirs[inode.ino].size) ;mkinode(inode.ino, files[inode.ino].meta, false, files[inode.ino].nlink, 0, files[inode.ino].size) ); c_inode := getinode(dent.ino, dirs, files); asynced := ?] (afs-cons(dirs, files) → of-cons(of, dirs, files))
Used simplifier rules: ⊦ getinode(ino, dirs, files) = (ino ∈ dirs ⊃ mkinode (ino, dirs[ino].meta, true, dirs[ino].nlink, dirs[ino].nsubdirs, dirs[ino].size) ;mkinode (ino, files[ino].meta, false, files[ino].nlink, 0, files[ino].size) ); (s)% ⊦ 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-create(p_inode, dent, md, dirs, files) ↔ valid-negdentry(p_inode.ino, dent, dirs, files) ∧ valid-dir-inode(p_inode, dirs, files); (s)