| wlar[n1] = wl-entry(m1, stat0), wlar[n] = wl-entry(m0, stat), wlar0 = wlar, n ≠ n1, n1 < # wlar, n < # wlar, v ∈ vols ∧ m < # vols[v] ∧ vols[v][m] = ⌜n1⌝ ∨ v = VTBL_VOLID ∧ m = VTBL_LNUM ∧ vtblpnum = n1 ⊦ [ubi_atomic_leb_change#(v, m, n, n0, buf, EB_PAGE_SIZE; vols, wlar, q, bflipset, vtblpnum, sqnum, apebs; err)] ( sum-of-differences(ecs(wlar).max, ecs(wlar)) = sum-of-differences(ecs(wlar0).max, ecs(wlar0)) ∧ ecs(wlar) = ecs(wlar0) ∧ (err = ESUCCESS → wlar[n].ec = m0 ∧ wlar[n1].ec = m1)) |
wlar[n2] = wl-entry(m0, stat), wlar[n1] = wl-entry(m1, stat0), n = n0, vtblpnum0 = vtblpnum, vtblpnum1 = EB_PAGE_SIZE, vtblpnum2 = n2, vtblpnum3 = m, wlar0 = wlar, n2 < # wlar, n1 < # wlar, v ∈ vols ∧ m < # vols[v] ∧ vols[v][m] = ⌜n1⌝ ∨ v = VTBL_VOLID ∧ m = VTBL_LNUM ∧ vtblpnum = n1 ⊦ [err := ESUCCESS; n := datasize(buf, n); let m = ? in {ubi_next_sqnum#(; sqnum; m); let avhdr = avidhdr(v, vtblpnum3, m, n, 0) in {if n ≠ 0 then avhdr.checksum := checksum(buf, n); aubi_io_write_vidhdr#(vtblpnum2, avhdr; apebs; err); if err = ESUCCESS then if n > 0 then aubi_io_write_data_wl#(vtblpnum2, align↑(n, vtblpnum1), buf; apebs; err); if err = ESUCCESS then {if v = VTBL_VOLID ∧ vtblpnum3 = VTBL_LNUM then {ubi_wl_put_peb#(VTBL_VOLID × VTBL_LNUM, vtblpnum0; wlar, q); bflipset := bflipset -- vtblpnum0; vtblpnum0 := vtblpnum2} else {if vols[v][vtblpnum3] ≠ unmapped then let vtblpnum = vols[v][vtblpnum3].pnum in {ubi_wl_put_peb#(v × vtblpnum3, vtblpnum; wlar, q); bflipset := bflipset -- vtblpnum}; vols[v][vtblpnum3] := ⌜vtblpnum2⌝ }; wlar[vtblpnum2].status := used} else ubi_wl_put_peb#(none, vtblpnum2; wlar, q)}}] ( sum-of-differences(ecs(wlar).max, ecs(wlar)) = sum-of-differences(ecs(wlar0).max, ecs(wlar0)) ∧ ecs(wlar) = ecs(wlar0) ∧ (err = ESUCCESS → wlar[n2].ec = m0 ∧ wlar[n1].ec = m1)), n2 = n1
Used simplifier rules: ubi_atomic_leb_change# (VOLID, LNUM, TO, N, BUF, PAGESIZE ; VOLS, WLARRAY, ERASEQ, BFLIPSET, VTBLPNUM, SQNUM, APEBS ; ERR ) {ERR := ESUCCESS; N := datasize(BUF, N); let M = ? in {ubi_next_sqnum#(; SQNUM; M); let AVHDR = avidhdr(VOLID, LNUM, M, N, 0) in {if N ≠ 0 then AVHDR.checksum := checksum(BUF, N); aubi_io_write_vidhdr#(TO, AVHDR; APEBS; ERR); if ERR = ESUCCESS then if N > 0 then aubi_io_write_data_wl# (TO, align↑(N, PAGESIZE), BUF; APEBS; ERR); if ERR = ESUCCESS then {if VOLID = VTBL_VOLID ∧ LNUM = VTBL_LNUM then {ubi_wl_put_peb# (VTBL_VOLID × VTBL_LNUM, VTBLPNUM ; WLARRAY, ERASEQ); BFLIPSET := BFLIPSET -- VTBLPNUM; VTBLPNUM := TO} else {if VOLS[VOLID][LNUM] ≠ unmapped then let PNUM = VOLS[VOLID][LNUM].pnum in {ubi_wl_put_peb# (VOLID × LNUM, PNUM; WLARRAY, ERASEQ); BFLIPSET := BFLIPSET -- PNUM}; VOLS[VOLID][LNUM] := ⌜TO⌝ }; WLARRAY[TO].status := used} else ubi_wl_put_peb#(none, TO; WLARRAY, ERASEQ)}} };