| ⟨err := ESUCCESS; asynced := ?⟩ ( getinode(inode.ino, dirs2, files3) = p_inode ∧ some(fill(buf-opt.buf, zero, pageno0, VFS_PAGE_SIZE - pageno0)) = 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[pageno1, fill(buf-opt.buf, zero, pageno0, VFS_PAGE_SIZE - pageno0)] 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, buf-opt.some?, m ∈ files1, pageno0 + (VFS_PAGE_SIZE - pageno0) ≤ # buf-opt.buf, VFS_PAGE_SIZE ≥ pageno0, 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 |
⟨asynced := ?⟩ ( getinode(inode.ino, dirs2, files3) = p_inode ∧ some(fill(buf-opt.buf, zero, pageno0, VFS_PAGE_SIZE - pageno0)) = buf-opt0 ∧ pageno0 = pageno2 ∧ pageno = pageno4 ∧ (boolvar ↔ boolvar0) ∧ ESUCCESS = 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[pageno1, fill(buf-opt.buf, zero, pageno0, VFS_PAGE_SIZE - pageno0)] 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, buf-opt.some?, m ∈ files1, pageno0 + (VFS_PAGE_SIZE - pageno0) ≤ # buf-opt.buf, VFS_PAGE_SIZE ≥ pageno0, 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