Lines Matching +full:sub +full:- +full:blocks

1 // SPDX-License-Identifier: GPL-2.0-or-later
3 * Copyright (C) 2022-2023 Oracle. All Rights Reserved.
46 * Disposal of Blocks from Old Metadata
49 * to dispose of the blocks that (we think) the old btree was using.
52 * blocks with the same rmap owner that are owned by another data structure
54 * remaining in bitmap are the old btree's blocks.
57 * blocks on disk. The rmap data can tell us if there are multiple owners, so
64 * will be rebuilt (atop different blocks), thereby removing all the cross
126 error = xfs_rmap_alloc(sc->tp, sc->sa.agf_bp, sc->sa.pag, agbno, 1, in xreap_put_freelist()
132 error = xfs_alloc_read_agfl(sc->sa.pag, sc->tp, &agfl_bp); in xreap_put_freelist()
136 error = xfs_alloc_put_freelist(sc->sa.pag, sc->tp, sc->sa.agf_bp, in xreap_put_freelist()
140 xfs_extent_busy_insert(sc->tp, sc->sa.pag, agbno, 1, in xreap_put_freelist()
149 if (rs->force_roll) in xreap_dirty()
151 if (rs->deferred) in xreap_dirty()
153 if (rs->invalidated) in xreap_dirty()
155 if (rs->total_deferred) in xreap_dirty()
170 if (rs->force_roll) in xreap_want_roll()
172 if (rs->deferred > XREP_MAX_ITRUNCATE_EFIS) in xreap_want_roll()
174 if (rs->invalidated > XREAP_MAX_BINVAL) in xreap_want_roll()
181 rs->total_deferred += rs->deferred; in xreap_reset()
182 rs->deferred = 0; in xreap_reset()
183 rs->invalidated = 0; in xreap_reset()
184 rs->force_roll = false; in xreap_reset()
199 if (rs->force_roll) in xreap_want_defer_finish()
201 if (rs->total_deferred > XREAP_MAX_DEFER_CHAIN) in xreap_want_defer_finish()
208 rs->total_deferred = 0; in xreap_defer_finish_reset()
209 rs->deferred = 0; in xreap_defer_finish_reset()
210 rs->invalidated = 0; in xreap_defer_finish_reset()
211 rs->force_roll = false; in xreap_defer_finish_reset()
221 struct xfs_scrub *sc = rs->sc; in xreap_agextent_binval()
222 struct xfs_perag *pag = sc->sa.pag; in xreap_agextent_binval()
223 struct xfs_mount *mp = sc->mp; in xreap_agextent_binval()
224 xfs_agnumber_t agno = sc->sa.pag->pag_agno; in xreap_agextent_binval()
229 * Avoid invalidating AG headers and post-EOFS blocks because we never in xreap_agextent_binval()
233 !xfs_verify_agbno(pag, agbno_next - 1)) in xreap_agextent_binval()
237 * If there are incore buffers for these blocks, invalidate them. We in xreap_agextent_binval()
251 max_fsbs = min_t(xfs_agblock_t, agbno_next - bno, in xreap_agextent_binval()
260 error = xfs_buf_incore(mp->m_ddev_targp, daddr, in xreap_agextent_binval()
266 xfs_trans_bjoin(sc->tp, bp); in xreap_agextent_binval()
267 xfs_trans_binval(sc->tp, bp); in xreap_agextent_binval()
268 rs->invalidated++; in xreap_agextent_binval()
275 if (rs->invalidated > XREAP_MAX_BINVAL) { in xreap_agextent_binval()
276 *aglenp -= agbno_next - bno; in xreap_agextent_binval()
285 trace_xreap_agextent_binval(sc->sa.pag, agbno, *aglenp); in xreap_agextent_binval()
289 * Figure out the longest run of blocks that we can dispose of with a single
290 * call. Cross-linked blocks should have their reverse mappings removed, but
291 * single-owner extents can be freed. AGFL blocks can only be put back one at
302 struct xfs_scrub *sc = rs->sc; in xreap_agextent_select()
312 cur = xfs_rmapbt_init_cursor(sc->mp, sc->tp, sc->sa.agf_bp, in xreap_agextent_select()
313 sc->sa.pag); in xreap_agextent_select()
314 error = xfs_rmap_has_other_keys(cur, agbno, 1, rs->oinfo, in xreap_agextent_select()
319 /* AGFL blocks can only be deal with one at a time. */ in xreap_agextent_select()
320 if (rs->resv == XFS_AG_RESV_AGFL) in xreap_agextent_select()
324 * Figure out how many of the subsequent blocks have the same crosslink in xreap_agextent_select()
330 error = xfs_rmap_has_other_keys(cur, bno, 1, rs->oinfo, in xreap_agextent_select()
344 trace_xreap_agextent_select(sc->sa.pag, agbno, len, *crosslinked); in xreap_agextent_select()
352 * number of blocks disposed of will be returned in @aglenp.
361 struct xfs_scrub *sc = rs->sc; in xreap_agextent_iter()
365 fsbno = XFS_AGB_TO_FSB(sc->mp, sc->sa.pag->pag_agno, agbno); in xreap_agextent_iter()
374 * metadata structure is crosslinked with a multi-block structure in xreap_agextent_iter()
381 trace_xreap_dispose_unmap_extent(sc->sa.pag, agbno, *aglenp); in xreap_agextent_iter()
383 rs->force_roll = true; in xreap_agextent_iter()
385 if (rs->oinfo == &XFS_RMAP_OINFO_COW) { in xreap_agextent_iter()
391 xfs_refcount_free_cow_extent(sc->tp, fsbno, *aglenp); in xreap_agextent_iter()
395 return xfs_rmap_free(sc->tp, sc->sa.agf_bp, sc->sa.pag, agbno, in xreap_agextent_iter()
396 *aglenp, rs->oinfo); in xreap_agextent_iter()
399 trace_xreap_dispose_free_extent(sc->sa.pag, agbno, *aglenp); in xreap_agextent_iter()
420 if (rs->oinfo == &XFS_RMAP_OINFO_COW) { in xreap_agextent_iter()
421 ASSERT(rs->resv == XFS_AG_RESV_NONE); in xreap_agextent_iter()
423 xfs_refcount_free_cow_extent(sc->tp, fsbno, *aglenp); in xreap_agextent_iter()
424 error = xfs_free_extent_later(sc->tp, fsbno, *aglenp, NULL, in xreap_agextent_iter()
425 rs->resv, true); in xreap_agextent_iter()
429 rs->force_roll = true; in xreap_agextent_iter()
433 /* Put blocks back on the AGFL one at a time. */ in xreap_agextent_iter()
434 if (rs->resv == XFS_AG_RESV_AGFL) { in xreap_agextent_iter()
440 rs->force_roll = true; in xreap_agextent_iter()
445 * Use deferred frees to get rid of the old btree blocks to try to in xreap_agextent_iter()
446 * minimize the window in which we could crash and lose the old blocks. in xreap_agextent_iter()
450 error = xfs_free_extent_later(sc->tp, fsbno, *aglenp, rs->oinfo, in xreap_agextent_iter()
451 rs->resv, true); in xreap_agextent_iter()
455 rs->deferred++; in xreap_agextent_iter()
456 if (rs->deferred % 2 == 0) in xreap_agextent_iter()
457 xfs_defer_add_barrier(sc->tp); in xreap_agextent_iter()
462 * Break an AG metadata extent into sub-extents by fate (crosslinked, not
463 * crosslinked), and dispose of each sub-extent separately.
472 struct xfs_scrub *sc = rs->sc; in xreap_agmeta_extent()
477 ASSERT(sc->ip == NULL); in xreap_agmeta_extent()
525 ASSERT(xfs_has_rmapbt(sc->mp)); in xrep_reap_agblocks()
526 ASSERT(sc->ip == NULL); in xrep_reap_agblocks()
539 * Break a file metadata extent into sub-extents by fate (crosslinked, not
540 * crosslinked), and dispose of each sub-extent separately. The extent must
550 struct xfs_scrub *sc = rs->sc; in xreap_fsmeta_extent()
551 xfs_agnumber_t agno = XFS_FSB_TO_AGNO(sc->mp, fsbno); in xreap_fsmeta_extent()
552 xfs_agblock_t agbno = XFS_FSB_TO_AGBNO(sc->mp, fsbno); in xreap_fsmeta_extent()
557 ASSERT(sc->ip != NULL); in xreap_fsmeta_extent()
558 ASSERT(!sc->sa.pag); in xreap_fsmeta_extent()
561 * We're reaping blocks after repairing file metadata, which means that in xreap_fsmeta_extent()
564 sc->sa.pag = xfs_perag_get(sc->mp, agno); in xreap_fsmeta_extent()
565 if (!sc->sa.pag) in xreap_fsmeta_extent()
566 return -EFSCORRUPTED; in xreap_fsmeta_extent()
568 error = xfs_alloc_read_agf(sc->sa.pag, sc->tp, 0, &sc->sa.agf_bp); in xreap_fsmeta_extent()
600 xfs_trans_bhold(sc->tp, sc->sa.agf_bp); in xreap_fsmeta_extent()
601 error = xfs_trans_roll_inode(&sc->tp, sc->ip); in xreap_fsmeta_extent()
602 xfs_trans_bjoin(sc->tp, sc->sa.agf_bp); in xreap_fsmeta_extent()
612 xfs_trans_brelse(sc->tp, sc->sa.agf_bp); in xreap_fsmeta_extent()
613 sc->sa.agf_bp = NULL; in xreap_fsmeta_extent()
615 xfs_perag_put(sc->sa.pag); in xreap_fsmeta_extent()
616 sc->sa.pag = NULL; in xreap_fsmeta_extent()
637 ASSERT(xfs_has_rmapbt(sc->mp)); in xrep_reap_fsblocks()
638 ASSERT(sc->ip != NULL); in xrep_reap_fsblocks()