| afs-cons(dirs, files), pre-create(p_inode, dent, md, dirs, files) ⊦ ⟪afs_create_ino#(p_inode.ino, md, ino; dent, err, dirs, files)⟫ afs-cons(dirs, files), ino = 0, ino ∈ dirs, ino ∈ files |
p_inode.nlink = dirs[p_inode.ino].nlink, p_inode.nsubdirs = dirs[p_inode.ino].nsubdirs, p_inode.size = dirs[p_inode.ino].size, ino ≠ 0, p_inode.directory, dent.negdentry?, afs-cons(dirs, files), p_inode.ino ∈ dirs, ¬ ino ∈ files, ¬ ino ∈ dirs, ¬ dent.name ∈ dirs[p_inode.ino].entries, links(p_inode.ino, dirs) ≠ ∅ ∨ p_inode.ino = ROOT_INO ⊦ ⟪afs_create_ino#(p_inode.ino, md, ino; dent, err, dirs, files)⟫ afs-cons(dirs, files)
Used simplifier rules: ⊦ 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)%⊦ 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)%⊦ pre-create(p_inode, dent, md, dirs, files) ↔ valid-negdentry(p_inode.ino, dent, dirs, files) ∧ valid-dir-inode(p_inode, dirs, files); (s)