| ⟨afs_inode_sync#(new_inode.size:= n; dirs, files); inode := getinode(inode.ino, dirs, files); err := ESUCCESS; asynced := ?⟩ ( inode = p_inode ∧ buf-opt = buf-opt0 ∧ pageno0 = pageno2 ∧ pageno = pageno4 ∧ (boolvar ↔ boolvar0) ∧ err = err0 ∧ dirs = dirs0 ∧ files = files0 ∧ (asynced ↔ asynced1)), boolvar ↔ inode.size ≤ n ∧ pageno0 ≠ 0 ∧ (pageno1 ∈ content ∨ buf-opt.some?), files1[m] = mkfile(m0, md0, m1, content0), ¬ boolvar, content = files2[inode.ino].content, dirs = dirs1, files = files2[ino, files2[ino].content:= (content upto pageno)], files2 = files1, ino = inode.ino, inode = mkinode(m, md, false, m1, 0, m2), n = n0, new_inode = inode, pageno = min(n, inode.size), pageno0 = inode.size % VFS_PAGE_SIZE, pageno1 = m2 / VFS_PAGE_SIZE, pageno3 = 0, pageno5 = 0, m ∈ files1, buf-opt.some? → # buf-opt.buf = VFS_PAGE_SIZE ⊦ ⟨afs_truncate#(n0, m2 / VFS_PAGE_SIZE; buf-opt, inode, boolvar1, err, dirs1, files1, boolvar2)⟩ (buf-opt = buf-opt0 ∧ inode = p_inode ∧ (boolvar1 ↔ boolvar0) ∧ err = err0 ∧ dirs1 = dirs0 ∧ files1 = files0), VFS_PAGE_SIZE = 0 |
⟨inode := getinode(inode.ino, dirs2, files3); err := ESUCCESS; asynced := ?⟩ ( inode = p_inode ∧ buf-opt = buf-opt0 ∧ pageno0 = pageno2 ∧ pageno = pageno4 ∧ (boolvar ↔ boolvar0) ∧ err = err0 ∧ dirs2 = dirs0 ∧ files3 = files0 ∧ (asynced ↔ asynced1)), ⟨afs_inode_sync#(new_inode.size:= n; dirs, files)⟩ (dirs = dirs2 ∧ files = files3), boolvar ↔ inode.size ≤ n ∧ pageno0 ≠ 0 ∧ (pageno1 ∈ content ∨ buf-opt.some?), files1[m] = mkfile(m0, md0, m1, content0), ¬ boolvar, content = files2[inode.ino].content, dirs = dirs1, files = files2[ino, files2[ino].content:= (content upto pageno)], files2 = files1, ino = inode.ino, inode = mkinode(m, md, false, m1, 0, m2), n = n0, new_inode = inode, pageno = min(n, inode.size), pageno0 = inode.size % VFS_PAGE_SIZE, pageno1 = m2 / VFS_PAGE_SIZE, pageno3 = 0, pageno5 = 0, m ∈ files1, buf-opt.some? → # buf-opt.buf = VFS_PAGE_SIZE ⊦ ⟨afs_truncate#(n0, m2 / VFS_PAGE_SIZE; buf-opt, inode, boolvar1, err, dirs1, files1, boolvar2)⟩ (buf-opt = buf-opt0 ∧ inode = p_inode ∧ (boolvar1 ↔ boolvar0) ∧ err = err0 ∧ dirs1 = dirs0 ∧ files1 = files0), VFS_PAGE_SIZE = 0