| dirs[ino] = mkdir(m, md, # links(ino, dirs), m1, entries), dent = negdentry(str), err = ENOENT, err0 = ESUCCESS, p_ino = ino, afs-cons(dirs, files), px(user, md), ino ∈ dirs, links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO, ∀ p0, err, dirs, files, ino, user, asynced. # p0 < #(str + p1) → err = ESUCCESS ∧ afs-cons(dirs, files) ∧ (ino ∈ dirs ∨ ino ∈ files) ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO) → ⟪while p0 ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p0.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p0 := p0.tail}}}⟫ true ⊦ ⟪p := str ' + p1; if err = ESUCCESS then {ino := negdentry(dent.name).ino; p := p.tail}; while p ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p := p.tail}}}⟫ true, dent.name ∈ dirs[p_ino].entries |
dirs[ino] = mkdir(m, md, # links(ino, dirs), m1, entries), dent = negdentry(str), err = ENOENT, err0 = ESUCCESS, p = str ' + p1, p_ino = ino, afs-cons(dirs, files), px(user, md), ino ∈ dirs, links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO, ∀ p0, err, dirs, files, ino, user, asynced. # p0 < #(str + p1) → err = ESUCCESS ∧ afs-cons(dirs, files) ∧ (ino ∈ dirs ∨ ino ∈ files) ∧ (links(ino, dirs) ≠ ∅ ∨ ino = ROOT_INO) → ⟪while p0 ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p0.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p0 := p0.tail}}}⟫ true ⊦ ⟪if err = ESUCCESS then {ino := negdentry(dent.name).ino; p := p.tail}; while p ≠ ε ∧ err = ESUCCESS do {choose inode with true in vfs_may_lookup#(ino, user, dirs, files, asynced; inode, err); if err = ESUCCESS then let dent = negdentry(p.head) in {afs_lookup#(ino, dirs, files, asynced; dent, err); if err = ESUCCESS then {ino := dent.ino; p := p.tail}}}⟫ true, dent.name ∈ dirs[p_ino].entries