Lines Matching +full:max +full:- +full:adj

1 // SPDX-License-Identifier: GPL-2.0+
37 XFS_REFCOUNT_ADJUST_DECREASE = -1,
39 XFS_REFCOUNT_ADJUST_COW_FREE = -1,
61 cur->bc_rec.rc.rc_startblock = bno; in xfs_refcount_lookup_le()
62 cur->bc_rec.rc.rc_blockcount = 0; in xfs_refcount_lookup_le()
63 cur->bc_rec.rc.rc_domain = domain; in xfs_refcount_lookup_le()
81 cur->bc_rec.rc.rc_startblock = bno; in xfs_refcount_lookup_ge()
82 cur->bc_rec.rc.rc_blockcount = 0; in xfs_refcount_lookup_ge()
83 cur->bc_rec.rc.rc_domain = domain; in xfs_refcount_lookup_ge()
101 cur->bc_rec.rc.rc_startblock = bno; in xfs_refcount_lookup_eq()
102 cur->bc_rec.rc.rc_blockcount = 0; in xfs_refcount_lookup_eq()
103 cur->bc_rec.rc.rc_domain = domain; in xfs_refcount_lookup_eq()
107 /* Convert on-disk record to in-core format. */
115 start = be32_to_cpu(rec->refc.rc_startblock); in xfs_refcount_btrec_to_irec()
118 irec->rc_domain = XFS_REFC_DOMAIN_COW; in xfs_refcount_btrec_to_irec()
120 irec->rc_domain = XFS_REFC_DOMAIN_SHARED; in xfs_refcount_btrec_to_irec()
123 irec->rc_startblock = start; in xfs_refcount_btrec_to_irec()
124 irec->rc_blockcount = be32_to_cpu(rec->refc.rc_blockcount); in xfs_refcount_btrec_to_irec()
125 irec->rc_refcount = be32_to_cpu(rec->refc.rc_refcount); in xfs_refcount_btrec_to_irec()
134 if (irec->rc_blockcount == 0 || irec->rc_blockcount > XFS_REFC_LEN_MAX) in xfs_refcount_check_irec()
141 if (!xfs_verify_agbext(pag, irec->rc_startblock, irec->rc_blockcount)) in xfs_refcount_check_irec()
144 if (irec->rc_refcount == 0 || irec->rc_refcount > XFS_REFC_REFCOUNT_MAX) in xfs_refcount_check_irec()
155 if (irec->rc_blockcount == 0 || irec->rc_blockcount > XFS_REFC_LEN_MAX) in xfs_rtrefcount_check_irec()
162 if (!xfs_verify_rgbext(rtg, irec->rc_startblock, irec->rc_blockcount)) in xfs_rtrefcount_check_irec()
165 if (irec->rc_refcount == 0 || irec->rc_refcount > XFS_REFC_REFCOUNT_MAX) in xfs_rtrefcount_check_irec()
176 if (xfs_btree_is_rtrefcount(cur->bc_ops)) in xfs_refcount_check_btrec()
177 return xfs_rtrefcount_check_irec(to_rtg(cur->bc_group), irec); in xfs_refcount_check_btrec()
178 return xfs_refcount_check_irec(to_perag(cur->bc_group), irec); in xfs_refcount_check_btrec()
187 struct xfs_mount *mp = cur->bc_mp; in xfs_refcount_complain_bad_rec()
189 if (xfs_btree_is_rtrefcount(cur->bc_ops)) { in xfs_refcount_complain_bad_rec()
192 cur->bc_group->xg_gno, fa); in xfs_refcount_complain_bad_rec()
196 cur->bc_group->xg_gno, fa); in xfs_refcount_complain_bad_rec()
200 irec->rc_startblock, irec->rc_blockcount, irec->rc_refcount); in xfs_refcount_complain_bad_rec()
202 return -EFSCORRUPTED; in xfs_refcount_complain_bad_rec()
206 * Get the data from the pointed-to record.
247 start = xfs_refcount_encode_startblock(irec->rc_startblock, in xfs_refcount_update()
248 irec->rc_domain); in xfs_refcount_update()
250 rec.refc.rc_blockcount = cpu_to_be32(irec->rc_blockcount); in xfs_refcount_update()
251 rec.refc.rc_refcount = cpu_to_be32(irec->rc_refcount); in xfs_refcount_update()
274 cur->bc_rec.rc.rc_startblock = irec->rc_startblock; in xfs_refcount_insert()
275 cur->bc_rec.rc.rc_blockcount = irec->rc_blockcount; in xfs_refcount_insert()
276 cur->bc_rec.rc.rc_refcount = irec->rc_refcount; in xfs_refcount_insert()
277 cur->bc_rec.rc.rc_domain = irec->rc_domain; in xfs_refcount_insert()
282 if (XFS_IS_CORRUPT(cur->bc_mp, *i != 1)) { in xfs_refcount_insert()
284 error = -EFSCORRUPTED; in xfs_refcount_insert()
296 * where the record could be re-inserted, in case we want to increment or
312 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_delete()
314 error = -EFSCORRUPTED; in xfs_refcount_delete()
319 if (XFS_IS_CORRUPT(cur->bc_mp, *i != 1)) { in xfs_refcount_delete()
321 error = -EFSCORRUPTED; in xfs_refcount_delete()
342 * <------ adjustment range ------>
343 * ----+ +---+-----+ +--+--------+---------
345 * ----+ +---+-----+ +--+--------+---------
355 * <------ adjustment range ------>
356 * ----+ +---+-----+ +--+--------+----+----
358 * ----+ +---+-----+ +--+--------+----+----
366 * <------ adjustment range ------>
367 * ----+---+---+-----+-+--+--------+----+----
369 * ----+---+---+-----+-+--+--------+----+----
383 * <------ adjustment range ------>
384 * --------+---+-----+-+--+--------+----+----
386 * --------+---+-----+-+--+--------+----+----
393 * <------ adjustment range ------>
394 * --------+---+-----+-+--+--------+----+----
396 * --------+---+-----+-+--+--------+----+----
400 * <------ adjustment range ------>
401 * ----+ +---+ +--+--------+----+----
403 * ----+ +---+ +--+--------+----+----
416 return rc->rc_startblock + rc->rc_blockcount; in xfs_refc_next()
443 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_split_extent()
445 error = -EFSCORRUPTED; in xfs_refcount_split_extent()
459 tmp.rc_blockcount -= (agbno - rcext.rc_startblock); in xfs_refcount_split_extent()
466 tmp.rc_blockcount = agbno - rcext.rc_startblock; in xfs_refcount_split_extent()
470 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_split_extent()
472 error = -EFSCORRUPTED; in xfs_refcount_split_extent()
499 ASSERT(left->rc_domain == center->rc_domain); in xfs_refcount_merge_center_extents()
500 ASSERT(right->rc_domain == center->rc_domain); in xfs_refcount_merge_center_extents()
510 error = xfs_refcount_lookup_ge(cur, center->rc_domain, in xfs_refcount_merge_center_extents()
511 center->rc_startblock, &found_rec); in xfs_refcount_merge_center_extents()
514 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_center_extents()
516 error = -EFSCORRUPTED; in xfs_refcount_merge_center_extents()
523 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_center_extents()
525 error = -EFSCORRUPTED; in xfs_refcount_merge_center_extents()
529 if (center->rc_refcount > 1) { in xfs_refcount_merge_center_extents()
533 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_center_extents()
535 error = -EFSCORRUPTED; in xfs_refcount_merge_center_extents()
541 error = xfs_refcount_lookup_le(cur, left->rc_domain, in xfs_refcount_merge_center_extents()
542 left->rc_startblock, &found_rec); in xfs_refcount_merge_center_extents()
545 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_center_extents()
547 error = -EFSCORRUPTED; in xfs_refcount_merge_center_extents()
551 left->rc_blockcount = extlen; in xfs_refcount_merge_center_extents()
580 ASSERT(left->rc_domain == cleft->rc_domain); in xfs_refcount_merge_left_extent()
583 if (cleft->rc_refcount > 1) { in xfs_refcount_merge_left_extent()
584 error = xfs_refcount_lookup_le(cur, cleft->rc_domain, in xfs_refcount_merge_left_extent()
585 cleft->rc_startblock, &found_rec); in xfs_refcount_merge_left_extent()
588 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_left_extent()
590 error = -EFSCORRUPTED; in xfs_refcount_merge_left_extent()
597 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_left_extent()
599 error = -EFSCORRUPTED; in xfs_refcount_merge_left_extent()
605 error = xfs_refcount_lookup_le(cur, left->rc_domain, in xfs_refcount_merge_left_extent()
606 left->rc_startblock, &found_rec); in xfs_refcount_merge_left_extent()
609 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_left_extent()
611 error = -EFSCORRUPTED; in xfs_refcount_merge_left_extent()
615 left->rc_blockcount += cleft->rc_blockcount; in xfs_refcount_merge_left_extent()
620 *agbno += cleft->rc_blockcount; in xfs_refcount_merge_left_extent()
621 *aglen -= cleft->rc_blockcount; in xfs_refcount_merge_left_extent()
644 ASSERT(right->rc_domain == cright->rc_domain); in xfs_refcount_merge_right_extent()
650 if (cright->rc_refcount > 1) { in xfs_refcount_merge_right_extent()
651 error = xfs_refcount_lookup_le(cur, cright->rc_domain, in xfs_refcount_merge_right_extent()
652 cright->rc_startblock, &found_rec); in xfs_refcount_merge_right_extent()
655 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_right_extent()
657 error = -EFSCORRUPTED; in xfs_refcount_merge_right_extent()
664 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_right_extent()
666 error = -EFSCORRUPTED; in xfs_refcount_merge_right_extent()
672 error = xfs_refcount_lookup_le(cur, right->rc_domain, in xfs_refcount_merge_right_extent()
673 right->rc_startblock, &found_rec); in xfs_refcount_merge_right_extent()
676 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_merge_right_extent()
678 error = -EFSCORRUPTED; in xfs_refcount_merge_right_extent()
682 right->rc_startblock -= cright->rc_blockcount; in xfs_refcount_merge_right_extent()
683 right->rc_blockcount += cright->rc_blockcount; in xfs_refcount_merge_right_extent()
688 *aglen -= cright->rc_blockcount; in xfs_refcount_merge_right_extent()
713 left->rc_startblock = cleft->rc_startblock = NULLAGBLOCK; in xfs_refcount_find_left_extents()
714 error = xfs_refcount_lookup_le(cur, domain, agbno - 1, &found_rec); in xfs_refcount_find_left_extents()
723 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_find_left_extents()
725 error = -EFSCORRUPTED; in xfs_refcount_find_left_extents()
743 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_find_left_extents()
745 error = -EFSCORRUPTED; in xfs_refcount_find_left_extents()
764 cleft->rc_startblock = agbno; in xfs_refcount_find_left_extents()
765 cleft->rc_blockcount = min(aglen, in xfs_refcount_find_left_extents()
766 tmp.rc_startblock - agbno); in xfs_refcount_find_left_extents()
767 cleft->rc_refcount = 1; in xfs_refcount_find_left_extents()
768 cleft->rc_domain = domain; in xfs_refcount_find_left_extents()
776 cleft->rc_startblock = agbno; in xfs_refcount_find_left_extents()
777 cleft->rc_blockcount = aglen; in xfs_refcount_find_left_extents()
778 cleft->rc_refcount = 1; in xfs_refcount_find_left_extents()
779 cleft->rc_domain = domain; in xfs_refcount_find_left_extents()
806 right->rc_startblock = cright->rc_startblock = NULLAGBLOCK; in xfs_refcount_find_right_extents()
816 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_find_right_extents()
818 error = -EFSCORRUPTED; in xfs_refcount_find_right_extents()
836 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_find_right_extents()
838 error = -EFSCORRUPTED; in xfs_refcount_find_right_extents()
857 cright->rc_startblock = max(agbno, xfs_refc_next(&tmp)); in xfs_refcount_find_right_extents()
858 cright->rc_blockcount = right->rc_startblock - in xfs_refcount_find_right_extents()
859 cright->rc_startblock; in xfs_refcount_find_right_extents()
860 cright->rc_refcount = 1; in xfs_refcount_find_right_extents()
861 cright->rc_domain = domain; in xfs_refcount_find_right_extents()
869 cright->rc_startblock = agbno; in xfs_refcount_find_right_extents()
870 cright->rc_blockcount = aglen; in xfs_refcount_find_right_extents()
871 cright->rc_refcount = 1; in xfs_refcount_find_right_extents()
872 cright->rc_domain = domain; in xfs_refcount_find_right_extents()
888 return rc->rc_startblock != NULLAGBLOCK; in xfs_refc_valid()
897 if (irec->rc_refcount == XFS_REFC_REFCOUNT_MAX) in xfs_refc_merge_refcount()
899 return irec->rc_refcount + adjust; in xfs_refc_merge_refcount()
912 unsigned long long ulen = left->rc_blockcount; in xfs_refc_want_merge_center()
930 if (left->rc_refcount != new_refcount) in xfs_refc_want_merge_center()
932 if (right->rc_refcount != new_refcount) in xfs_refc_want_merge_center()
936 * The new record cannot exceed the max length. ulen is a ULL as the in xfs_refc_want_merge_center()
937 * individual record block counts can be up to (u32 - 1) in length in xfs_refc_want_merge_center()
940 ulen += cleft->rc_blockcount + right->rc_blockcount; in xfs_refc_want_merge_center()
954 unsigned long long ulen = left->rc_blockcount; in xfs_refc_want_merge_left()
967 if (left->rc_refcount != new_refcount) in xfs_refc_want_merge_left()
971 * The new record cannot exceed the max length. ulen is a ULL as the in xfs_refc_want_merge_left()
972 * individual record block counts can be up to (u32 - 1) in length in xfs_refc_want_merge_left()
975 ulen += cleft->rc_blockcount; in xfs_refc_want_merge_left()
988 unsigned long long ulen = right->rc_blockcount; in xfs_refc_want_merge_right()
1001 if (right->rc_refcount != new_refcount) in xfs_refc_want_merge_right()
1005 * The new record cannot exceed the max length. ulen is a ULL as the in xfs_refc_want_merge_right()
1006 * individual record block counts can be up to (u32 - 1) in length in xfs_refc_want_merge_right()
1009 ulen += cright->rc_blockcount; in xfs_refc_want_merge_right()
1091 * XXX: This is a pretty hand-wavy estimate. The penalty for guessing
1106 overhead = xfs_allocfree_block_count(cur->bc_mp, in xfs_refcount_still_have_space()
1107 cur->bc_refc.shape_changes); in xfs_refcount_still_have_space()
1108 overhead += cur->bc_maxlevels; in xfs_refcount_still_have_space()
1109 overhead *= cur->bc_mp->m_sb.sb_blocksize; in xfs_refcount_still_have_space()
1115 if (cur->bc_refc.nr_ops > 2 && in xfs_refcount_still_have_space()
1116 XFS_TEST_ERROR(false, cur->bc_mp, in xfs_refcount_still_have_space()
1120 if (cur->bc_refc.nr_ops == 0) in xfs_refcount_still_have_space()
1122 else if (overhead > cur->bc_tp->t_log_res) in xfs_refcount_still_have_space()
1124 return cur->bc_tp->t_log_res - overhead > in xfs_refcount_still_have_space()
1125 cur->bc_refc.nr_ops * XFS_REFCOUNT_ITEM_OVERHEAD; in xfs_refcount_still_have_space()
1136 if (xfs_btree_is_rtrefcount(cur->bc_ops)) in xrefc_free_extent()
1139 return xfs_free_extent_later(cur->bc_tp, in xrefc_free_extent()
1140 xfs_gbno_to_fsb(cur->bc_group, rec->rc_startblock), in xrefc_free_extent()
1141 rec->rc_blockcount, NULL, XFS_AG_RESV_NONE, flags); in xrefc_free_extent()
1155 enum xfs_refc_adjust_op adj) in xfs_refcount_adjust_extents() argument
1175 ext.rc_startblock = xfs_group_max_blocks(cur->bc_group); in xfs_refcount_adjust_extents()
1189 ext.rc_startblock - *agbno); in xfs_refcount_adjust_extents()
1190 tmp.rc_refcount = 1 + adj; in xfs_refcount_adjust_extents()
1199 cur->bc_refc.nr_ops++; in xfs_refcount_adjust_extents()
1205 if (XFS_IS_CORRUPT(cur->bc_mp, in xfs_refcount_adjust_extents()
1208 error = -EFSCORRUPTED; in xfs_refcount_adjust_extents()
1218 (*aglen) -= tmp.rc_blockcount; in xfs_refcount_adjust_extents()
1239 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_blockcount == 0) || in xfs_refcount_adjust_extents()
1240 XFS_IS_CORRUPT(cur->bc_mp, ext.rc_blockcount > *aglen)) { in xfs_refcount_adjust_extents()
1242 error = -EFSCORRUPTED; in xfs_refcount_adjust_extents()
1252 ext.rc_refcount += adj; in xfs_refcount_adjust_extents()
1254 cur->bc_refc.nr_ops++; in xfs_refcount_adjust_extents()
1263 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_adjust_extents()
1265 error = -EFSCORRUPTED; in xfs_refcount_adjust_extents()
1282 (*aglen) -= ext.rc_blockcount; in xfs_refcount_adjust_extents()
1297 enum xfs_refc_adjust_op adj) in xfs_refcount_adjust() argument
1303 if (adj == XFS_REFCOUNT_ADJUST_INCREASE) in xfs_refcount_adjust()
1329 agbno, aglen, adj, &shape_changed); in xfs_refcount_adjust()
1335 cur->bc_refc.shape_changes++; in xfs_refcount_adjust()
1338 error = xfs_refcount_adjust_extents(cur, agbno, aglen, adj); in xfs_refcount_adjust()
1359 struct xfs_mount *mp = cur->bc_mp; in xfs_refcount_continue_op()
1360 struct xfs_perag *pag = to_perag(cur->bc_group); in xfs_refcount_continue_op()
1363 ri->ri_blockcount))) { in xfs_refcount_continue_op()
1365 return -EFSCORRUPTED; in xfs_refcount_continue_op()
1368 ri->ri_startblock = xfs_agbno_to_fsb(pag, new_agbno); in xfs_refcount_continue_op()
1370 ASSERT(xfs_verify_fsbext(mp, ri->ri_startblock, ri->ri_blockcount)); in xfs_refcount_continue_op()
1371 ASSERT(pag_agno(pag) == XFS_FSB_TO_AGNO(mp, ri->ri_startblock)); in xfs_refcount_continue_op()
1389 struct xfs_mount *mp = tp->t_mountp; in xfs_refcount_finish_one()
1397 bno = XFS_FSB_TO_AGBNO(mp, ri->ri_startblock); in xfs_refcount_finish_one()
1402 return -EIO; in xfs_refcount_finish_one()
1408 if (rcur != NULL && rcur->bc_group != ri->ri_group) { in xfs_refcount_finish_one()
1409 nr_ops = rcur->bc_refc.nr_ops; in xfs_refcount_finish_one()
1410 shape_changes = rcur->bc_refc.shape_changes; in xfs_refcount_finish_one()
1416 struct xfs_perag *pag = to_perag(ri->ri_group); in xfs_refcount_finish_one()
1424 rcur->bc_refc.nr_ops = nr_ops; in xfs_refcount_finish_one()
1425 rcur->bc_refc.shape_changes = shape_changes; in xfs_refcount_finish_one()
1428 switch (ri->ri_type) { in xfs_refcount_finish_one()
1430 error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, in xfs_refcount_finish_one()
1434 if (ri->ri_blockcount > 0) in xfs_refcount_finish_one()
1438 error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, in xfs_refcount_finish_one()
1442 if (ri->ri_blockcount > 0) in xfs_refcount_finish_one()
1446 error = __xfs_refcount_cow_alloc(rcur, bno, ri->ri_blockcount); in xfs_refcount_finish_one()
1449 ri->ri_blockcount = 0; in xfs_refcount_finish_one()
1452 error = __xfs_refcount_cow_free(rcur, bno, ri->ri_blockcount); in xfs_refcount_finish_one()
1455 ri->ri_blockcount = 0; in xfs_refcount_finish_one()
1459 return -EFSCORRUPTED; in xfs_refcount_finish_one()
1461 if (!error && ri->ri_blockcount > 0) in xfs_refcount_finish_one()
1477 struct xfs_mount *mp = cur->bc_mp; in xfs_rtrefcount_continue_op()
1478 struct xfs_rtgroup *rtg = to_rtg(ri->ri_group); in xfs_rtrefcount_continue_op()
1481 ri->ri_blockcount))) { in xfs_rtrefcount_continue_op()
1483 return -EFSCORRUPTED; in xfs_rtrefcount_continue_op()
1486 ri->ri_startblock = xfs_rgbno_to_rtb(rtg, new_agbno); in xfs_rtrefcount_continue_op()
1488 ASSERT(xfs_verify_rtbext(mp, ri->ri_startblock, ri->ri_blockcount)); in xfs_rtrefcount_continue_op()
1502 struct xfs_mount *mp = tp->t_mountp; in xfs_rtrefcount_finish_one()
1503 struct xfs_rtgroup *rtg = to_rtg(ri->ri_group); in xfs_rtrefcount_finish_one()
1510 bno = xfs_rtb_to_rgbno(mp, ri->ri_startblock); in xfs_rtrefcount_finish_one()
1515 return -EIO; in xfs_rtrefcount_finish_one()
1521 if (rcur != NULL && rcur->bc_group != ri->ri_group) { in xfs_rtrefcount_finish_one()
1522 nr_ops = rcur->bc_refc.nr_ops; in xfs_rtrefcount_finish_one()
1523 shape_changes = rcur->bc_refc.shape_changes; in xfs_rtrefcount_finish_one()
1533 rcur->bc_refc.nr_ops = nr_ops; in xfs_rtrefcount_finish_one()
1534 rcur->bc_refc.shape_changes = shape_changes; in xfs_rtrefcount_finish_one()
1537 switch (ri->ri_type) { in xfs_rtrefcount_finish_one()
1539 error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, in xfs_rtrefcount_finish_one()
1543 if (ri->ri_blockcount > 0) in xfs_rtrefcount_finish_one()
1547 error = xfs_refcount_adjust(rcur, &bno, &ri->ri_blockcount, in xfs_rtrefcount_finish_one()
1551 if (ri->ri_blockcount > 0) in xfs_rtrefcount_finish_one()
1555 error = __xfs_refcount_cow_alloc(rcur, bno, ri->ri_blockcount); in xfs_rtrefcount_finish_one()
1558 ri->ri_blockcount = 0; in xfs_rtrefcount_finish_one()
1561 error = __xfs_refcount_cow_free(rcur, bno, ri->ri_blockcount); in xfs_rtrefcount_finish_one()
1564 ri->ri_blockcount = 0; in xfs_rtrefcount_finish_one()
1568 return -EFSCORRUPTED; in xfs_rtrefcount_finish_one()
1570 if (!error && ri->ri_blockcount > 0) in xfs_rtrefcount_finish_one()
1590 INIT_LIST_HEAD(&ri->ri_list); in __xfs_refcount_add()
1591 ri->ri_type = type; in __xfs_refcount_add()
1592 ri->ri_startblock = startblock; in __xfs_refcount_add()
1593 ri->ri_blockcount = blockcount; in __xfs_refcount_add()
1594 ri->ri_realtime = isrt; in __xfs_refcount_add()
1608 if (!xfs_has_reflink(tp->t_mountp)) in xfs_refcount_increase_extent()
1611 __xfs_refcount_add(tp, XFS_REFCOUNT_INCREASE, isrt, PREV->br_startblock, in xfs_refcount_increase_extent()
1612 PREV->br_blockcount); in xfs_refcount_increase_extent()
1624 if (!xfs_has_reflink(tp->t_mountp)) in xfs_refcount_decrease_extent()
1627 __xfs_refcount_add(tp, XFS_REFCOUNT_DECREASE, isrt, PREV->br_startblock, in xfs_refcount_decrease_extent()
1628 PREV->br_blockcount); in xfs_refcount_decrease_extent()
1632 * Given an AG extent, find the lowest-numbered run of shared blocks
1675 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_refcount_find_shared()
1677 error = -EFSCORRUPTED; in xfs_refcount_find_shared()
1693 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_refcount_find_shared()
1695 error = -EFSCORRUPTED; in xfs_refcount_find_shared()
1708 tmp.rc_blockcount -= (agbno - tmp.rc_startblock); in xfs_refcount_find_shared()
1713 *flen = min(tmp.rc_blockcount, agbno + aglen - *fbno); in xfs_refcount_find_shared()
1727 if (XFS_IS_CORRUPT(cur->bc_mp, i != 1)) { in xfs_refcount_find_shared()
1729 error = -EFSCORRUPTED; in xfs_refcount_find_shared()
1736 *flen = min(*flen + tmp.rc_blockcount, agbno + aglen - *fbno); in xfs_refcount_find_shared()
1753 * Because CoW uses delayed allocation in the in-core CoW fork, writeback
1762 * become mappings -- the reference count btree. The btree does not record
1769 * Minor nit: records for in-progress CoW allocations and records for shared
1781 * several reasons -- first, EFIs pin the tail of the log and would have to be
1784 * CoW fork; this partially takes care of (1) but extent-size reservations
1790 * held filesystem-wide at any given time. Recording them in the refcount
1805 enum xfs_refc_adjust_op adj) in xfs_refcount_adjust_cow_extents() argument
1822 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec && in xfs_refcount_adjust_cow_extents()
1825 error = -EFSCORRUPTED; in xfs_refcount_adjust_cow_extents()
1829 ext.rc_startblock = xfs_group_max_blocks(cur->bc_group); in xfs_refcount_adjust_cow_extents()
1835 switch (adj) { in xfs_refcount_adjust_cow_extents()
1838 if (XFS_IS_CORRUPT(cur->bc_mp, in xfs_refcount_adjust_cow_extents()
1841 error = -EFSCORRUPTED; in xfs_refcount_adjust_cow_extents()
1856 if (XFS_IS_CORRUPT(cur->bc_mp, found_tmp != 1)) { in xfs_refcount_adjust_cow_extents()
1858 error = -EFSCORRUPTED; in xfs_refcount_adjust_cow_extents()
1864 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_startblock != agbno)) { in xfs_refcount_adjust_cow_extents()
1866 error = -EFSCORRUPTED; in xfs_refcount_adjust_cow_extents()
1869 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_blockcount != aglen)) { in xfs_refcount_adjust_cow_extents()
1871 error = -EFSCORRUPTED; in xfs_refcount_adjust_cow_extents()
1874 if (XFS_IS_CORRUPT(cur->bc_mp, ext.rc_refcount != 1)) { in xfs_refcount_adjust_cow_extents()
1876 error = -EFSCORRUPTED; in xfs_refcount_adjust_cow_extents()
1885 if (XFS_IS_CORRUPT(cur->bc_mp, found_rec != 1)) { in xfs_refcount_adjust_cow_extents()
1887 error = -EFSCORRUPTED; in xfs_refcount_adjust_cow_extents()
1909 enum xfs_refc_adjust_op adj) in xfs_refcount_adjust_cow() argument
1931 &aglen, adj, &shape_changed); in xfs_refcount_adjust_cow()
1936 error = xfs_refcount_adjust_cow_extents(cur, agbno, aglen, adj); in xfs_refcount_adjust_cow()
1987 struct xfs_mount *mp = tp->t_mountp; in xfs_refcount_alloc_cow_extent()
2006 struct xfs_mount *mp = tp->t_mountp; in xfs_refcount_free_cow_extent()
2031 if (XFS_IS_CORRUPT(cur->bc_mp, in xfs_refcount_recover_extent()
2032 be32_to_cpu(rec->refc.rc_refcount) != 1)) { in xfs_refcount_recover_extent()
2034 return -EFSCORRUPTED; in xfs_refcount_recover_extent()
2039 INIT_LIST_HEAD(&rr->rr_list); in xfs_refcount_recover_extent()
2040 xfs_refcount_btrec_to_irec(rec, &rr->rr_rrec); in xfs_refcount_recover_extent()
2042 if (xfs_refcount_check_btrec(cur, &rr->rr_rrec) != NULL || in xfs_refcount_recover_extent()
2043 XFS_IS_CORRUPT(cur->bc_mp, in xfs_refcount_recover_extent()
2044 rr->rr_rrec.rc_domain != XFS_REFC_DOMAIN_COW)) { in xfs_refcount_recover_extent()
2047 return -EFSCORRUPTED; in xfs_refcount_recover_extent()
2050 list_add_tail(&rr->rr_list, debris); in xfs_refcount_recover_extent()
2059 struct xfs_mount *mp = xg->xg_mount; in xfs_refcount_recover_cow_leftovers()
2060 bool isrt = xg->xg_type == XG_TYPE_RTG; in xfs_refcount_recover_cow_leftovers()
2071 .rc.rc_startblock = -1U, in xfs_refcount_recover_cow_leftovers()
2076 /* reflink filesystems must not have groups larger than 2^31-1 blocks */ in xfs_refcount_recover_cow_leftovers()
2084 return -EOPNOTSUPP; in xfs_refcount_recover_cow_leftovers()
2087 return -EOPNOTSUPP; in xfs_refcount_recover_cow_leftovers()
2097 * refcountbt because we're allowed to re-grab a buffer that is in xfs_refcount_recover_cow_leftovers()
2131 error = xfs_trans_alloc(mp, &M_RES(mp)->tr_write, 0, 0, 0, &tp); in xfs_refcount_recover_cow_leftovers()
2136 fsb = xfs_gbno_to_fsb(xg, rr->rr_rrec.rc_startblock); in xfs_refcount_recover_cow_leftovers()
2138 rr->rr_rrec.rc_blockcount); in xfs_refcount_recover_cow_leftovers()
2142 rr->rr_rrec.rc_blockcount, NULL, in xfs_refcount_recover_cow_leftovers()
2152 list_del(&rr->rr_list); in xfs_refcount_recover_cow_leftovers()
2162 list_del(&rr->rr_list); in xfs_refcount_recover_cow_leftovers()
2186 high.rc.rc_startblock = bno + len - 1; in xfs_refcount_has_records()
2213 return query->fn(cur, &irec, query->priv); in xfs_refcount_query_range_helper()
2240 return xfs_refcount_intent_cache != NULL ? 0 : -ENOMEM; in xfs_refcount_intent_init_cache()