Lines Matching +full:rs +full:-
1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2022-2023 Oracle. All Rights Reserved.
122 error = xfs_rmap_alloc(sc->tp, sc->sa.agf_bp, sc->sa.pag, agbno, 1, in xreap_put_freelist()
128 error = xfs_alloc_read_agfl(sc->sa.pag, sc->tp, &agfl_bp); in xreap_put_freelist()
132 error = xfs_alloc_put_freelist(sc->sa.pag, sc->tp, sc->sa.agf_bp, in xreap_put_freelist()
136 xfs_extent_busy_insert(sc->tp, sc->sa.pag, agbno, 1, in xreap_put_freelist()
143 static inline bool xreap_dirty(const struct xreap_state *rs) in xreap_dirty() argument
145 if (rs->force_roll) in xreap_dirty()
147 if (rs->deferred) in xreap_dirty()
149 if (rs->invalidated) in xreap_dirty()
151 if (rs->total_deferred) in xreap_dirty()
164 static inline bool xreap_want_roll(const struct xreap_state *rs) in xreap_want_roll() argument
166 if (rs->force_roll) in xreap_want_roll()
168 if (rs->deferred > XREP_MAX_ITRUNCATE_EFIS) in xreap_want_roll()
170 if (rs->invalidated > XREAP_MAX_BINVAL) in xreap_want_roll()
175 static inline void xreap_reset(struct xreap_state *rs) in xreap_reset() argument
177 rs->total_deferred += rs->deferred; in xreap_reset()
178 rs->deferred = 0; in xreap_reset()
179 rs->invalidated = 0; in xreap_reset()
180 rs->force_roll = false; in xreap_reset()
193 xreap_want_defer_finish(const struct xreap_state *rs) in xreap_want_defer_finish() argument
195 if (rs->force_roll) in xreap_want_defer_finish()
197 if (rs->total_deferred > XREAP_MAX_DEFER_CHAIN) in xreap_want_defer_finish()
202 static inline void xreap_defer_finish_reset(struct xreap_state *rs) in xreap_defer_finish_reset() argument
204 rs->total_deferred = 0; in xreap_defer_finish_reset()
205 rs->deferred = 0; in xreap_defer_finish_reset()
206 rs->invalidated = 0; in xreap_defer_finish_reset()
207 rs->force_roll = false; in xreap_defer_finish_reset()
213 struct xreap_state *rs, in xreap_agextent_binval() argument
217 struct xfs_scrub *sc = rs->sc; in xreap_agextent_binval()
218 struct xfs_perag *pag = sc->sa.pag; in xreap_agextent_binval()
219 struct xfs_mount *mp = sc->mp; in xreap_agextent_binval()
220 xfs_agnumber_t agno = sc->sa.pag->pag_agno; in xreap_agextent_binval()
225 * Avoid invalidating AG headers and post-EOFS blocks because we never in xreap_agextent_binval()
229 !xfs_verify_agbno(pag, agbno_next - 1)) in xreap_agextent_binval()
247 max_fsbs = min_t(xfs_agblock_t, agbno_next - bno, in xreap_agextent_binval()
256 error = xfs_buf_incore(mp->m_ddev_targp, daddr, in xreap_agextent_binval()
262 xfs_trans_bjoin(sc->tp, bp); in xreap_agextent_binval()
263 xfs_trans_binval(sc->tp, bp); in xreap_agextent_binval()
264 rs->invalidated++; in xreap_agextent_binval()
271 if (rs->invalidated > XREAP_MAX_BINVAL) { in xreap_agextent_binval()
272 *aglenp -= agbno_next - bno; in xreap_agextent_binval()
281 trace_xreap_agextent_binval(sc->sa.pag, agbno, *aglenp); in xreap_agextent_binval()
286 * call. Cross-linked blocks should have their reverse mappings removed, but
287 * single-owner extents can be freed. AGFL blocks can only be put back one at
292 struct xreap_state *rs, in xreap_agextent_select() argument
298 struct xfs_scrub *sc = rs->sc; in xreap_agextent_select()
308 cur = xfs_rmapbt_init_cursor(sc->mp, sc->tp, sc->sa.agf_bp, in xreap_agextent_select()
309 sc->sa.pag); in xreap_agextent_select()
310 error = xfs_rmap_has_other_keys(cur, agbno, 1, rs->oinfo, in xreap_agextent_select()
316 if (rs->resv == XFS_AG_RESV_AGFL) in xreap_agextent_select()
326 error = xfs_rmap_has_other_keys(cur, bno, 1, rs->oinfo, in xreap_agextent_select()
340 trace_xreap_agextent_select(sc->sa.pag, agbno, len, *crosslinked); in xreap_agextent_select()
352 struct xreap_state *rs, in xreap_agextent_iter() argument
357 struct xfs_scrub *sc = rs->sc; in xreap_agextent_iter()
361 fsbno = XFS_AGB_TO_FSB(sc->mp, sc->sa.pag->pag_agno, agbno); in xreap_agextent_iter()
370 * metadata structure is crosslinked with a multi-block structure in xreap_agextent_iter()
377 trace_xreap_dispose_unmap_extent(sc->sa.pag, agbno, *aglenp); in xreap_agextent_iter()
379 rs->force_roll = true; in xreap_agextent_iter()
380 return xfs_rmap_free(sc->tp, sc->sa.agf_bp, sc->sa.pag, agbno, in xreap_agextent_iter()
381 *aglenp, rs->oinfo); in xreap_agextent_iter()
384 trace_xreap_dispose_free_extent(sc->sa.pag, agbno, *aglenp); in xreap_agextent_iter()
392 xreap_agextent_binval(rs, agbno, aglenp); in xreap_agextent_iter()
394 ASSERT(xreap_want_roll(rs)); in xreap_agextent_iter()
399 if (rs->resv == XFS_AG_RESV_AGFL) { in xreap_agextent_iter()
405 rs->force_roll = true; in xreap_agextent_iter()
413 error = __xfs_free_extent_later(sc->tp, fsbno, *aglenp, rs->oinfo, in xreap_agextent_iter()
414 rs->resv, true); in xreap_agextent_iter()
418 rs->deferred++; in xreap_agextent_iter()
423 * Break an AG metadata extent into sub-extents by fate (crosslinked, not
424 * crosslinked), and dispose of each sub-extent separately.
432 struct xreap_state *rs = priv; in xreap_agmeta_extent() local
433 struct xfs_scrub *sc = rs->sc; in xreap_agmeta_extent()
439 ASSERT(sc->ip == NULL); in xreap_agmeta_extent()
445 error = xreap_agextent_select(rs, agbno, agbno_next, in xreap_agmeta_extent()
450 error = xreap_agextent_iter(rs, agbno, &aglen, crosslinked); in xreap_agmeta_extent()
454 if (xreap_want_defer_finish(rs)) { in xreap_agmeta_extent()
458 xreap_defer_finish_reset(rs); in xreap_agmeta_extent()
459 } else if (xreap_want_roll(rs)) { in xreap_agmeta_extent()
463 xreap_reset(rs); in xreap_agmeta_extent()
480 struct xreap_state rs = { in xrep_reap_agblocks() local
487 ASSERT(xfs_has_rmapbt(sc->mp)); in xrep_reap_agblocks()
488 ASSERT(sc->ip == NULL); in xrep_reap_agblocks()
490 error = xagb_bitmap_walk(bitmap, xreap_agmeta_extent, &rs); in xrep_reap_agblocks()
494 if (xreap_dirty(&rs)) in xrep_reap_agblocks()