| cache_truncate#(N, PAGENO; PBUF-OPT, INODE, MODIFIED, ERR, DIRS, FILES, ASYNCED, ICACHE, PCACHE) {if pre-truncate(INODE, N, PAGENO, PBUF-OPT, DIRS, FILES) then let INO = INODE.ino, SIZE = INODE.size, SOME_BUF = PBUF-OPT.some?, HIT = false, OLD_DIRTY = false in {ERR := ESUCCESS; if PBUF-OPT.none? then let PBUF = ? in {pcache_check_page#(INO, PAGENO, PCACHE; HIT, OLD_DIRTY, ERR); if ERR = ESUCCESS ∧ HIT then pcache_get#(INO, PAGENO, PCACHE; HIT, PBUF, ERR); if ERR = ESUCCESS ∧ HIT then PBUF-OPT := some(PBUF)}; if ERR = ESUCCESS then afs_truncate#(N, PAGENO; PBUF-OPT, INODE, MODIFIED, ERR, DIRS, FILES, ASYNCED); if ERR = ESUCCESS then let DIRTY = false in {icache_set#(INODE, DIRTY; ERR, ICACHE); pcache_truncate#(INODE.ino, SIZE, N; ERR, PCACHE); if MODIFIED then pcache_set#(INODE.ino, PAGENO, PBUF-OPT.buf, DIRTY; ERR, PCACHE)}; if (¬ MODIFIED ∨ ERR ≠ ESUCCESS) ∧ ¬ SOME_BUF then PBUF-OPT := none} else abort } |