| # 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 |
# links(ino, dirs) = m0, files1[ino].meta = md0, files1[ino].nlink = # links(ino, dirs), files1[ino].size = m, files1[ino] = mkfile(files1[ino].size, files1[ino].meta, # links(ino, dirs), content0), buf-opt = none, files2 = files1, inode = mkinode(ino, files1[ino].meta, false, # links(ino, dirs), 0, files1[ino].size), afs-cons(dirs, files1), ino ∈ files1 ⊦ [afs_truncate#(files1[ino].size, files1[ino].size / 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)) ∧ files2 -- ino = files1 -- ino ;⌊err⌋ ) ∧ inode = mkinode(ino, md0, false, m0, 0, m))
Used simplifier rules: ⊦ mkinode(m, md, boolvar, m0, m1, m2).directory ↔ boolvar; (s)% ⊦ afs-cons(dirs, files) ∧ ino ∈ dirs → ¬ ino ∈ files; (s)%⊦ mkinode(m, md, boolvar, m0, m1, m2) = mkinode(m3, md0, boolvar0, m4, m5, m6) ↔ m = m3 ∧ md = md0 ∧ (boolvar ↔ boolvar0) ∧ m0 = m4 ∧ m1 = m5 ∧ m2 = m6; (ws)% ⊦ 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)