Lines Matching refs:args
319 xfs_alloc_arg_t *args, /* allocation argument structure */ in xfs_alloc_compute_aligned() argument
332 busy = xfs_extent_busy_trim(pag_group(args->pag), args->minlen, in xfs_alloc_compute_aligned()
333 args->maxlen, &bno, &len, busy_gen); in xfs_alloc_compute_aligned()
339 if (bno < args->min_agbno && bno + len > args->min_agbno) { in xfs_alloc_compute_aligned()
340 diff = args->min_agbno - bno; in xfs_alloc_compute_aligned()
347 if (args->alignment > 1 && len >= args->minlen) { in xfs_alloc_compute_aligned()
348 xfs_agblock_t aligned_bno = roundup(bno, args->alignment); in xfs_alloc_compute_aligned()
439 xfs_alloc_arg_t *args) /* allocation argument structure */ in xfs_alloc_fix_len() argument
444 ASSERT(args->mod < args->prod); in xfs_alloc_fix_len()
445 rlen = args->len; in xfs_alloc_fix_len()
446 ASSERT(rlen >= args->minlen); in xfs_alloc_fix_len()
447 ASSERT(rlen <= args->maxlen); in xfs_alloc_fix_len()
448 if (args->prod <= 1 || rlen < args->mod || rlen == args->maxlen || in xfs_alloc_fix_len()
449 (args->mod == 0 && rlen < args->prod)) in xfs_alloc_fix_len()
451 k = rlen % args->prod; in xfs_alloc_fix_len()
452 if (k == args->mod) in xfs_alloc_fix_len()
454 if (k > args->mod) in xfs_alloc_fix_len()
455 rlen = rlen - (k - args->mod); in xfs_alloc_fix_len()
457 rlen = rlen - args->prod + (args->mod - k); in xfs_alloc_fix_len()
459 if ((int)rlen < (int)args->minlen) in xfs_alloc_fix_len()
461 ASSERT(rlen >= args->minlen && rlen <= args->maxlen); in xfs_alloc_fix_len()
462 ASSERT(rlen % args->prod == args->mod); in xfs_alloc_fix_len()
463 ASSERT(args->pag->pagf_freeblks + args->pag->pagf_flcount >= in xfs_alloc_fix_len()
464 rlen + args->minleft); in xfs_alloc_fix_len()
465 args->len = rlen; in xfs_alloc_fix_len()
943 struct xfs_alloc_arg *args, in xfs_alloc_cur_setup() argument
949 acur->cur_len = args->maxlen; in xfs_alloc_cur_setup()
964 acur->cnt = xfs_cntbt_init_cursor(args->mp, args->tp, in xfs_alloc_cur_setup()
965 args->agbp, args->pag); in xfs_alloc_cur_setup()
966 error = xfs_alloc_lookup_ge(acur->cnt, 0, args->maxlen, &i); in xfs_alloc_cur_setup()
974 acur->bnolt = xfs_bnobt_init_cursor(args->mp, args->tp, in xfs_alloc_cur_setup()
975 args->agbp, args->pag); in xfs_alloc_cur_setup()
977 acur->bnogt = xfs_bnobt_init_cursor(args->mp, args->tp, in xfs_alloc_cur_setup()
978 args->agbp, args->pag); in xfs_alloc_cur_setup()
1009 struct xfs_alloc_arg *args, in xfs_alloc_cur_check() argument
1027 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_cur_check()
1036 if (len < args->minlen) { in xfs_alloc_cur_check()
1041 busy = xfs_alloc_compute_aligned(args, bno, len, &bnoa, &lena, in xfs_alloc_cur_check()
1047 if (bnoa < args->min_agbno || bnoa > args->max_agbno) { in xfs_alloc_cur_check()
1051 if (lena < args->minlen) in xfs_alloc_cur_check()
1054 args->len = XFS_EXTLEN_MIN(lena, args->maxlen); in xfs_alloc_cur_check()
1055 xfs_alloc_fix_len(args); in xfs_alloc_cur_check()
1056 ASSERT(args->len >= args->minlen); in xfs_alloc_cur_check()
1057 if (args->len < acur->len) in xfs_alloc_cur_check()
1064 diff = xfs_alloc_compute_diff(args->agbno, args->len, in xfs_alloc_cur_check()
1065 args->alignment, args->datatype, in xfs_alloc_cur_check()
1078 ASSERT(args->len > acur->len || in xfs_alloc_cur_check()
1079 (args->len == acur->len && diff <= acur->diff)); in xfs_alloc_cur_check()
1083 acur->len = args->len; in xfs_alloc_cur_check()
1092 if (acur->diff == 0 && acur->len == args->maxlen) in xfs_alloc_cur_check()
1107 struct xfs_alloc_arg *args, in xfs_alloc_cur_finish() argument
1115 ASSERT(xfs_verify_agbext(args->pag, acur->rec_bno, acur->rec_len)); in xfs_alloc_cur_finish()
1122 args->agbno = acur->bno; in xfs_alloc_cur_finish()
1123 args->len = acur->len; in xfs_alloc_cur_finish()
1124 args->wasfromfl = 0; in xfs_alloc_cur_finish()
1126 trace_xfs_alloc_cur(args); in xfs_alloc_cur_finish()
1136 struct xfs_alloc_arg *args, in xfs_alloc_cntbt_iter() argument
1150 error = xfs_alloc_lookup_ge(cur, args->agbno, cur_len, &i); in xfs_alloc_cntbt_iter()
1160 error = xfs_alloc_cur_check(args, acur, cur, &i); in xfs_alloc_cntbt_iter()
1173 if (bno > args->agbno) { in xfs_alloc_cntbt_iter()
1178 error = xfs_alloc_cur_check(args, acur, cur, in xfs_alloc_cntbt_iter()
1207 struct xfs_alloc_arg *args, /* allocation argument structure */ in xfs_alloc_ag_vextent_small() argument
1213 struct xfs_agf *agf = args->agbp->b_addr; in xfs_alloc_ag_vextent_small()
1233 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_small()
1241 if (args->minlen != 1 || args->alignment != 1 || in xfs_alloc_ag_vextent_small()
1242 args->resv == XFS_AG_RESV_AGFL || in xfs_alloc_ag_vextent_small()
1243 be32_to_cpu(agf->agf_flcount) <= args->minleft) in xfs_alloc_ag_vextent_small()
1246 error = xfs_alloc_get_freelist(args->pag, args->tp, args->agbp, in xfs_alloc_ag_vextent_small()
1253 xfs_extent_busy_reuse(pag_group(args->pag), fbno, 1, in xfs_alloc_ag_vextent_small()
1254 (args->datatype & XFS_ALLOC_NOBUSY)); in xfs_alloc_ag_vextent_small()
1256 if (args->datatype & XFS_ALLOC_USERDATA) { in xfs_alloc_ag_vextent_small()
1259 error = xfs_trans_get_buf(args->tp, args->mp->m_ddev_targp, in xfs_alloc_ag_vextent_small()
1260 xfs_agbno_to_daddr(args->pag, fbno), in xfs_alloc_ag_vextent_small()
1261 args->mp->m_bsize, 0, &bp); in xfs_alloc_ag_vextent_small()
1264 xfs_trans_binval(args->tp, bp); in xfs_alloc_ag_vextent_small()
1266 *fbnop = args->agbno = fbno; in xfs_alloc_ag_vextent_small()
1267 *flenp = args->len = 1; in xfs_alloc_ag_vextent_small()
1268 if (XFS_IS_CORRUPT(args->mp, fbno >= be32_to_cpu(agf->agf_length))) { in xfs_alloc_ag_vextent_small()
1273 args->wasfromfl = 1; in xfs_alloc_ag_vextent_small()
1274 trace_xfs_alloc_small_freelist(args); in xfs_alloc_ag_vextent_small()
1280 error = xfs_rmap_free(args->tp, args->agbp, args->pag, fbno, 1, in xfs_alloc_ag_vextent_small()
1292 if (flen < args->minlen) { in xfs_alloc_ag_vextent_small()
1293 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_small()
1294 trace_xfs_alloc_small_notenough(args); in xfs_alloc_ag_vextent_small()
1300 trace_xfs_alloc_small_done(args); in xfs_alloc_ag_vextent_small()
1304 trace_xfs_alloc_small_error(args); in xfs_alloc_ag_vextent_small()
1316 xfs_alloc_arg_t *args) /* allocation argument structure */ in xfs_alloc_ag_vextent_exact() argument
1329 ASSERT(args->alignment == 1); in xfs_alloc_ag_vextent_exact()
1334 bno_cur = xfs_bnobt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_exact()
1335 args->pag); in xfs_alloc_ag_vextent_exact()
1342 error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i); in xfs_alloc_ag_vextent_exact()
1354 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_exact()
1359 ASSERT(fbno <= args->agbno); in xfs_alloc_ag_vextent_exact()
1366 xfs_extent_busy_trim(pag_group(args->pag), args->minlen, args->maxlen, in xfs_alloc_ag_vextent_exact()
1373 if (tbno > args->agbno) in xfs_alloc_ag_vextent_exact()
1375 if (tlen < args->minlen) in xfs_alloc_ag_vextent_exact()
1378 if (tend < args->agbno + args->minlen) in xfs_alloc_ag_vextent_exact()
1387 args->len = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen) in xfs_alloc_ag_vextent_exact()
1388 - args->agbno; in xfs_alloc_ag_vextent_exact()
1389 xfs_alloc_fix_len(args); in xfs_alloc_ag_vextent_exact()
1390 ASSERT(args->agbno + args->len <= tend); in xfs_alloc_ag_vextent_exact()
1396 cnt_cur = xfs_cntbt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_exact()
1397 args->pag); in xfs_alloc_ag_vextent_exact()
1398 ASSERT(xfs_verify_agbext(args->pag, args->agbno, args->len)); in xfs_alloc_ag_vextent_exact()
1399 error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, args->agbno, in xfs_alloc_ag_vextent_exact()
1400 args->len, XFSA_FIXUP_BNO_OK); in xfs_alloc_ag_vextent_exact()
1409 args->wasfromfl = 0; in xfs_alloc_ag_vextent_exact()
1410 trace_xfs_alloc_exact_done(args); in xfs_alloc_ag_vextent_exact()
1416 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_exact()
1417 trace_xfs_alloc_exact_notfound(args); in xfs_alloc_ag_vextent_exact()
1422 trace_xfs_alloc_exact_error(args); in xfs_alloc_ag_vextent_exact()
1432 struct xfs_alloc_arg *args, in xfs_alloc_walk_iter() argument
1451 error = xfs_alloc_cur_check(args, acur, cur, &i); in xfs_alloc_walk_iter()
1484 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_locality() argument
1497 error = xfs_alloc_lookup_ge(acur->cnt, args->agbno, acur->cur_len, &i); in xfs_alloc_ag_vextent_locality()
1500 error = xfs_alloc_lookup_le(acur->bnolt, args->agbno, 0, &i); in xfs_alloc_ag_vextent_locality()
1503 error = xfs_alloc_lookup_ge(acur->bnogt, args->agbno, 0, &i); in xfs_alloc_ag_vextent_locality()
1533 trace_xfs_alloc_cur_lookup(args); in xfs_alloc_ag_vextent_locality()
1539 error = xfs_alloc_walk_iter(args, acur, acur->bnolt, false, in xfs_alloc_ag_vextent_locality()
1544 trace_xfs_alloc_cur_left(args); in xfs_alloc_ag_vextent_locality()
1549 error = xfs_alloc_walk_iter(args, acur, acur->bnogt, true, true, in xfs_alloc_ag_vextent_locality()
1554 trace_xfs_alloc_cur_right(args); in xfs_alloc_ag_vextent_locality()
1564 error = xfs_alloc_cntbt_iter(args, acur); in xfs_alloc_ag_vextent_locality()
1568 trace_xfs_alloc_cur_lookup_done(args); in xfs_alloc_ag_vextent_locality()
1594 error = xfs_alloc_walk_iter(args, acur, fbcur, fbinc, true, -1, in xfs_alloc_ag_vextent_locality()
1609 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_lastblock() argument
1630 if (*len || args->alignment > 1) { in xfs_alloc_ag_vextent_lastblock()
1636 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_lastblock()
1640 if (*len >= args->minlen) in xfs_alloc_ag_vextent_lastblock()
1646 ASSERT(*len >= args->minlen); in xfs_alloc_ag_vextent_lastblock()
1651 error = xfs_alloc_walk_iter(args, acur, acur->cnt, true, false, -1, &i); in xfs_alloc_ag_vextent_lastblock()
1662 trace_xfs_alloc_near_first(args); in xfs_alloc_ag_vextent_lastblock()
1675 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_near() argument
1685 if (!args->min_agbno && !args->max_agbno) in xfs_alloc_ag_vextent_near()
1686 args->max_agbno = args->mp->m_sb.sb_agblocks - 1; in xfs_alloc_ag_vextent_near()
1687 ASSERT(args->min_agbno <= args->max_agbno); in xfs_alloc_ag_vextent_near()
1690 if (args->agbno < args->min_agbno) in xfs_alloc_ag_vextent_near()
1691 args->agbno = args->min_agbno; in xfs_alloc_ag_vextent_near()
1692 if (args->agbno > args->max_agbno) in xfs_alloc_ag_vextent_near()
1693 args->agbno = args->max_agbno; in xfs_alloc_ag_vextent_near()
1705 error = xfs_alloc_cur_setup(args, &acur); in xfs_alloc_ag_vextent_near()
1707 error = xfs_alloc_ag_vextent_small(args, acur.cnt, &bno, in xfs_alloc_ag_vextent_near()
1712 trace_xfs_alloc_near_noentry(args); in xfs_alloc_ag_vextent_near()
1731 error = xfs_alloc_ag_vextent_lastblock(args, &acur, &bno, &len, in xfs_alloc_ag_vextent_near()
1743 error = xfs_alloc_ag_vextent_locality(args, &acur, &i); in xfs_alloc_ag_vextent_near()
1759 trace_xfs_alloc_near_busy(args); in xfs_alloc_ag_vextent_near()
1760 error = xfs_extent_busy_flush(args->tp, in xfs_alloc_ag_vextent_near()
1761 pag_group(args->pag), acur.busy_gen, in xfs_alloc_ag_vextent_near()
1769 trace_xfs_alloc_size_neither(args); in xfs_alloc_ag_vextent_near()
1770 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_near()
1776 error = xfs_alloc_cur_finish(args, &acur); in xfs_alloc_ag_vextent_near()
1791 struct xfs_alloc_arg *args, in xfs_alloc_ag_vextent_size() argument
1794 struct xfs_agf *agf = args->agbp->b_addr; in xfs_alloc_ag_vextent_size()
1812 cnt_cur = xfs_cntbt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_size()
1813 args->pag); in xfs_alloc_ag_vextent_size()
1820 args->maxlen + args->alignment - 1, &i))) in xfs_alloc_ag_vextent_size()
1831 error = xfs_alloc_ag_vextent_small(args, cnt_cur, in xfs_alloc_ag_vextent_size()
1837 trace_xfs_alloc_size_noentry(args); in xfs_alloc_ag_vextent_size()
1841 busy = xfs_alloc_compute_aligned(args, fbno, flen, &rbno, in xfs_alloc_ag_vextent_size()
1851 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_size()
1857 busy = xfs_alloc_compute_aligned(args, fbno, flen, in xfs_alloc_ag_vextent_size()
1860 if (rlen >= args->maxlen) in xfs_alloc_ag_vextent_size()
1876 trace_xfs_alloc_size_busy(args); in xfs_alloc_ag_vextent_size()
1877 error = xfs_extent_busy_flush(args->tp, in xfs_alloc_ag_vextent_size()
1878 pag_group(args->pag), busy_gen, in xfs_alloc_ag_vextent_size()
1895 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); in xfs_alloc_ag_vextent_size()
1896 if (XFS_IS_CORRUPT(args->mp, in xfs_alloc_ag_vextent_size()
1904 if (rlen < args->maxlen) { in xfs_alloc_ag_vextent_size()
1922 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_size()
1929 busy = xfs_alloc_compute_aligned(args, fbno, flen, in xfs_alloc_ag_vextent_size()
1931 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen); in xfs_alloc_ag_vextent_size()
1932 if (XFS_IS_CORRUPT(args->mp, in xfs_alloc_ag_vextent_size()
1945 if (rlen == args->maxlen) in xfs_alloc_ag_vextent_size()
1952 if (XFS_IS_CORRUPT(args->mp, i != 1)) { in xfs_alloc_ag_vextent_size()
1962 args->wasfromfl = 0; in xfs_alloc_ag_vextent_size()
1966 args->len = rlen; in xfs_alloc_ag_vextent_size()
1967 if (rlen < args->minlen) { in xfs_alloc_ag_vextent_size()
1976 trace_xfs_alloc_size_busy(args); in xfs_alloc_ag_vextent_size()
1977 error = xfs_extent_busy_flush(args->tp, in xfs_alloc_ag_vextent_size()
1978 pag_group(args->pag), busy_gen, in xfs_alloc_ag_vextent_size()
1989 xfs_alloc_fix_len(args); in xfs_alloc_ag_vextent_size()
1991 rlen = args->len; in xfs_alloc_ag_vextent_size()
1992 if (XFS_IS_CORRUPT(args->mp, rlen > flen)) { in xfs_alloc_ag_vextent_size()
2000 bno_cur = xfs_bnobt_init_cursor(args->mp, args->tp, args->agbp, in xfs_alloc_ag_vextent_size()
2001 args->pag); in xfs_alloc_ag_vextent_size()
2008 args->len = rlen; in xfs_alloc_ag_vextent_size()
2009 args->agbno = rbno; in xfs_alloc_ag_vextent_size()
2010 if (XFS_IS_CORRUPT(args->mp, in xfs_alloc_ag_vextent_size()
2011 args->agbno + args->len > in xfs_alloc_ag_vextent_size()
2013 xfs_ag_mark_sick(args->pag, XFS_SICK_AG_BNOBT); in xfs_alloc_ag_vextent_size()
2017 trace_xfs_alloc_size_done(args); in xfs_alloc_ag_vextent_size()
2021 trace_xfs_alloc_size_error(args); in xfs_alloc_ag_vextent_size()
2030 trace_xfs_alloc_size_nominleft(args); in xfs_alloc_ag_vextent_size()
2031 args->agbno = NULLAGBLOCK; in xfs_alloc_ag_vextent_size()
2496 struct xfs_alloc_arg *args, in xfs_alloc_space_available() argument
2500 struct xfs_perag *pag = args->pag; in xfs_alloc_space_available()
2509 reservation = xfs_ag_resv_needed(pag, args->resv); in xfs_alloc_space_available()
2512 alloc_len = args->minlen + (args->alignment - 1) + args->minalignslop; in xfs_alloc_space_available()
2524 reservation - min_free - args->minleft); in xfs_alloc_space_available()
2525 if (available < (int)max(args->total, alloc_len)) in xfs_alloc_space_available()
2532 if (available < (int)args->maxlen && !(flags & XFS_ALLOC_FLAG_CHECK)) { in xfs_alloc_space_available()
2533 args->maxlen = available; in xfs_alloc_space_available()
2534 ASSERT(args->maxlen > 0); in xfs_alloc_space_available()
2535 ASSERT(args->maxlen >= args->minlen); in xfs_alloc_space_available()
2721 const struct xfs_alloc_arg *args, in xfs_alloc_schedule_autoreap() argument
2727 error = xfs_defer_extent_free(args->tp, args->fsbno, args->len, in xfs_alloc_schedule_autoreap()
2728 &args->oinfo, args->resv, free_flags, &aarp->dfp); in xfs_alloc_schedule_autoreap()
2732 xfs_defer_item_pause(args->tp, aarp->dfp); in xfs_alloc_schedule_autoreap()
2787 struct xfs_alloc_arg *args, in xfs_exact_minlen_extent_available() argument
2796 cnt_cur = xfs_cntbt_init_cursor(args->mp, args->tp, agbp, in xfs_exact_minlen_extent_available()
2797 args->pag); in xfs_exact_minlen_extent_available()
2798 error = xfs_alloc_lookup_ge(cnt_cur, 0, args->minlen, stat); in xfs_exact_minlen_extent_available()
2812 if (*stat == 1 && flen != args->minlen) in xfs_exact_minlen_extent_available()
2827 struct xfs_alloc_arg *args, /* allocation argument structure */ in xfs_alloc_fix_freelist() argument
2830 struct xfs_mount *mp = args->mp; in xfs_alloc_fix_freelist()
2831 struct xfs_perag *pag = args->pag; in xfs_alloc_fix_freelist()
2832 struct xfs_trans *tp = args->tp; in xfs_alloc_fix_freelist()
2859 (args->datatype & XFS_ALLOC_USERDATA) && in xfs_alloc_fix_freelist()
2866 if (!xfs_alloc_space_available(args, need, alloc_flags | in xfs_alloc_fix_freelist()
2890 if (!xfs_alloc_space_available(args, need, alloc_flags)) in xfs_alloc_fix_freelist()
2893 if (IS_ENABLED(CONFIG_XFS_DEBUG) && args->alloc_minlen_only) { in xfs_alloc_fix_freelist()
2896 error = xfs_exact_minlen_extent_available(args, agbp, &stat); in xfs_alloc_fix_freelist()
2958 targs.agno = args->agno; in xfs_alloc_fix_freelist()
3009 args->agbp = agbp; in xfs_alloc_fix_freelist()
3018 args->agbp = NULL; in xfs_alloc_fix_freelist()
3496 struct xfs_alloc_arg *args, in xfs_alloc_vextent_check_args() argument
3500 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_check_args()
3503 args->fsbno = NULLFSBLOCK; in xfs_alloc_vextent_check_args()
3506 if (args->tp->t_highest_agno != NULLAGNUMBER) in xfs_alloc_vextent_check_args()
3507 *minimum_agno = args->tp->t_highest_agno; in xfs_alloc_vextent_check_args()
3515 if (args->maxlen > agsize) in xfs_alloc_vextent_check_args()
3516 args->maxlen = agsize; in xfs_alloc_vextent_check_args()
3517 if (args->alignment == 0) in xfs_alloc_vextent_check_args()
3518 args->alignment = 1; in xfs_alloc_vextent_check_args()
3520 ASSERT(args->minlen > 0); in xfs_alloc_vextent_check_args()
3521 ASSERT(args->maxlen > 0); in xfs_alloc_vextent_check_args()
3522 ASSERT(args->alignment > 0); in xfs_alloc_vextent_check_args()
3523 ASSERT(args->resv != XFS_AG_RESV_AGFL); in xfs_alloc_vextent_check_args()
3527 ASSERT(args->minlen <= args->maxlen); in xfs_alloc_vextent_check_args()
3528 ASSERT(args->minlen <= agsize); in xfs_alloc_vextent_check_args()
3529 ASSERT(args->mod < args->prod); in xfs_alloc_vextent_check_args()
3533 args->minlen > args->maxlen || args->minlen > agsize || in xfs_alloc_vextent_check_args()
3534 args->mod >= args->prod) { in xfs_alloc_vextent_check_args()
3535 trace_xfs_alloc_vextent_badargs(args); in xfs_alloc_vextent_check_args()
3539 if (args->agno != NULLAGNUMBER && *minimum_agno > args->agno) { in xfs_alloc_vextent_check_args()
3540 trace_xfs_alloc_vextent_skip_deadlock(args); in xfs_alloc_vextent_check_args()
3556 struct xfs_alloc_arg *args, in xfs_alloc_vextent_prepare_ag() argument
3559 bool need_pag = !args->pag; in xfs_alloc_vextent_prepare_ag()
3563 args->pag = xfs_perag_get(args->mp, args->agno); in xfs_alloc_vextent_prepare_ag()
3565 args->agbp = NULL; in xfs_alloc_vextent_prepare_ag()
3566 error = xfs_alloc_fix_freelist(args, alloc_flags); in xfs_alloc_vextent_prepare_ag()
3568 trace_xfs_alloc_vextent_nofix(args); in xfs_alloc_vextent_prepare_ag()
3570 xfs_perag_put(args->pag); in xfs_alloc_vextent_prepare_ag()
3571 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_prepare_ag()
3574 if (!args->agbp) { in xfs_alloc_vextent_prepare_ag()
3576 trace_xfs_alloc_vextent_noagbp(args); in xfs_alloc_vextent_prepare_ag()
3577 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_prepare_ag()
3580 args->wasfromfl = 0; in xfs_alloc_vextent_prepare_ag()
3593 struct xfs_alloc_arg *args, in xfs_alloc_vextent_finish() argument
3598 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_finish()
3617 if (args->agbp && in xfs_alloc_vextent_finish()
3618 (args->tp->t_highest_agno == NULLAGNUMBER || in xfs_alloc_vextent_finish()
3619 args->agno > minimum_agno)) in xfs_alloc_vextent_finish()
3620 args->tp->t_highest_agno = args->agno; in xfs_alloc_vextent_finish()
3628 if (alloc_error || args->agbno == NULLAGBLOCK) { in xfs_alloc_vextent_finish()
3629 args->fsbno = NULLFSBLOCK; in xfs_alloc_vextent_finish()
3634 args->fsbno = xfs_agbno_to_fsb(args->pag, args->agbno); in xfs_alloc_vextent_finish()
3636 ASSERT(args->len >= args->minlen); in xfs_alloc_vextent_finish()
3637 ASSERT(args->len <= args->maxlen); in xfs_alloc_vextent_finish()
3638 ASSERT(args->agbno % args->alignment == 0); in xfs_alloc_vextent_finish()
3639 XFS_AG_CHECK_DADDR(mp, XFS_FSB_TO_DADDR(mp, args->fsbno), args->len); in xfs_alloc_vextent_finish()
3642 if (!xfs_rmap_should_skip_owner_update(&args->oinfo)) { in xfs_alloc_vextent_finish()
3643 error = xfs_rmap_alloc(args->tp, args->agbp, args->pag, in xfs_alloc_vextent_finish()
3644 args->agbno, args->len, &args->oinfo); in xfs_alloc_vextent_finish()
3649 if (!args->wasfromfl) { in xfs_alloc_vextent_finish()
3650 error = xfs_alloc_update_counters(args->tp, args->agbp, in xfs_alloc_vextent_finish()
3651 -((long)(args->len))); in xfs_alloc_vextent_finish()
3655 ASSERT(!xfs_extent_busy_search(pag_group(args->pag), in xfs_alloc_vextent_finish()
3656 args->agbno, args->len)); in xfs_alloc_vextent_finish()
3659 xfs_ag_resv_alloc_extent(args->pag, args->resv, args); in xfs_alloc_vextent_finish()
3662 XFS_STATS_ADD(mp, xs_allocb, args->len); in xfs_alloc_vextent_finish()
3664 trace_xfs_alloc_vextent_finish(args); in xfs_alloc_vextent_finish()
3667 if (drop_perag && args->pag) { in xfs_alloc_vextent_finish()
3668 xfs_perag_rele(args->pag); in xfs_alloc_vextent_finish()
3669 args->pag = NULL; in xfs_alloc_vextent_finish()
3683 struct xfs_alloc_arg *args, in xfs_alloc_vextent_this_ag() argument
3690 ASSERT(args->pag != NULL); in xfs_alloc_vextent_this_ag()
3691 ASSERT(pag_agno(args->pag) == agno); in xfs_alloc_vextent_this_ag()
3693 args->agno = agno; in xfs_alloc_vextent_this_ag()
3694 args->agbno = 0; in xfs_alloc_vextent_this_ag()
3696 trace_xfs_alloc_vextent_this_ag(args); in xfs_alloc_vextent_this_ag()
3698 error = xfs_alloc_vextent_check_args(args, in xfs_alloc_vextent_this_ag()
3699 xfs_agbno_to_fsb(args->pag, 0), &minimum_agno); in xfs_alloc_vextent_this_ag()
3706 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags); in xfs_alloc_vextent_this_ag()
3707 if (!error && args->agbp) in xfs_alloc_vextent_this_ag()
3708 error = xfs_alloc_ag_vextent_size(args, alloc_flags); in xfs_alloc_vextent_this_ag()
3710 return xfs_alloc_vextent_finish(args, minimum_agno, error, false); in xfs_alloc_vextent_this_ag()
3733 struct xfs_alloc_arg *args, in xfs_alloc_vextent_iterate_ags() argument
3739 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_iterate_ags()
3748 mp->m_sb.sb_agcount, agno, args->pag) { in xfs_alloc_vextent_iterate_ags()
3749 args->agno = agno; in xfs_alloc_vextent_iterate_ags()
3750 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags); in xfs_alloc_vextent_iterate_ags()
3753 if (!args->agbp) { in xfs_alloc_vextent_iterate_ags()
3754 trace_xfs_alloc_vextent_loopfailed(args); in xfs_alloc_vextent_iterate_ags()
3762 if (args->agno == start_agno && target_agbno) { in xfs_alloc_vextent_iterate_ags()
3763 args->agbno = target_agbno; in xfs_alloc_vextent_iterate_ags()
3764 error = xfs_alloc_ag_vextent_near(args, alloc_flags); in xfs_alloc_vextent_iterate_ags()
3766 args->agbno = 0; in xfs_alloc_vextent_iterate_ags()
3767 error = xfs_alloc_ag_vextent_size(args, alloc_flags); in xfs_alloc_vextent_iterate_ags()
3772 xfs_perag_rele(args->pag); in xfs_alloc_vextent_iterate_ags()
3773 args->pag = NULL; in xfs_alloc_vextent_iterate_ags()
3776 if (args->agbp) in xfs_alloc_vextent_iterate_ags()
3790 ASSERT(args->pag == NULL); in xfs_alloc_vextent_iterate_ags()
3791 trace_xfs_alloc_vextent_allfailed(args); in xfs_alloc_vextent_iterate_ags()
3805 struct xfs_alloc_arg *args, in xfs_alloc_vextent_start_ag() argument
3808 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_start_ag()
3816 ASSERT(args->pag == NULL); in xfs_alloc_vextent_start_ag()
3818 args->agno = NULLAGNUMBER; in xfs_alloc_vextent_start_ag()
3819 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_start_ag()
3821 trace_xfs_alloc_vextent_start_ag(args); in xfs_alloc_vextent_start_ag()
3823 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_start_ag()
3830 if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) && in xfs_alloc_vextent_start_ag()
3839 error = xfs_alloc_vextent_iterate_ags(args, minimum_agno, start_agno, in xfs_alloc_vextent_start_ag()
3843 if (args->agno == start_agno) in xfs_alloc_vextent_start_ag()
3847 mp->m_agfrotor = (args->agno * rotorstep + 1) % in xfs_alloc_vextent_start_ag()
3851 return xfs_alloc_vextent_finish(args, minimum_agno, error, true); in xfs_alloc_vextent_start_ag()
3861 struct xfs_alloc_arg *args, in xfs_alloc_vextent_first_ag() argument
3864 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_first_ag()
3870 ASSERT(args->pag == NULL); in xfs_alloc_vextent_first_ag()
3872 args->agno = NULLAGNUMBER; in xfs_alloc_vextent_first_ag()
3873 args->agbno = NULLAGBLOCK; in xfs_alloc_vextent_first_ag()
3875 trace_xfs_alloc_vextent_first_ag(args); in xfs_alloc_vextent_first_ag()
3877 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_first_ag()
3885 error = xfs_alloc_vextent_iterate_ags(args, minimum_agno, start_agno, in xfs_alloc_vextent_first_ag()
3887 return xfs_alloc_vextent_finish(args, minimum_agno, error, true); in xfs_alloc_vextent_first_ag()
3896 struct xfs_alloc_arg *args, in xfs_alloc_vextent_exact_bno() argument
3899 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_exact_bno()
3903 ASSERT(args->pag != NULL); in xfs_alloc_vextent_exact_bno()
3904 ASSERT(pag_agno(args->pag) == XFS_FSB_TO_AGNO(mp, target)); in xfs_alloc_vextent_exact_bno()
3906 args->agno = XFS_FSB_TO_AGNO(mp, target); in xfs_alloc_vextent_exact_bno()
3907 args->agbno = XFS_FSB_TO_AGBNO(mp, target); in xfs_alloc_vextent_exact_bno()
3909 trace_xfs_alloc_vextent_exact_bno(args); in xfs_alloc_vextent_exact_bno()
3911 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_exact_bno()
3918 error = xfs_alloc_vextent_prepare_ag(args, 0); in xfs_alloc_vextent_exact_bno()
3919 if (!error && args->agbp) in xfs_alloc_vextent_exact_bno()
3920 error = xfs_alloc_ag_vextent_exact(args); in xfs_alloc_vextent_exact_bno()
3922 return xfs_alloc_vextent_finish(args, minimum_agno, error, false); in xfs_alloc_vextent_exact_bno()
3933 struct xfs_alloc_arg *args, in xfs_alloc_vextent_near_bno() argument
3936 struct xfs_mount *mp = args->mp; in xfs_alloc_vextent_near_bno()
3938 bool needs_perag = args->pag == NULL; in xfs_alloc_vextent_near_bno()
3943 ASSERT(pag_agno(args->pag) == XFS_FSB_TO_AGNO(mp, target)); in xfs_alloc_vextent_near_bno()
3945 args->agno = XFS_FSB_TO_AGNO(mp, target); in xfs_alloc_vextent_near_bno()
3946 args->agbno = XFS_FSB_TO_AGBNO(mp, target); in xfs_alloc_vextent_near_bno()
3948 trace_xfs_alloc_vextent_near_bno(args); in xfs_alloc_vextent_near_bno()
3950 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno); in xfs_alloc_vextent_near_bno()
3958 args->pag = xfs_perag_grab(mp, args->agno); in xfs_alloc_vextent_near_bno()
3960 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags); in xfs_alloc_vextent_near_bno()
3961 if (!error && args->agbp) in xfs_alloc_vextent_near_bno()
3962 error = xfs_alloc_ag_vextent_near(args, alloc_flags); in xfs_alloc_vextent_near_bno()
3964 return xfs_alloc_vextent_finish(args, minimum_agno, error, needs_perag); in xfs_alloc_vextent_near_bno()
3974 struct xfs_alloc_arg args; in xfs_free_extent_fix_freelist() local
3977 memset(&args, 0, sizeof(struct xfs_alloc_arg)); in xfs_free_extent_fix_freelist()
3978 args.tp = tp; in xfs_free_extent_fix_freelist()
3979 args.mp = tp->t_mountp; in xfs_free_extent_fix_freelist()
3980 args.agno = pag_agno(pag); in xfs_free_extent_fix_freelist()
3981 args.pag = pag; in xfs_free_extent_fix_freelist()
3987 if (args.agno >= args.mp->m_sb.sb_agcount) in xfs_free_extent_fix_freelist()
3990 error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING); in xfs_free_extent_fix_freelist()
3994 *agbp = args.agbp; in xfs_free_extent_fix_freelist()