| asynced2 ↔ asynced, asynced1 ↔ asynced0, inode = mkinode(m, md, boolvar, m0, m1, m2), inode0 = inode, afs-cons(dirs, files), dcache-cons(dcache, dirs, files), icache-cons(icache, dirs, files), pcache-cons(pcache, dirs, files), synced(dirs, icache, pcache), asynced → synced(files, icache, pcache), m ∈ dirs ∧ m0 = dirs[m].nlink ∧ m2 = dirs[m].size ∧ m1 = dirs[m].nsubdirs ∧ boolvar ∨ m ∈ files ∧ m0 = files[m].nlink ∧ m1 = 0 ∧ ¬ boolvar ⊦ ⟪if pre-write-inode(inode0, dirs, files) then let asynced0 = true, inode = ?, asynced = false in {if asynced2 ∨ inode0.directory then {afs_write_inode#(inode0; err, dirs, files; asynced1); asynced0 := false} else err := ESUCCESS; if err = ESUCCESS then icache_get#(inode0.ino, icache; asynced, inode, err); if err = ESUCCESS ∧ asynced then {inode.meta := inode0.meta; if ¬ inode0.directory then inode.size := inode0.size; icache_set#(inode, asynced0; err, icache)} else if asynced0 then err := EFAIL} else abort⟫ ( icache-cons(icache, dirs, files) ∧ dcache-cons(dcache, dirs, files) ∧ pcache-cons(pcache, dirs, files) ∧ synced(dirs, icache, pcache) ∧ (asynced → synced(files, icache, pcache)) ∧ afs-cons(dirs, files)) |
asynced1 ↔ asynced0, asynced2 ↔ asynced, inode = mkinode(m, md, boolvar, m0, m1, m2), inode0 = inode, afs-cons(dirs, files), dcache-cons(dcache, dirs, files), icache-cons(icache, dirs, files), pcache-cons(pcache, dirs, files), pre-write-inode(inode0, dirs, files), synced(dirs, icache, pcache), asynced → synced(files, icache, pcache), m ∈ dirs ∧ m0 = dirs[m].nlink ∧ m2 = dirs[m].size ∧ m1 = dirs[m].nsubdirs ∧ boolvar ∨ m ∈ files ∧ m0 = files[m].nlink ∧ m1 = 0 ∧ ¬ boolvar ⊦ ⟪let asynced0 = true, inode = ?, asynced = false in {if asynced2 ∨ inode0.directory then {afs_write_inode#(inode0; err, dirs, files; asynced1); asynced0 := false} else err := ESUCCESS; if err = ESUCCESS then icache_get#(inode0.ino, icache; asynced, inode, err); if err = ESUCCESS ∧ asynced then {inode.meta := inode0.meta; if ¬ inode0.directory then inode.size := inode0.size; icache_set#(inode, asynced0; err, icache)} else if asynced0 then err := EFAIL}⟫ ( icache-cons(icache, dirs, files) ∧ dcache-cons(dcache, dirs, files) ∧ pcache-cons(pcache, dirs, files) ∧ synced(dirs, icache, pcache) ∧ (asynced → synced(files, icache, pcache)) ∧ afs-cons(dirs, files))
asynced1 ↔ asynced0, asynced2 ↔ asynced, inode = mkinode(m, md, boolvar, m0, m1, m2), inode0 = inode, afs-cons(dirs, files), dcache-cons(dcache, dirs, files), icache-cons(icache, dirs, files), pcache-cons(pcache, dirs, files), synced(dirs, icache, pcache), asynced → synced(files, icache, pcache), m ∈ dirs ∧ m0 = dirs[m].nlink ∧ m2 = dirs[m].size ∧ m1 = dirs[m].nsubdirs ∧ boolvar ∨ m ∈ files ∧ m0 = files[m].nlink ∧ m1 = 0 ∧ ¬ boolvar ⊦ ⟪abort⟫ ( icache-cons(icache, dirs, files) ∧ dcache-cons(dcache, dirs, files) ∧ pcache-cons(pcache, dirs, files) ∧ synced(dirs, icache, pcache) ∧ (asynced → synced(files, icache, pcache)) ∧ afs-cons(dirs, files)), pre-write-inode(inode0, dirs, files)