| # links(ino, dirs) = m0, files1[ino] = mkfile(m, md0, # links(ino, dirs), content0), buf-opt = none, files0 = files1, inode = mkinode(ino, md0, false, # links(ino, dirs), 0, m), afs-cons(dirs, files1), ino ∈ files1 ⊦ [afs_truncate#(m, m / VFS_PAGE_SIZE; buf-opt, inode, bv, err, dirs, files1, asynced)] ( afs-cons(dirs, files1) → (err = ESUCCESS ⊃ files1[ino].content.stream from m = σ⊥ ∧ (∀ n0, n1, buf. n1 ≤ # buf → write-inv(n0, n0 + n1, mkinode(ino, md0, false, m0, 0, m), buf, 0, dirs, files1, files1)) ∧ files0 -- ino = files1 -- ino ;⌊err⌋ ) ∧ files0 ~ files1 ∧ inode = mkinode(ino, md0, false, m0, 0, m)) |
afs-cons(dirs, files), pageno = inode.size / VFS_PAGE_SIZE, buf-opt.none?, files0 = files, inode = getinode(ino, dirs, files), inode.size = n, ¬ inode.directory ⊦ [afs_truncate#(n, pageno; buf-opt, inode, bv, err, dirs, files, asynced)] (files0 ~ files ∧ (⌊err⌋ ∨ err = ESUCCESS))
# links(ino, dirs) = m0, inode.size = m, m / VFS_PAGE_SIZE = inode.size / VFS_PAGE_SIZE, files1[ino] = mkfile(m, md0, # links(ino, dirs), content0), buf-opt = none, files0 = files1, files1 = files1, files2 = files1, ino0 = ino, inode = mkinode(ino, md0, false, # links(ino, dirs), 0, m), inode = getinode(ino, dirs, files1), n0 = m, pageno0 = m / VFS_PAGE_SIZE, buf-opt.none?, afs-cons(dirs, files1), ino ∈ files1 ⊦ [afs_truncate#(m, m / VFS_PAGE_SIZE; buf-opt, inode, bv, err, dirs, files1, asynced)] ( files2 ~ files1 ∧ (⌊err⌋ ∨ err = ESUCCESS) → afs-cons(dirs, files1) → (err = ESUCCESS ⊃ files1[ino].content.stream from m = σ⊥ ∧ (∀ n0, n1, buf. n1 ≤ # buf → write-inv(n0, n0 + n1, mkinode(ino, md0, false, m0, 0, m), buf, 0, dirs, files1, files1)) ∧ files0 -- ino = files1 -- ino ;⌊err⌋ ) ∧ files0 ~ files1 ∧ inode = mkinode(ino, md0, false, m0, 0, m)), inode.directory
Used simplifier rules: ⊦ mkinode(m, md, boolvar, m0, m1, m2).size = m2; (s)% ⊦ none.none?; (s)%⊦ getinode(ino, dirs, files) = (ino ∈ dirs ⊃ mkinode (ino, dirs[ino].meta, true, dirs[ino].nlink, dirs[ino].nsubdirs, dirs[ino].size) ;mkinode (ino, files[ino].meta, false, files[ino].nlink, 0, files[ino].size) ); (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).directory ↔ boolvar; (s)% ⊦ afs-cons(dirs, files) ∧ ino ∈ dirs → ¬ ino ∈ files; (s)% ⊦ mkfile(m, md, m0, content).meta = md; (s)% ⊦ mkfile(m, md, m0, content).nlink = m0; (s)% ⊦ mkfile(m, md, m0, content).size = m; (s)