| ⟨files1 := files[ino, files[ino].content:= (content[pageno1, fill(files[ino].content[pageno1], zero, pageno0, VFS_PAGE_SIZE - pageno0)] upto pageno)]; afs_inode_sync#(new_inode.size:= n; dirs, files1); inode := getinode(inode.ino, dirs, files1); err := ESUCCESS; asynced := ?⟩ ( inode = p_inode ∧ some(fill(files[ino].content[pageno1], zero, pageno0, VFS_PAGE_SIZE - pageno0)) = buf-opt0 ∧ pageno0 = pageno2 ∧ pageno = pageno4 ∧ (boolvar ↔ boolvar0) ∧ err = err0 ∧ dirs = dirs0 ∧ files1 = files0 ∧ (asynced ↔ asynced1)), boolvar ↔ inode.size ≤ n ∧ pageno0 ≠ 0 ∧ (pageno1 ∈ content ∨ buf-opt.some?), files1[m] = mkfile(m0, md0, m1, content0), boolvar, content = files[inode.ino].content, dirs = dirs1, files = 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, pageno1 ∈ files[ino].content, pageno0 + (VFS_PAGE_SIZE - pageno0) ≤ # files[ino].content[pageno1], 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, buf-opt.some? |
⟨afs_inode_sync#(new_inode.size:= n; dirs, files1); inode := getinode(inode.ino, dirs, files1); err := ESUCCESS; asynced := ?⟩ ( inode = p_inode ∧ some(fill(files[ino].content[pageno1], zero, pageno0, VFS_PAGE_SIZE - pageno0)) = buf-opt0 ∧ pageno0 = pageno2 ∧ pageno = pageno4 ∧ (boolvar ↔ boolvar0) ∧ err = err0 ∧ dirs = dirs0 ∧ files1 = files0 ∧ (asynced ↔ asynced1)), boolvar ↔ inode.size ≤ n ∧ pageno0 ≠ 0 ∧ (pageno1 ∈ content ∨ buf-opt.some?), files2[m] = mkfile(m0, md0, m1, content0), boolvar, content = files[inode.ino].content, dirs = dirs1, files = files2, files1 = files[ino, files[ino].content:= (content[pageno1, fill(files[ino].content[pageno1], zero, pageno0, VFS_PAGE_SIZE - pageno0)] upto pageno)], 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 ∈ files2, pageno1 ∈ files[ino].content, pageno0 + (VFS_PAGE_SIZE - pageno0) ≤ # files[ino].content[pageno1], 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, files2, boolvar2)⟩ (buf-opt = buf-opt0 ∧ inode = p_inode ∧ (boolvar1 ↔ boolvar0) ∧ err = err0 ∧ dirs1 = dirs0 ∧ files2 = files0), VFS_PAGE_SIZE = 0, buf-opt.some?