| # links(ino1, dirs0) = m0, dirs0[ino1] = mkdir(# entries0, md1, # links(ino1, dirs0), m1, entries0), dent = negdentry(str), err = ESUCCESS, files0 = files, p_ino = ino1, root[q].dir?, root.dir?, dom of < ino0, abs(root, ROOT_INO)(dirs0), afs-cons(dirs0, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q, ROOT_INO, ino1, dirs0, files), of-cons(of, dirs0, files), pw(user, md1), px(user, md1), px-parent(user, q, ROOT_INO, dirs0, files), ino1 ∈ dirs0, dirs ≡ dirs4[ino, mkdir(0, md, 1, 0, ∅)], dirs3 ≡ dirs2[p_ino, dirs2[p_ino].nsubdirs:= (dirs2[p_ino].nsubdirs + 1)], dirs1 ≡ dirs0[p_ino, dirs0[p_ino].entries:= dirs0[p_ino].entries[dent.name, ino]], dirs2 ≡ dirs1[p_ino, dirs1[p_ino].size:= (dirs1[p_ino].size + 1)], dirs4 ≡ dirs3 ++ ino, psynced → asynced0, links(ino1, dirs0) ≠ ∅ ∨ ino1 = ROOT_INO ⊦ [afs_inode_sync#(mkinode(ino1, md1, true, m0, m1, # entries0); dirs, files); inode := (ino1 ∈ dirs ⊃ mkinode(ino1, dirs[ino1].meta, true, dirs[ino1].nlink, dirs[ino1].nsubdirs, dirs[ino1].size) ;mkinode(ino1, files[ino1].meta, false, files[ino1].nlink, 0, files[ino1].size) ); c_inode := getinode(mkdentry(dent.name, ino).ino, dirs, files); asynced := ?] ( of-cons(of, dirs, files) ∧ afs-cons(dirs, files) → ⟨posix_mkdir#(q + str ', md, user, abs-files(files0), abs-of(of); err2, root; psynced)⟩ (abs-files(files0) = abs-files(files) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ ESUCCESS = err2)), ino = 0, ino ∈ dirs0, ino ∈ files, str ∈ entries0 |
⊦ ispath(p, ino, m, dirs, files) ∧ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → p ∈ tree ∧ (tree[p].dir? ↔ m ∈ dirs)
⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files))
dirs0[ino1] = mkdir(# entries0, md1, # links(ino1, dirs0), m1, entries0), files0 = files, ((ino => mkdir(0, md, 1, 0, ∅) * (λ dirs1. dirs3 = dirs1)))(dirs), root[q].dir?, root.dir?, dom of < ino0, abs(root, ROOT_INO)(dirs0), afs-cons(dirs0, files), fids-cons(root, abs-files(files), abs-of(of)), ispath(q, ROOT_INO, ino1, dirs0, files), of-cons(of, dirs0, files), pw(user, md1), px(user, md1), px-parent(user, q, ROOT_INO, dirs0, files), ino1 ∈ dirs0, ino ∈ dirs4, dirs3 ≡ dirs0[ino1, mkdir(# entries0 + 1, md1, # links(ino1, dirs0), m1 + 1, entries0[str, ino])], dirs4 ≡ dirs3 ++ ino, dirs ≡ dirs4[ino, mkdir(0, md, 1, 0, ∅)], ¬ ino ∈ dirs3, ¬ ino ∈ dirs0, ¬ ino ∈ files, ¬ str ∈ entries0, psynced → asynced0, links(ino1, dirs0) ≠ ∅ ∨ ino1 = ROOT_INO ⊦ [afs_inode_sync#(mkinode(ino1, md1, true, # links(ino1, dirs0), m1, # entries0); dirs, files); inode := (ino1 ∈ dirs ⊃ mkinode(ino1, dirs[ino1].meta, true, dirs[ino1].nlink, dirs[ino1].nsubdirs, dirs[ino1].size) ;mkinode(ino1, files[ino1].meta, false, files[ino1].nlink, 0, files[ino1].size) ); c_inode := getinode(mkdentry(str, ino).ino, dirs, files); asynced := ?] ( of-cons(of, dirs, files) ∧ afs-cons(dirs, files) → ⟨posix_mkdir#(q + str ', md, user, abs-files(files0), abs-of(of); err2, root; psynced)⟩ (abs-files(files0) = abs-files(files) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ ESUCCESS = err2))
Used simplifier rules: path-in: ⊦ ispath(p, ino, m, dirs, files) ∧ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → p ∈ tree ∧ (tree[p].dir? ↔ m ∈ dirs);%path-in-eq: ⊦ abs(tree, ino)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (p ∈ tree ↔ ispath(p, ino, dirs, files));%sep-com: ⊦ D * D0 = D0 * D; from specification heap-sep[dir-heap]%sep-ass: ⊦ (D * D0) * D1 = D * D0 * D1; from specification heap-sep[dir-heap]%⊦ dirs ≡ dirs0[ino, ad] → (((ino =>ad * D))(dirs0) ↔ ((ino => ad * D))(dirs) ∧ ino ∈ dirs0); (ws)% ⊦ dirs ≡ dirs0 → (dirs1 ≡ dirs0 ↔ dirs = dirs1); (s)%⊦ dirs ≡ dirs0 ++ ino ∧ ¬ ino ∈ dirs0 ∧ D(dirs0) → (ino = 0 ↔ ¬ ((ino =>ad * D))(dirs)); (ss)%assign-new-other: ⊦ dirs ≡ dirs0[ino, ad] ∧ ¬ ino0 ∈ dirs0 ∧ ino ∈ dirs0 → ¬ ino0 ∈ dirs; (forward) from specification separation[dir-heap]%⊦ mkdir(m, md, m0, m1, entries).nsubdirs:= m4 = mkdir(m, md, m0, m4, entries); (s)% ⊦ mkdir(m, md, m0, m1, entries).nsubdirs = m1; (s)% ⊦ dirs[ino, ad][ino, ad0] = dirs[ino, ad0]; (s)%⊦ mkdir(m, md, m0, m1, entries).size:= m2 = mkdir(m2, md, m0, m1, entries); (s)% ⊦ mkdir(m, md, m0, m1, entries).size = m; (s)% ⊦ dirs[ino, ad][ino0] = (ino0 = ino ∧ ino ∈ dirs ⊃ ad;dirs[ino0]); (s)%⊦ mkdir(m, md, m0, m1, entries).entries:= entries0 = mkdir(m, md, m0, m1, entries0); (s)% ⊦ mkdir(m, md, m0, m1, entries).entries = entries; (s)% ⊦ ispath(p, n, m, dirs, files) → ispath(p, n, dirs, files); (s)%⊦ ino ∈ dirs ∧ dirs0 ≡ dirs1[ino, ad] → (dirs1 ≡ dirs[ino, ad0] ↔ dirs1 = dirs[ino, ad0]); (s)% ⊦ negdentry(str).name = str; (s)