| files[m] = mkfile(m1, md, # links(m, dirs), content), of0[fd] = mkfile(m, mode, m0), err0 = ESUCCESS, fid = ofh0[fd].fid, fs = abs-files(files), ofh = ofh0 -- fd, ofh0 = abs-of(of0), root.dir?, dom of0 < ino0, abs(root, ROOT_INO)(dirs), afs-cons(dirs, files), fids-cons(root, abs-files(files), abs-of(of0)), of-cons(of0, dirs, files), of-cons(of0 -- fd, dirs, files), fd ∈ ofh0, m ∈ files, fd ∈ of0, psynced → asynced ⊦ ⟨fs := fs -- fid⟩ (ofh = abs-of(of0 -- fd) ∧ fs = abs-files(files) ∧ (psynced → asynced) ∧ ESUCCESS = err0), # links(m, dirs) = 0, links(m, dirs) = ∅, m = ROOT_INO, is-open(m, of0 -- fd), fid ∈ root.fids, fid ∈ ofh.fids |
⊦ ⌜ino⌝ ∈ abs-of(of).fids ↔ is-open(ino, of)
⊦ n ∈ files ∧ abs(tree, ROOT_INO)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (⌜n⌝ ∈ tree.fids ↔ links(n, dirs) ≠ ∅)
Used simplifier rules: of: ⊦ ⌜ino⌝ ∈ abs-of(of).fids ↔ is-open(ino, of);%file-fid: ⊦ n ∈ files ∧ abs(tree, ROOT_INO)(dirs) ∧ fids-cons(tree, abs-files(files), ofh) ∧ afs-cons(dirs, files) → (⌜n⌝ ∈ tree.fids ↔ links(n, dirs) ≠ ∅);% ⊦ fd ∈ abs-of(of) ↔ fd ∈ of; (s)%fd ∈ of ⊦ abs-of(of)[fd] = mkfh(⌜of[fd].ino⌝ , of[fd].mode, of[fd].pos); (s)% ⊦ mkfh(fid, mode, m).fid = fid; (s)% ⊦ abs-of(of) -- fd = abs-of(of -- fd); (s)% ⊦ abs-files(files) -- ⌜ino⌝ = abs-files(files -- ino); (s)% ⊦ mkfile(m, mode, m0).ino = m; (s)