| afs_dirs = cache_dirs, afs_files = (cache_files ⊕ cache_pcache) ⊕ cache_icache, err = err0, m ≠ ROOT_INO, afs-cons(cache_dirs, (cache_files ⊕ cache_pcache) ⊕ cache_icache), afs-cons(cache_dirs, cache_files), dcache-cons(cache_dcache, cache_dirs, cache_files), icache-cons(cache_icache, cache_dirs, cache_files), pcache-cons(cache_pcache, cache_dirs, cache_files), synced(cache_dirs, cache_icache, cache_pcache), cache_sync → synced(cache_files, cache_icache, cache_pcache), m ∈ cache_dirs ∧ m0 = cache_dirs[m].nlink ∧ m2 = cache_dirs[m].size ∧ m1 = cache_dirs[m].nsubdirs ∧ boolvar ∨ m ∈ cache_files ∧ m0 = ((cache_files ⊕ cache_pcache) ⊕ cache_icache)[m].nlink ∧ m1 = 0 ∧ ¬ boolvar ⊦ ⟪cache_evict#(mkinode(m, md, boolvar, m0, m1, m2), cache_asynced; err, cache_dirs, cache_files, cache_icache, cache_pcache)⟫ ⟨afs_evict#(mkinode(m, md, boolvar, m0, m1, m2), cache_asynced; err0, afs_dirs, afs_files)⟩ (afs_dirs = cache_dirs ∧ afs_files = (cache_files ⊕ cache_pcache) ⊕ cache_icache ∧ err = err0) |
asynced0 ↔ cache_asynced, afs_dirs = cache_dirs, afs_files = (cache_files ⊕ cache_pcache) ⊕ cache_icache, dirs = cache_dirs, err = err0, files = cache_files, icache = cache_icache, inode = mkinode(m, md, boolvar, m0, m1, m2), pcache = cache_pcache, afs-cons(cache_dirs, cache_files), afs-cons(cache_dirs, (cache_files ⊕ cache_pcache) ⊕ cache_icache), dcache-cons(cache_dcache, cache_dirs, cache_files), icache-cons(cache_icache, cache_dirs, cache_files), pcache-cons(cache_pcache, cache_dirs, cache_files), synced(cache_dirs, cache_icache, cache_pcache), cache_sync → synced(cache_files, cache_icache, cache_pcache), m ∈ cache_dirs ∧ m0 = cache_dirs[m].nlink ∧ m2 = cache_dirs[m].size ∧ m1 = cache_dirs[m].nsubdirs ∧ boolvar ∨ m ∈ cache_files ∧ m0 = ((cache_files ⊕ cache_pcache) ⊕ cache_icache)[m].nlink ∧ m1 = 0 ∧ ¬ boolvar ⊦ ⟪if pre-evict(inode, dirs, files) then let asynced = inode.directory in {afs_evict#(inode, asynced0; err, dirs, files); if err = ESUCCESS ∧ inode.nlink = 0 then {icache_delete#(inode.ino; err, icache); if ¬ asynced then pcache_evict#(inode.ino; err, pcache)}} else abort⟫ ⟨afs_evict#(mkinode(m, md, boolvar, m0, m1, m2), cache_asynced; err0, afs_dirs, afs_files)⟩ (afs_dirs = dirs ∧ afs_files = (files ⊕ pcache) ⊕ icache ∧ err = err0), m = ROOT_INO
Used simplifier rules: cache_evict#(INODE, ASYNCED; ERR, DIRS, FILES, ICACHE, PCACHE) {if pre-evict(INODE, DIRS, FILES) then let DIRP = INODE.directory in {afs_evict#(INODE, ASYNCED; ERR, DIRS, FILES); if ERR = ESUCCESS ∧ INODE.nlink = 0 then {icache_delete#(INODE.ino; ERR, ICACHE); if ¬ DIRP then pcache_evict#(INODE.ino; ERR, PCACHE)}} else abort };