| files[m] = mkfile(m1, md, # links(m, dirs), content), of[fd] = mkfile(m, mode, m0), root.dir?, m1 < m0 + ino, dom of < ino2, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of)), of-cons(of[fd, mkfile(m, mode, m0 + ino)], dirs, files), of-cons(of, dirs, files), read-inv(m0, m0 + n0, mkinode(m, md, false, # links(m, dirs), 0, m1), buf0, buf1, ino, dirs, files), read-inv(m0, m0 + n0, mkinode(m, md, false, # links(m, dirs), 0, m1), buf0, buf0, 0, dirs, files), fd ∈ of, m ∈ files, m0 ≤ m1, n0 ≤ # buf0, psynced → asynced, ⌊err1⌋ ∨ err1 = ESUCCESS ⊦ ino = 0, mode ≠ MODE_R ∧ mode ≠ MODE_RW |
⊦ read-inv(n0, n1, inode, buf0, buf1, n, dirs, files) ↔ afs-cons(dirs, files) ∧ # buf0 = # buf1 ∧ inode.ino ∈ files ∧ files[inode.ino].size = inode.size ∧ n0 + n ≤ n1 ∧ n0 + n ≤ inode.size ∧ n1 - n0 ≤ # buf0 ∧ read-inv(n0, n1, buf0, buf1, n, files[inode.ino].content)
Used simplifier rules: ⊦ mkinode(m, md, boolvar, m0, m1, m2).ino = m; (s)% ⊦ mkinode(m, md, boolvar, m0, m1, m2).size = m2; (s)% ⊦ m + n - m = n; (s)%a: ⊦ (m + n0) + n1 = m + n0 + n1; from specification nat-basic%c: ⊦ m + n = n + m; from specification nat-basic% ⊦ m < n → (n ≤ m ↔ false); (s) Used terms: files, dirs, ino, buf1, buf0, mkinode(m, md, false, # links(m, dirs), 0, m1), m0 + n0, m0