| write-inv(n0, n1, inode, buf, n, dirs, files0, files1) ⊦ [vfs_write_block#(n0, inode, buf, n1, dirs; n, bv, err, files1, asynced)] write-inv(n0, n1, inode, buf, n, dirs, files0, files1) |
isdir ↔ bv, files = files1, ino0 = n, ino1 = n1, ino2 = n0, write-inv(n0, n1, inode, buf, n, dirs, files0, files1) ⊦ [let pageno = (ino2 + ino0) / VFS_PAGE_SIZE, ino = (ino2 + ino0) % VFS_PAGE_SIZE in let n = min(ino1 - ino2 + ino0, VFS_PAGE_SIZE - ino) in if n ≠ 0 then {vfs_writepage#(inode, pageno, buf, ino0, ino, n, dirs; err, files, asynced); if err = ESUCCESS then ino0 := ino0 + n} else isdir := true] write-inv(n0, n1, inode, buf, ino0, dirs, files0, files)
Used simplifier rules: vfs_write_block# (START, INODE, BUF, END, DIRS; TOTAL, DONE, ERR, FILES, ASYNCED) {let PAGENO = (START + TOTAL) / VFS_PAGE_SIZE, OFFSET = (START + TOTAL) % VFS_PAGE_SIZE in let N = min(END - START + TOTAL, VFS_PAGE_SIZE - OFFSET) in if N ≠ 0 then {vfs_writepage# (INODE, PAGENO, BUF, TOTAL, OFFSET, N, DIRS ; ERR, FILES, ASYNCED); if ERR = ESUCCESS then TOTAL := TOTAL + N} else DONE := true };