Lines Matching refs:args

317 	xfs_alloc_arg_t	*args,		/* allocation argument structure */  in xfs_alloc_compute_aligned()  argument
330 busy = xfs_extent_busy_trim(args, &bno, &len, busy_gen); in xfs_alloc_compute_aligned()
336 if (bno < args->min_agbno && bno + len > args->min_agbno) { in xfs_alloc_compute_aligned()
337 diff = args->min_agbno - bno; in xfs_alloc_compute_aligned()
344 if (args->alignment > 1 && len >= args->minlen) { in xfs_alloc_compute_aligned()
345 xfs_agblock_t aligned_bno = roundup(bno, args->alignment); in xfs_alloc_compute_aligned()
436 xfs_alloc_arg_t *args) /* allocation argument structure */ in xfs_alloc_fix_len() argument
441 ASSERT(args->mod < args->prod); in xfs_alloc_fix_len()
442 rlen = args->len; in xfs_alloc_fix_len()
443 ASSERT(rlen >= args->minlen); in xfs_alloc_fix_len()
444 ASSERT(rlen <= args->maxlen); in xfs_alloc_fix_len()
445 if (args->prod <= 1 || rlen < args->mod || rlen == args->maxlen || in xfs_alloc_fix_len()
446 (args->mod == 0 && rlen < args->prod)) in xfs_alloc_fix_len()
448 k = rlen % args->prod; in xfs_alloc_fix_len()
449 if (k == args->mod) in xfs_alloc_fix_len()
451 if (k > args->mod) in xfs_alloc_fix_len()
452 rlen = rlen - (k - args->mod); in xfs_alloc_fix_len()
454 rlen = rlen - args->prod + (args->mod - k); in xfs_alloc_fix_len()
456 if ((int)rlen < (int)args->minlen) in xfs_alloc_fix_len()
458 ASSERT(rlen >= args->minlen && rlen <= args->maxlen); in xfs_alloc_fix_len()
459 ASSERT(rlen % args->prod == args->mod); in xfs_alloc_fix_len()
460 ASSERT(args->pag->pagf_freeblks + args->pag->pagf_flcount >= in xfs_alloc_fix_len()
461 rlen + args->minleft); in xfs_alloc_fix_len()
462 args->len = rlen; in xfs_alloc_fix_len()
812 struct xfs_alloc_arg *args, in xfs_alloc_cur_setup() argument
818 acur->cur_len = args->maxlen; in xfs_alloc_cur_setup()
833 acur->cnt = xfs_allocbt_init_cursor(args->mp, args->tp, in xfs_alloc_cur_setup()
834 args->agbp, args->pag, XFS_BTNUM_CNT); in xfs_alloc_cur_setup()
835 error = xfs_alloc_lookup_ge(acur->cnt, 0, args->maxlen, &i); in xfs_alloc_cur_setup()
843 acur->bnolt = xfs_allocbt_init_cursor(args->mp, args->tp, in xfs_alloc_cur_setup()
844 args->agbp, args->pag, XFS_BTNUM_BNO); in xfs_alloc_cur_setup()
846 acur->bnogt = xfs_allocbt_init_cursor(args->mp, args->tp, in xfs_alloc_cur_setup()
847 args->agbp, args->pag, XFS_BTNUM_BNO); in xfs_alloc_cur_setup()
878 struct xfs_alloc_arg *args, in xfs_alloc_cur_check() argument
896 if (XFS_IS_CORRUPT(args->mp, i != 1)) in xfs_alloc_cur_check()
903 if (len < args->minlen) { in xfs_alloc_cur_check()
908 busy = xfs_alloc_compute_aligned(args, bno, len, &bnoa, &lena, in xfs_alloc_cur_check()
914 if (bnoa < args->min_agbno || bnoa > args->max_agbno) { in xfs_alloc_cur_check()
918 if (lena < args->minlen) in xfs_alloc_cur_check()
921 args->len = XFS_EXTLEN_MIN(lena, args->maxlen); in xfs_alloc_cur_check()
922 xfs_alloc_fix_len(args); in xfs_alloc_cur_check()
923 ASSERT(args->len >= args->minlen); in xfs_alloc_cur_check()
924 if (args->len < acur->len) in xfs_alloc_cur_check()
931 diff = xfs_alloc_compute_diff(args->agbno, args->len, in xfs_alloc_cur_check()
932 args->alignment, args->datatype, in xfs_alloc_cur_check()
945 ASSERT(args->len > acur->len || in xfs_alloc_cur_check()
946 (args->len == acur->len && diff <= acur->diff)); in xfs_alloc_cur_check()
950 acur->len = args->len; in xfs_alloc_cur_check()
959 if (acur->diff == 0 && acur->len == args->maxlen) in xfs_alloc_cur_check()
964 trace_xfs_alloc_cur_check(args->mp, cur->bc_btnum, bno, len, diff, in xfs_alloc_cur_check()
975 struct xfs_alloc_arg *args, in xfs_alloc_cur_finish() argument
978 struct xfs_agf __maybe_unused *agf = args->agbp->b_addr; in xfs_alloc_cur_finish()
991 args->agbno = acur->bno; in xfs_alloc_cur_finish()
992 args->len = acur->len; in xfs_alloc_cur_finish()
993 args->wasfromfl = 0; in xfs_alloc_cur_finish()
995 trace_xfs_alloc_cur(args); in xfs_alloc_cur_finish()
1005 struct xfs_alloc_arg *args, in xfs_alloc_cntbt_iter() argument
1019 error = xfs_alloc_lookup_ge(cur, args->agbno, cur_len, &i); in xfs_alloc_cntbt_iter()
1029 error = xfs_alloc_cur_check(args, acur, cur, &i); in xfs_alloc_cntbt_iter()
1042 if (bno > args->agbno) { in xfs_alloc_cntbt_iter()
1047 error = xfs_alloc_cur_check(args, acur, cur, in xfs_alloc_cntbt_iter()
1076 struct xfs_alloc_arg *args, /* allocation argument structure */ in xfs_alloc_ag_vextent_small() argument
1082 struct xfs_agf *agf = args->agbp->b_addr; in xfs_alloc_ag_vextent_small()
1102 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_small()
1109 if (args->minlen != 1 || args->alignment != 1 || in xfs_alloc_ag_vextent_small()
1110 args->resv == XFS_AG_RESV_AGFL || in xfs_alloc_ag_vextent_small()
1111 be32_to_cpu(agf->agf_flcount) <= args->minleft) in xfs_alloc_ag_vextent_small()
1114 error = xfs_alloc_get_freelist(args->pag, args->tp, args->agbp, in xfs_alloc_ag_vextent_small()
1121 xfs_extent_busy_reuse(args->mp, args->pag, fbno, 1, in xfs_alloc_ag_vextent_small()
1122 (args->datatype & XFS_ALLOC_NOBUSY)); in xfs_alloc_ag_vextent_small()
1124 if (args->datatype & XFS_ALLOC_USERDATA) { in xfs_alloc_ag_vextent_small()
1127 error = xfs_trans_get_buf(args->tp, args->mp->m_ddev_targp, in xfs_alloc_ag_vextent_small()
1128 XFS_AGB_TO_DADDR(args->mp, args->agno, fbno), in xfs_alloc_ag_vextent_small()
1129 args->mp->m_bsize, 0, &bp); in xfs_alloc_ag_vextent_small()
1132 xfs_trans_binval(args->tp, bp); in xfs_alloc_ag_vextent_small()
1134 *fbnop = args->agbno = fbno; in xfs_alloc_ag_vextent_small()
1135 *flenp = args->len = 1; in xfs_alloc_ag_vextent_small()
1136 if (XFS_IS_CORRUPT(args->mp, fbno >= be32_to_cpu(agf->agf_length))) { in xfs_alloc_ag_vextent_small()
1140 args->wasfromfl = 1; in xfs_alloc_ag_vextent_small()
1141 trace_xfs_alloc_small_freelist(args); in xfs_alloc_ag_vextent_small()
1147 error = xfs_rmap_free(args->tp, args->agbp, args->pag, fbno, 1, in xfs_alloc_ag_vextent_small()
1159 if (flen < args->minlen) { in xfs_alloc_ag_vextent_small()
1160 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_small()
1161 trace_xfs_alloc_small_notenough(args); in xfs_alloc_ag_vextent_small()
1167 trace_xfs_alloc_small_done(args); in xfs_alloc_ag_vextent_small()
1171 trace_xfs_alloc_small_error(args); in xfs_alloc_ag_vextent_small()
1183 xfs_alloc_arg_t *args) /* allocation argument structure */ in xfs_alloc_ag_vextent_exact() argument
1185 struct xfs_agf __maybe_unused *agf = args->agbp->b_addr; in xfs_alloc_ag_vextent_exact()
1197 ASSERT(args->alignment == 1); in xfs_alloc_ag_vextent_exact()
1202 bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_exact()
1203 args->pag, XFS_BTNUM_BNO); in xfs_alloc_ag_vextent_exact()
1210 error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i); in xfs_alloc_ag_vextent_exact()
1222 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_exact()
1226 ASSERT(fbno <= args->agbno); in xfs_alloc_ag_vextent_exact()
1233 xfs_extent_busy_trim(args, &tbno, &tlen, &busy_gen); in xfs_alloc_ag_vextent_exact()
1239 if (tbno > args->agbno) in xfs_alloc_ag_vextent_exact()
1241 if (tlen < args->minlen) in xfs_alloc_ag_vextent_exact()
1244 if (tend < args->agbno + args->minlen) in xfs_alloc_ag_vextent_exact()
1253 args->len = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen) in xfs_alloc_ag_vextent_exact()
1254 - args->agbno; in xfs_alloc_ag_vextent_exact()
1255 xfs_alloc_fix_len(args); in xfs_alloc_ag_vextent_exact()
1256 ASSERT(args->agbno + args->len <= tend); in xfs_alloc_ag_vextent_exact()
1262 cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_exact()
1263 args->pag, XFS_BTNUM_CNT); in xfs_alloc_ag_vextent_exact()
1264 ASSERT(args->agbno + args->len <= be32_to_cpu(agf->agf_length)); in xfs_alloc_ag_vextent_exact()
1265 error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, args->agbno, in xfs_alloc_ag_vextent_exact()
1266 args->len, XFSA_FIXUP_BNO_OK); in xfs_alloc_ag_vextent_exact()
1275 args->wasfromfl = 0; in xfs_alloc_ag_vextent_exact()
1276 trace_xfs_alloc_exact_done(args); in xfs_alloc_ag_vextent_exact()
1282 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_exact()
1283 trace_xfs_alloc_exact_notfound(args); in xfs_alloc_ag_vextent_exact()
1288 trace_xfs_alloc_exact_error(args); in xfs_alloc_ag_vextent_exact()
1298 struct xfs_alloc_arg *args, in xfs_alloc_walk_iter() argument
1317 error = xfs_alloc_cur_check(args, acur, cur, &i); in xfs_alloc_walk_iter()
1350 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_locality() argument
1363 error = xfs_alloc_lookup_ge(acur->cnt, args->agbno, acur->cur_len, &i); in xfs_alloc_ag_vextent_locality()
1366 error = xfs_alloc_lookup_le(acur->bnolt, args->agbno, 0, &i); in xfs_alloc_ag_vextent_locality()
1369 error = xfs_alloc_lookup_ge(acur->bnogt, args->agbno, 0, &i); in xfs_alloc_ag_vextent_locality()
1399 trace_xfs_alloc_cur_lookup(args); in xfs_alloc_ag_vextent_locality()
1405 error = xfs_alloc_walk_iter(args, acur, acur->bnolt, false, in xfs_alloc_ag_vextent_locality()
1410 trace_xfs_alloc_cur_left(args); in xfs_alloc_ag_vextent_locality()
1415 error = xfs_alloc_walk_iter(args, acur, acur->bnogt, true, true, in xfs_alloc_ag_vextent_locality()
1420 trace_xfs_alloc_cur_right(args); in xfs_alloc_ag_vextent_locality()
1430 error = xfs_alloc_cntbt_iter(args, acur); in xfs_alloc_ag_vextent_locality()
1434 trace_xfs_alloc_cur_lookup_done(args); in xfs_alloc_ag_vextent_locality()
1460 error = xfs_alloc_walk_iter(args, acur, fbcur, fbinc, true, -1, in xfs_alloc_ag_vextent_locality()
1475 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_lastblock() argument
1496 if (*len || args->alignment > 1) { in xfs_alloc_ag_vextent_lastblock()
1502 if (XFS_IS_CORRUPT(args->mp, i != 1)) in xfs_alloc_ag_vextent_lastblock()
1504 if (*len >= args->minlen) in xfs_alloc_ag_vextent_lastblock()
1510 ASSERT(*len >= args->minlen); in xfs_alloc_ag_vextent_lastblock()
1515 error = xfs_alloc_walk_iter(args, acur, acur->cnt, true, false, -1, &i); in xfs_alloc_ag_vextent_lastblock()
1526 trace_xfs_alloc_near_first(args); in xfs_alloc_ag_vextent_lastblock()
1539 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_near() argument
1549 if (!args->min_agbno && !args->max_agbno) in xfs_alloc_ag_vextent_near()
1550 args->max_agbno = args->mp->m_sb.sb_agblocks - 1; in xfs_alloc_ag_vextent_near()
1551 ASSERT(args->min_agbno <= args->max_agbno); in xfs_alloc_ag_vextent_near()
1554 if (args->agbno < args->min_agbno) in xfs_alloc_ag_vextent_near()
1555 args->agbno = args->min_agbno; in xfs_alloc_ag_vextent_near()
1556 if (args->agbno > args->max_agbno) in xfs_alloc_ag_vextent_near()
1557 args->agbno = args->max_agbno; in xfs_alloc_ag_vextent_near()
1569 error = xfs_alloc_cur_setup(args, &acur); in xfs_alloc_ag_vextent_near()
1571 error = xfs_alloc_ag_vextent_small(args, acur.cnt, &bno, in xfs_alloc_ag_vextent_near()
1576 trace_xfs_alloc_near_noentry(args); in xfs_alloc_ag_vextent_near()
1595 error = xfs_alloc_ag_vextent_lastblock(args, &acur, &bno, &len, in xfs_alloc_ag_vextent_near()
1607 error = xfs_alloc_ag_vextent_locality(args, &acur, &i); in xfs_alloc_ag_vextent_near()
1623 trace_xfs_alloc_near_busy(args); in xfs_alloc_ag_vextent_near()
1624 error = xfs_extent_busy_flush(args->tp, args->pag, in xfs_alloc_ag_vextent_near()
1632 trace_xfs_alloc_size_neither(args); in xfs_alloc_ag_vextent_near()
1633 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_near()
1639 error = xfs_alloc_cur_finish(args, &acur); in xfs_alloc_ag_vextent_near()
1654 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_size() argument
1657 struct xfs_agf *agf = args->agbp->b_addr; in xfs_alloc_ag_vextent_size()
1675 cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_size()
1676 args->pag, XFS_BTNUM_CNT); in xfs_alloc_ag_vextent_size()
1683 args->maxlen + args->alignment - 1, &i))) in xfs_alloc_ag_vextent_size()
1694 error = xfs_alloc_ag_vextent_small(args, cnt_cur, in xfs_alloc_ag_vextent_size()
1700 trace_xfs_alloc_size_noentry(args); in xfs_alloc_ag_vextent_size()
1704 busy = xfs_alloc_compute_aligned(args, fbno, flen, &rbno, in xfs_alloc_ag_vextent_size()
1714 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_size()
1719 busy = xfs_alloc_compute_aligned(args, fbno, flen, in xfs_alloc_ag_vextent_size()
1722 if (rlen >= args->maxlen) in xfs_alloc_ag_vextent_size()
1738 trace_xfs_alloc_size_busy(args); in xfs_alloc_ag_vextent_size()
1739 error = xfs_extent_busy_flush(args->tp, args->pag, in xfs_alloc_ag_vextent_size()
1756 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); in xfs_alloc_ag_vextent_size()
1757 if (XFS_IS_CORRUPT(args->mp, in xfs_alloc_ag_vextent_size()
1764 if (rlen < args->maxlen) { in xfs_alloc_ag_vextent_size()
1782 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_size()
1788 busy = xfs_alloc_compute_aligned(args, fbno, flen, in xfs_alloc_ag_vextent_size()
1790 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); in xfs_alloc_ag_vextent_size()
1791 if (XFS_IS_CORRUPT(args->mp, in xfs_alloc_ag_vextent_size()
1803 if (rlen == args->maxlen) in xfs_alloc_ag_vextent_size()
1810 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_size()
1819 args->wasfromfl = 0; in xfs_alloc_ag_vextent_size()
1823 args->len = rlen; in xfs_alloc_ag_vextent_size()
1824 if (rlen < args->minlen) { in xfs_alloc_ag_vextent_size()
1833 trace_xfs_alloc_size_busy(args); in xfs_alloc_ag_vextent_size()
1834 error = xfs_extent_busy_flush(args->tp, args->pag, in xfs_alloc_ag_vextent_size()
1845 xfs_alloc_fix_len(args); in xfs_alloc_ag_vextent_size()
1847 rlen = args->len; in xfs_alloc_ag_vextent_size()
1848 if (XFS_IS_CORRUPT(args->mp, rlen > flen)) { in xfs_alloc_ag_vextent_size()
1855 bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_size()
1856 args->pag, XFS_BTNUM_BNO); in xfs_alloc_ag_vextent_size()
1863 args->len = rlen; in xfs_alloc_ag_vextent_size()
1864 args->agbno = rbno; in xfs_alloc_ag_vextent_size()
1865 if (XFS_IS_CORRUPT(args->mp, in xfs_alloc_ag_vextent_size()
1866 args->agbno + args->len > in xfs_alloc_ag_vextent_size()
1871 trace_xfs_alloc_size_done(args); in xfs_alloc_ag_vextent_size()
1875 trace_xfs_alloc_size_error(args); in xfs_alloc_ag_vextent_size()
1884 trace_xfs_alloc_size_nominleft(args); in xfs_alloc_ag_vextent_size()
1885 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_size()
2321 struct xfs_alloc_arg *args, in xfs_alloc_space_available() argument
2325 struct xfs_perag *pag = args->pag; in xfs_alloc_space_available()
2334 reservation = xfs_ag_resv_needed(pag, args->resv); in xfs_alloc_space_available()
2337 alloc_len = args->minlen + (args->alignment - 1) + args->minalignslop; in xfs_alloc_space_available()
2349 reservation - min_free - args->minleft); in xfs_alloc_space_available()
2350 if (available < (int)max(args->total, alloc_len)) in xfs_alloc_space_available()
2357 if (available < (int)args->maxlen && !(flags & XFS_ALLOC_FLAG_CHECK)) { in xfs_alloc_space_available()
2358 args->maxlen = available; in xfs_alloc_space_available()
2359 ASSERT(args->maxlen > 0); in xfs_alloc_space_available()
2360 ASSERT(args->maxlen >= args->minlen); in xfs_alloc_space_available()
2591 struct xfs_alloc_arg *args, in xfs_exact_minlen_extent_available() argument
2600 cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, agbp, in xfs_exact_minlen_extent_available()
2601 args->pag, XFS_BTNUM_CNT); in xfs_exact_minlen_extent_available()
2602 error = xfs_alloc_lookup_ge(cnt_cur, 0, args->minlen, stat); in xfs_exact_minlen_extent_available()
2615 if (*stat == 1 && flen != args->minlen) in xfs_exact_minlen_extent_available()
2631 struct xfs_alloc_arg *args, /* allocation argument structure */ in xfs_alloc_fix_freelist() argument
2634 struct xfs_mount *mp = args->mp; in xfs_alloc_fix_freelist()
2635 struct xfs_perag *pag = args->pag; in xfs_alloc_fix_freelist()
2636 struct xfs_trans *tp = args->tp; in xfs_alloc_fix_freelist()
2663 (args->datatype & XFS_ALLOC_USERDATA) && in xfs_alloc_fix_freelist()
2670 if (!xfs_alloc_space_available(args, need, alloc_flags | in xfs_alloc_fix_freelist()
2694 if (!xfs_alloc_space_available(args, need, alloc_flags)) in xfs_alloc_fix_freelist()
2698 if (args->alloc_minlen_only) { in xfs_alloc_fix_freelist()
2701 error = xfs_exact_minlen_extent_available(args, agbp, &stat); in xfs_alloc_fix_freelist()
2743 error = xfs_defer_agfl_block(tp, args->agno, bno, &targs.oinfo); in xfs_alloc_fix_freelist()
2751 targs.agno = args->agno; in xfs_alloc_fix_freelist()
2802 args->agbp = agbp; in xfs_alloc_fix_freelist()
2811 args->agbp = NULL; in xfs_alloc_fix_freelist()
3272 struct xfs_alloc_arg *args, in xfs_alloc_vextent_check_args() argument
3276 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_check_args()
3279 args->fsbno = NULLFSBLOCK; in xfs_alloc_vextent_check_args()
3282 if (args->tp->t_highest_agno != NULLAGNUMBER) in xfs_alloc_vextent_check_args()
3283 *minimum_agno = args->tp->t_highest_agno; in xfs_alloc_vextent_check_args()
3291 if (args->maxlen > agsize) in xfs_alloc_vextent_check_args()
3292 args->maxlen = agsize; in xfs_alloc_vextent_check_args()
3293 if (args->alignment == 0) in xfs_alloc_vextent_check_args()
3294 args->alignment = 1; in xfs_alloc_vextent_check_args()
3296 ASSERT(args->minlen > 0); in xfs_alloc_vextent_check_args()
3297 ASSERT(args->maxlen > 0); in xfs_alloc_vextent_check_args()
3298 ASSERT(args->alignment > 0); in xfs_alloc_vextent_check_args()
3299 ASSERT(args->resv != XFS_AG_RESV_AGFL); in xfs_alloc_vextent_check_args()
3303 ASSERT(args->minlen <= args->maxlen); in xfs_alloc_vextent_check_args()
3304 ASSERT(args->minlen <= agsize); in xfs_alloc_vextent_check_args()
3305 ASSERT(args->mod < args->prod); in xfs_alloc_vextent_check_args()
3309 args->minlen > args->maxlen || args->minlen > agsize || in xfs_alloc_vextent_check_args()
3310 args->mod >= args->prod) { in xfs_alloc_vextent_check_args()
3311 trace_xfs_alloc_vextent_badargs(args); in xfs_alloc_vextent_check_args()
3315 if (args->agno != NULLAGNUMBER && *minimum_agno > args->agno) { in xfs_alloc_vextent_check_args()
3316 trace_xfs_alloc_vextent_skip_deadlock(args); in xfs_alloc_vextent_check_args()
3332 struct xfs_alloc_arg *args, in xfs_alloc_vextent_prepare_ag() argument
3335 bool need_pag = !args->pag; in xfs_alloc_vextent_prepare_ag()
3339 args->pag = xfs_perag_get(args->mp, args->agno); in xfs_alloc_vextent_prepare_ag()
3341 args->agbp = NULL; in xfs_alloc_vextent_prepare_ag()
3342 error = xfs_alloc_fix_freelist(args, alloc_flags); in xfs_alloc_vextent_prepare_ag()
3344 trace_xfs_alloc_vextent_nofix(args); in xfs_alloc_vextent_prepare_ag()
3346 xfs_perag_put(args->pag); in xfs_alloc_vextent_prepare_ag()
3347 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_prepare_ag()
3350 if (!args->agbp) { in xfs_alloc_vextent_prepare_ag()
3352 trace_xfs_alloc_vextent_noagbp(args); in xfs_alloc_vextent_prepare_ag()
3353 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_prepare_ag()
3356 args->wasfromfl = 0; in xfs_alloc_vextent_prepare_ag()
3369 struct xfs_alloc_arg *args, in xfs_alloc_vextent_finish() argument
3374 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_finish()
3393 if (args->agbp && in xfs_alloc_vextent_finish()
3394 (args->tp->t_highest_agno == NULLAGNUMBER || in xfs_alloc_vextent_finish()
3395 args->agno > minimum_agno)) in xfs_alloc_vextent_finish()
3396 args->tp->t_highest_agno = args->agno; in xfs_alloc_vextent_finish()
3404 if (alloc_error || args->agbno == NULLAGBLOCK) { in xfs_alloc_vextent_finish()
3405 args->fsbno = NULLFSBLOCK; in xfs_alloc_vextent_finish()
3410 args->fsbno = XFS_AGB_TO_FSB(mp, args->agno, args->agbno); in xfs_alloc_vextent_finish()
3412 ASSERT(args->len >= args->minlen); in xfs_alloc_vextent_finish()
3413 ASSERT(args->len <= args->maxlen); in xfs_alloc_vextent_finish()
3414 ASSERT(args->agbno % args->alignment == 0); in xfs_alloc_vextent_finish()
3415 XFS_AG_CHECK_DADDR(mp, XFS_FSB_TO_DADDR(mp, args->fsbno), args->len); in xfs_alloc_vextent_finish()
3418 if (!xfs_rmap_should_skip_owner_update(&args->oinfo)) { in xfs_alloc_vextent_finish()
3419 error = xfs_rmap_alloc(args->tp, args->agbp, args->pag, in xfs_alloc_vextent_finish()
3420 args->agbno, args->len, &args->oinfo); in xfs_alloc_vextent_finish()
3425 if (!args->wasfromfl) { in xfs_alloc_vextent_finish()
3426 error = xfs_alloc_update_counters(args->tp, args->agbp, in xfs_alloc_vextent_finish()
3427 -((long)(args->len))); in xfs_alloc_vextent_finish()
3431 ASSERT(!xfs_extent_busy_search(mp, args->pag, args->agbno, in xfs_alloc_vextent_finish()
3432 args->len)); in xfs_alloc_vextent_finish()
3435 xfs_ag_resv_alloc_extent(args->pag, args->resv, args); in xfs_alloc_vextent_finish()
3438 XFS_STATS_ADD(mp, xs_allocb, args->len); in xfs_alloc_vextent_finish()
3440 trace_xfs_alloc_vextent_finish(args); in xfs_alloc_vextent_finish()
3443 if (drop_perag && args->pag) { in xfs_alloc_vextent_finish()
3444 xfs_perag_rele(args->pag); in xfs_alloc_vextent_finish()
3445 args->pag = NULL; in xfs_alloc_vextent_finish()
3459 struct xfs_alloc_arg *args, in xfs_alloc_vextent_this_ag() argument
3462 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_this_ag()
3467 ASSERT(args->pag != NULL); in xfs_alloc_vextent_this_ag()
3468 ASSERT(args->pag->pag_agno == agno); in xfs_alloc_vextent_this_ag()
3470 args->agno = agno; in xfs_alloc_vextent_this_ag()
3471 args->agbno = 0; in xfs_alloc_vextent_this_ag()
3473 trace_xfs_alloc_vextent_this_ag(args); in xfs_alloc_vextent_this_ag()
3475 error = xfs_alloc_vextent_check_args(args, XFS_AGB_TO_FSB(mp, agno, 0), in xfs_alloc_vextent_this_ag()
3483 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags); in xfs_alloc_vextent_this_ag()
3484 if (!error && args->agbp) in xfs_alloc_vextent_this_ag()
3485 error = xfs_alloc_ag_vextent_size(args, alloc_flags); in xfs_alloc_vextent_this_ag()
3487 return xfs_alloc_vextent_finish(args, minimum_agno, error, false); in xfs_alloc_vextent_this_ag()
3510 struct xfs_alloc_arg *args, in xfs_alloc_vextent_iterate_ags() argument
3516 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_iterate_ags()
3525 mp->m_sb.sb_agcount, agno, args->pag) { in xfs_alloc_vextent_iterate_ags()
3526 args->agno = agno; in xfs_alloc_vextent_iterate_ags()
3527 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags); in xfs_alloc_vextent_iterate_ags()
3530 if (!args->agbp) { in xfs_alloc_vextent_iterate_ags()
3531 trace_xfs_alloc_vextent_loopfailed(args); in xfs_alloc_vextent_iterate_ags()
3539 if (args->agno == start_agno && target_agbno) { in xfs_alloc_vextent_iterate_ags()
3540 args->agbno = target_agbno; in xfs_alloc_vextent_iterate_ags()
3541 error = xfs_alloc_ag_vextent_near(args, alloc_flags); in xfs_alloc_vextent_iterate_ags()
3543 args->agbno = 0; in xfs_alloc_vextent_iterate_ags()
3544 error = xfs_alloc_ag_vextent_size(args, alloc_flags); in xfs_alloc_vextent_iterate_ags()
3549 xfs_perag_rele(args->pag); in xfs_alloc_vextent_iterate_ags()
3550 args->pag = NULL; in xfs_alloc_vextent_iterate_ags()
3553 if (args->agbp) in xfs_alloc_vextent_iterate_ags()
3567 ASSERT(args->pag == NULL); in xfs_alloc_vextent_iterate_ags()
3568 trace_xfs_alloc_vextent_allfailed(args); in xfs_alloc_vextent_iterate_ags()
3582 struct xfs_alloc_arg *args, in xfs_alloc_vextent_start_ag() argument
3585 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_start_ag()
3593 ASSERT(args->pag == NULL); in xfs_alloc_vextent_start_ag()
3595 args->agno = NULLAGNUMBER; in xfs_alloc_vextent_start_ag()
3596 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_start_ag()
3598 trace_xfs_alloc_vextent_start_ag(args); in xfs_alloc_vextent_start_ag()
3600 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_start_ag()
3607 if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) && in xfs_alloc_vextent_start_ag()
3616 error = xfs_alloc_vextent_iterate_ags(args, minimum_agno, start_agno, in xfs_alloc_vextent_start_ag()
3620 if (args->agno == start_agno) in xfs_alloc_vextent_start_ag()
3624 mp->m_agfrotor = (args->agno * rotorstep + 1) % in xfs_alloc_vextent_start_ag()
3628 return xfs_alloc_vextent_finish(args, minimum_agno, error, true); in xfs_alloc_vextent_start_ag()
3638 struct xfs_alloc_arg *args, in xfs_alloc_vextent_first_ag() argument
3641 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_first_ag()
3647 ASSERT(args->pag == NULL); in xfs_alloc_vextent_first_ag()
3649 args->agno = NULLAGNUMBER; in xfs_alloc_vextent_first_ag()
3650 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_first_ag()
3652 trace_xfs_alloc_vextent_first_ag(args); in xfs_alloc_vextent_first_ag()
3654 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_first_ag()
3662 error = xfs_alloc_vextent_iterate_ags(args, minimum_agno, start_agno, in xfs_alloc_vextent_first_ag()
3664 return xfs_alloc_vextent_finish(args, minimum_agno, error, true); in xfs_alloc_vextent_first_ag()
3673 struct xfs_alloc_arg *args, in xfs_alloc_vextent_exact_bno() argument
3676 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_exact_bno()
3680 ASSERT(args->pag != NULL); in xfs_alloc_vextent_exact_bno()
3681 ASSERT(args->pag->pag_agno == XFS_FSB_TO_AGNO(mp, target)); in xfs_alloc_vextent_exact_bno()
3683 args->agno = XFS_FSB_TO_AGNO(mp, target); in xfs_alloc_vextent_exact_bno()
3684 args->agbno = XFS_FSB_TO_AGBNO(mp, target); in xfs_alloc_vextent_exact_bno()
3686 trace_xfs_alloc_vextent_exact_bno(args); in xfs_alloc_vextent_exact_bno()
3688 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_exact_bno()
3695 error = xfs_alloc_vextent_prepare_ag(args, 0); in xfs_alloc_vextent_exact_bno()
3696 if (!error && args->agbp) in xfs_alloc_vextent_exact_bno()
3697 error = xfs_alloc_ag_vextent_exact(args); in xfs_alloc_vextent_exact_bno()
3699 return xfs_alloc_vextent_finish(args, minimum_agno, error, false); in xfs_alloc_vextent_exact_bno()
3710 struct xfs_alloc_arg *args, in xfs_alloc_vextent_near_bno() argument
3713 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_near_bno()
3715 bool needs_perag = args->pag == NULL; in xfs_alloc_vextent_near_bno()
3720 ASSERT(args->pag->pag_agno == XFS_FSB_TO_AGNO(mp, target)); in xfs_alloc_vextent_near_bno()
3722 args->agno = XFS_FSB_TO_AGNO(mp, target); in xfs_alloc_vextent_near_bno()
3723 args->agbno = XFS_FSB_TO_AGBNO(mp, target); in xfs_alloc_vextent_near_bno()
3725 trace_xfs_alloc_vextent_near_bno(args); in xfs_alloc_vextent_near_bno()
3727 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_near_bno()
3735 args->pag = xfs_perag_grab(mp, args->agno); in xfs_alloc_vextent_near_bno()
3737 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags); in xfs_alloc_vextent_near_bno()
3738 if (!error && args->agbp) in xfs_alloc_vextent_near_bno()
3739 error = xfs_alloc_ag_vextent_near(args, alloc_flags); in xfs_alloc_vextent_near_bno()
3741 return xfs_alloc_vextent_finish(args, minimum_agno, error, needs_perag); in xfs_alloc_vextent_near_bno()
3751 struct xfs_alloc_arg args; in xfs_free_extent_fix_freelist() local
3754 memset(&args, 0, sizeof(struct xfs_alloc_arg)); in xfs_free_extent_fix_freelist()
3755 args.tp = tp; in xfs_free_extent_fix_freelist()
3756 args.mp = tp->t_mountp; in xfs_free_extent_fix_freelist()
3757 args.agno = pag->pag_agno; in xfs_free_extent_fix_freelist()
3758 args.pag = pag; in xfs_free_extent_fix_freelist()
3764 if (args.agno >= args.mp->m_sb.sb_agcount) in xfs_free_extent_fix_freelist()
3767 error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING); in xfs_free_extent_fix_freelist()
3771 *agbp = args.agbp; in xfs_free_extent_fix_freelist()