| dirs0[ino1] = mkdir(# entries0, md0, # links(ino1, dirs0), m3, entries0), files = (files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)], fs = abs-files(files0), ino = inode.ino, inode = mkinode(ino1, md0, true, # links(ino1, dirs0), m3, # entries0), mkdentry(str, ino2).dentry?, root.dir?, root[q].dir?, dom of < ino0, abs(root, ROOT_INO)(dirs0), afs-cons(dirs0, files0), afs-cons(dirs, files), fids-cons(root, abs-files(files0), abs-of(of)), ispath(q, ROOT_INO, ino1, dirs0, files0), of-cons(of, dirs0, files0), of-cons(of, dirs, files), pw(user, md0), px(user, md0), px-parent(user, q, ROOT_INO, dirs0, files0), ino1 ∈ dirs0, ino ∈ dirs1, dirs1 ≡ dirs0[ino1, mkdir(# entries0 + 1, md0, # links(ino1, dirs0), m3, entries0[str, ino2])], dirs ≡ dirs1[ino, dirs1[ino].meta:= inode.meta], psynced → asynced0, links(ino1, dirs0) ≠ ∅ ∨ ino1 = ROOT_INO ⊦ ⟨posix_create#(q + str ', md, user, abs-of(of); err2, root, fs; psynced)⟩ (fs = abs-files(files) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ ESUCCESS = err2), ino2 = 0, ino2 ∈ dirs1, ino2 ∈ dirs0, ino2 ∈ files0, str ∈ entries0, ino ∈ files |
dirs0[ino1] = mkdir(# entries0, md0, # links(ino1, dirs0), m3, entries0), fs = abs-files(files0), ino2 ≠ 0, root.dir?, root[q].dir?, dom of < ino0, abs(root, ROOT_INO)(dirs0), afs-cons(dirs0, files0), afs-cons(dirs, (files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)]), fids-cons(root, abs-files(files0), abs-of(of)), ispath(q, ROOT_INO, ino1, dirs0, files0), of-cons(of, dirs0, files0), of-cons(of, dirs, (files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)]), pw(user, md0), px(user, md0), px-parent(user, q, ROOT_INO, dirs0, files0), ino1 ∈ dirs0, dirs ≡ dirs0[ino1, mkdir(# entries0 + 1, md0, # links(ino1, dirs0), m3, entries0[str, ino2])], ¬ ino2 ∈ files0, ¬ str ∈ entries0, ¬ ino2 ∈ dirs, ¬ ino2 ∈ dirs0, psynced → asynced0, links(ino1, dirs0) ≠ ∅ ∨ ino1 = ROOT_INO ⊦ ⟨posix_create#(q + str ', md, user, abs-of(of); err2, root, fs; psynced)⟩ (fs = abs-files((files0 ++ ino2)[ino2, mkfile(0, md, 1, ∅)]) ∧ abs(root, ROOT_INO)(dirs) ∧ (psynced → asynced) ∧ ESUCCESS = err2)
Used simplifier rules: ⊦ dirs[ino, ad][ino, ad0] = dirs[ino, ad0]; (s)%⊦ mkdir(m, md, m0, m1, entries).meta:= md0 = mkdir(m, md0, m0, m1, entries); (s)% ⊦ dirs[ino, ad][ino0] = (ino0 = ino ∧ ino ∈ dirs ⊃ ad;dirs[ino0]); (s)% ⊦ ino ∈ dirs[ino0, ad] ↔ ino ∈ dirs; (s)%assign-new-other: ⊦ dirs ≡ dirs0[ino, ad] ∧ ¬ ino0 ∈ dirs0 ∧ ino ∈ dirs0 → ¬ ino0 ∈ dirs; (forward) from specification separation[dir-heap]% ⊦ afs-cons(dirs, files) ∧ ino ∈ dirs → ¬ ino ∈ files; (s)%ino ≠ 0, ¬ ino ∈ files ⊦ ino0 ∈ files ++ ino ↔ ino0 = ino ∨ ino0 ∈ files; (s)% ⊦ ino ∈ files[ino0, af] ↔ ino ∈ files; (s)% ⊦ mkdentry(str, m).dentry?; (s)%⊦ ino ∈ dirs ∧ dirs0 ≡ dirs1[ino, ad] → (dirs1 ≡ dirs[ino, ad0] ↔ dirs1 = dirs[ino, ad0]); (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).meta = md; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).ino = m; (s)