Lines Matching refs:args

320 	xfs_alloc_arg_t	*args,		/* allocation argument structure */
333 busy = xfs_extent_busy_trim(args, &bno, &len, busy_gen);
339 if (bno < args->min_agbno && bno + len > args->min_agbno) {
340 diff = args->min_agbno - bno;
347 if (args->alignment > 1 && len >= args->minlen) {
348 xfs_agblock_t aligned_bno = roundup(bno, args->alignment);
439 xfs_alloc_arg_t *args) /* allocation argument structure */
444 ASSERT(args->mod < args->prod);
445 rlen = args->len;
446 ASSERT(rlen >= args->minlen);
447 ASSERT(rlen <= args->maxlen);
448 if (args->prod <= 1 || rlen < args->mod || rlen == args->maxlen ||
449 (args->mod == 0 && rlen < args->prod))
451 k = rlen % args->prod;
452 if (k == args->mod)
454 if (k > args->mod)
455 rlen = rlen - (k - args->mod);
457 rlen = rlen - args->prod + (args->mod - k);
459 if ((int)rlen < (int)args->minlen)
461 ASSERT(rlen >= args->minlen && rlen <= args->maxlen);
462 ASSERT(rlen % args->prod == args->mod);
463 ASSERT(args->pag->pagf_freeblks + args->pag->pagf_flcount >=
464 rlen + args->minleft);
465 args->len = rlen;
844 struct xfs_alloc_arg *args,
850 acur->cur_len = args->maxlen;
865 acur->cnt = xfs_cntbt_init_cursor(args->mp, args->tp,
866 args->agbp, args->pag);
867 error = xfs_alloc_lookup_ge(acur->cnt, 0, args->maxlen, &i);
875 acur->bnolt = xfs_bnobt_init_cursor(args->mp, args->tp,
876 args->agbp, args->pag);
878 acur->bnogt = xfs_bnobt_init_cursor(args->mp, args->tp,
879 args->agbp, args->pag);
910 struct xfs_alloc_arg *args,
928 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
937 if (len < args->minlen) {
942 busy = xfs_alloc_compute_aligned(args, bno, len, &bnoa, &lena,
948 if (bnoa < args->min_agbno || bnoa > args->max_agbno) {
952 if (lena < args->minlen)
955 args->len = XFS_EXTLEN_MIN(lena, args->maxlen);
956 xfs_alloc_fix_len(args);
957 ASSERT(args->len >= args->minlen);
958 if (args->len < acur->len)
965 diff = xfs_alloc_compute_diff(args->agbno, args->len,
966 args->alignment, args->datatype,
979 ASSERT(args->len > acur->len ||
980 (args->len == acur->len && diff <= acur->diff));
984 acur->len = args->len;
993 if (acur->diff == 0 && acur->len == args->maxlen)
1004 * trees and update the args structure.
1008 struct xfs_alloc_arg *args,
1011 struct xfs_agf __maybe_unused *agf = args->agbp->b_addr;
1024 args->agbno = acur->bno;
1025 args->len = acur->len;
1026 args->wasfromfl = 0;
1028 trace_xfs_alloc_cur(args);
1038 struct xfs_alloc_arg *args,
1052 error = xfs_alloc_lookup_ge(cur, args->agbno, cur_len, &i);
1062 error = xfs_alloc_cur_check(args, acur, cur, &i);
1075 if (bno > args->agbno) {
1080 error = xfs_alloc_cur_check(args, acur, cur,
1109 struct xfs_alloc_arg *args, /* allocation argument structure */
1115 struct xfs_agf *agf = args->agbp->b_addr;
1135 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1143 if (args->minlen != 1 || args->alignment != 1 ||
1144 args->resv == XFS_AG_RESV_AGFL ||
1145 be32_to_cpu(agf->agf_flcount) <= args->minleft)
1148 error = xfs_alloc_get_freelist(args->pag, args->tp, args->agbp,
1155 xfs_extent_busy_reuse(args->mp, args->pag, fbno, 1,
1156 (args->datatype & XFS_ALLOC_NOBUSY));
1158 if (args->datatype & XFS_ALLOC_USERDATA) {
1161 error = xfs_trans_get_buf(args->tp, args->mp->m_ddev_targp,
1162 XFS_AGB_TO_DADDR(args->mp, args->agno, fbno),
1163 args->mp->m_bsize, 0, &bp);
1166 xfs_trans_binval(args->tp, bp);
1168 *fbnop = args->agbno = fbno;
1169 *flenp = args->len = 1;
1170 if (XFS_IS_CORRUPT(args->mp, fbno >= be32_to_cpu(agf->agf_length))) {
1175 args->wasfromfl = 1;
1176 trace_xfs_alloc_small_freelist(args);
1182 error = xfs_rmap_free(args->tp, args->agbp, args->pag, fbno, 1,
1194 if (flen < args->minlen) {
1195 args->agbno = NULLAGBLOCK;
1196 trace_xfs_alloc_small_notenough(args);
1202 trace_xfs_alloc_small_done(args);
1206 trace_xfs_alloc_small_error(args);
1218 xfs_alloc_arg_t *args) /* allocation argument structure */
1220 struct xfs_agf __maybe_unused *agf = args->agbp->b_addr;
1232 ASSERT(args->alignment == 1);
1237 bno_cur = xfs_bnobt_init_cursor(args->mp, args->tp, args->agbp,
1238 args->pag);
1245 error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i);
1257 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1262 ASSERT(fbno <= args->agbno);
1269 xfs_extent_busy_trim(args, &tbno, &tlen, &busy_gen);
1275 if (tbno > args->agbno)
1277 if (tlen < args->minlen)
1280 if (tend < args->agbno + args->minlen)
1289 args->len = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen)
1290 - args->agbno;
1291 xfs_alloc_fix_len(args);
1292 ASSERT(args->agbno + args->len <= tend);
1295 * We are allocating agbno for args->len
1298 cnt_cur = xfs_cntbt_init_cursor(args->mp, args->tp, args->agbp,
1299 args->pag);
1300 ASSERT(args->agbno + args->len <= be32_to_cpu(agf->agf_length));
1301 error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, args->agbno,
1302 args->len, XFSA_FIXUP_BNO_OK);
1311 args->wasfromfl = 0;
1312 trace_xfs_alloc_exact_done(args);
1318 args->agbno = NULLAGBLOCK;
1319 trace_xfs_alloc_exact_notfound(args);
1324 trace_xfs_alloc_exact_error(args);
1334 struct xfs_alloc_arg *args,
1353 error = xfs_alloc_cur_check(args, acur, cur, &i);
1386 struct xfs_alloc_arg *args,
1399 error = xfs_alloc_lookup_ge(acur->cnt, args->agbno, acur->cur_len, &i);
1402 error = xfs_alloc_lookup_le(acur->bnolt, args->agbno, 0, &i);
1405 error = xfs_alloc_lookup_ge(acur->bnogt, args->agbno, 0, &i);
1435 trace_xfs_alloc_cur_lookup(args);
1441 error = xfs_alloc_walk_iter(args, acur, acur->bnolt, false,
1446 trace_xfs_alloc_cur_left(args);
1451 error = xfs_alloc_walk_iter(args, acur, acur->bnogt, true, true,
1456 trace_xfs_alloc_cur_right(args);
1466 error = xfs_alloc_cntbt_iter(args, acur);
1470 trace_xfs_alloc_cur_lookup_done(args);
1496 error = xfs_alloc_walk_iter(args, acur, fbcur, fbinc, true, -1,
1511 struct xfs_alloc_arg *args,
1532 if (*len || args->alignment > 1) {
1538 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1542 if (*len >= args->minlen)
1548 ASSERT(*len >= args->minlen);
1553 error = xfs_alloc_walk_iter(args, acur, acur->cnt, true, false, -1, &i);
1564 trace_xfs_alloc_near_first(args);
1577 struct xfs_alloc_arg *args,
1587 if (!args->min_agbno && !args->max_agbno)
1588 args->max_agbno = args->mp->m_sb.sb_agblocks - 1;
1589 ASSERT(args->min_agbno <= args->max_agbno);
1592 if (args->agbno < args->min_agbno)
1593 args->agbno = args->min_agbno;
1594 if (args->agbno > args->max_agbno)
1595 args->agbno = args->max_agbno;
1607 error = xfs_alloc_cur_setup(args, &acur);
1609 error = xfs_alloc_ag_vextent_small(args, acur.cnt, &bno,
1614 trace_xfs_alloc_near_noentry(args);
1633 error = xfs_alloc_ag_vextent_lastblock(args, &acur, &bno, &len,
1645 error = xfs_alloc_ag_vextent_locality(args, &acur, &i);
1661 trace_xfs_alloc_near_busy(args);
1662 error = xfs_extent_busy_flush(args->tp, args->pag,
1670 trace_xfs_alloc_size_neither(args);
1671 args->agbno = NULLAGBLOCK;
1677 error = xfs_alloc_cur_finish(args, &acur);
1692 struct xfs_alloc_arg *args,
1695 struct xfs_agf *agf = args->agbp->b_addr;
1713 cnt_cur = xfs_cntbt_init_cursor(args->mp, args->tp, args->agbp,
1714 args->pag);
1721 args->maxlen + args->alignment - 1, &i)))
1732 error = xfs_alloc_ag_vextent_small(args, cnt_cur,
1738 trace_xfs_alloc_size_noentry(args);
1742 busy = xfs_alloc_compute_aligned(args, fbno, flen, &rbno,
1752 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1758 busy = xfs_alloc_compute_aligned(args, fbno, flen,
1761 if (rlen >= args->maxlen)
1777 trace_xfs_alloc_size_busy(args);
1778 error = xfs_extent_busy_flush(args->tp, args->pag,
1795 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
1796 if (XFS_IS_CORRUPT(args->mp,
1804 if (rlen < args->maxlen) {
1822 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1829 busy = xfs_alloc_compute_aligned(args, fbno, flen,
1831 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
1832 if (XFS_IS_CORRUPT(args->mp,
1845 if (rlen == args->maxlen)
1852 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1862 args->wasfromfl = 0;
1866 args->len = rlen;
1867 if (rlen < args->minlen) {
1876 trace_xfs_alloc_size_busy(args);
1877 error = xfs_extent_busy_flush(args->tp, args->pag,
1888 xfs_alloc_fix_len(args);
1890 rlen = args->len;
1891 if (XFS_IS_CORRUPT(args->mp, rlen > flen)) {
1899 bno_cur = xfs_bnobt_init_cursor(args->mp, args->tp, args->agbp,
1900 args->pag);
1907 args->len = rlen;
1908 args->agbno = rbno;
1909 if (XFS_IS_CORRUPT(args->mp,
1910 args->agbno + args->len >
1912 xfs_ag_mark_sick(args->pag, XFS_SICK_AG_BNOBT);
1916 trace_xfs_alloc_size_done(args);
1920 trace_xfs_alloc_size_error(args);
1929 trace_xfs_alloc_size_nominleft(args);
1930 args->agbno = NULLAGBLOCK;
2382 struct xfs_alloc_arg *args,
2386 struct xfs_perag *pag = args->pag;
2395 reservation = xfs_ag_resv_needed(pag, args->resv);
2398 alloc_len = args->minlen + (args->alignment - 1) + args->minalignslop;
2410 reservation - min_free - args->minleft);
2411 if (available < (int)max(args->total, alloc_len))
2418 if (available < (int)args->maxlen && !(flags & XFS_ALLOC_FLAG_CHECK)) {
2419 args->maxlen = available;
2420 ASSERT(args->maxlen > 0);
2421 ASSERT(args->maxlen >= args->minlen);
2677 * @args structure are set to the relevant values.
2681 const struct xfs_alloc_arg *args,
2687 error = xfs_defer_extent_free(args->tp, args->fsbno, args->len,
2688 &args->oinfo, args->resv, skip_discard, &aarp->dfp);
2692 xfs_defer_item_pause(args->tp, aarp->dfp);
2744 * args->minlen.
2748 struct xfs_alloc_arg *args,
2757 cnt_cur = xfs_cntbt_init_cursor(args->mp, args->tp, agbp,
2758 args->pag);
2759 error = xfs_alloc_lookup_ge(cnt_cur, 0, args->minlen, stat);
2773 if (*stat == 1 && flen != args->minlen)
2789 struct xfs_alloc_arg *args, /* allocation argument structure */
2792 struct xfs_mount *mp = args->mp;
2793 struct xfs_perag *pag = args->pag;
2794 struct xfs_trans *tp = args->tp;
2821 (args->datatype & XFS_ALLOC_USERDATA) &&
2828 if (!xfs_alloc_space_available(args, need, alloc_flags |
2852 if (!xfs_alloc_space_available(args, need, alloc_flags))
2856 if (args->alloc_minlen_only) {
2859 error = xfs_exact_minlen_extent_available(args, agbp, &stat);
2901 error = xfs_defer_agfl_block(tp, args->agno, bno, &targs.oinfo);
2909 targs.agno = args->agno;
2960 args->agbp = agbp;
2969 args->agbp = NULL;
3419 * callers to set up correctly, as well as bounds check the allocation args
3424 struct xfs_alloc_arg *args,
3428 struct xfs_mount *mp = args->mp;
3431 args->fsbno = NULLFSBLOCK;
3434 if (args->tp->t_highest_agno != NULLAGNUMBER)
3435 *minimum_agno = args->tp->t_highest_agno;
3443 if (args->maxlen > agsize)
3444 args->maxlen = agsize;
3445 if (args->alignment == 0)
3446 args->alignment = 1;
3448 ASSERT(args->minlen > 0);
3449 ASSERT(args->maxlen > 0);
3450 ASSERT(args->alignment > 0);
3451 ASSERT(args->resv != XFS_AG_RESV_AGFL);
3455 ASSERT(args->minlen <= args->maxlen);
3456 ASSERT(args->minlen <= agsize);
3457 ASSERT(args->mod < args->prod);
3461 args->minlen > args->maxlen || args->minlen > agsize ||
3462 args->mod >= args->prod) {
3463 trace_xfs_alloc_vextent_badargs(args);
3467 if (args->agno != NULLAGNUMBER && *minimum_agno > args->agno) {
3468 trace_xfs_alloc_vextent_skip_deadlock(args);
3484 struct xfs_alloc_arg *args,
3487 bool need_pag = !args->pag;
3491 args->pag = xfs_perag_get(args->mp, args->agno);
3493 args->agbp = NULL;
3494 error = xfs_alloc_fix_freelist(args, alloc_flags);
3496 trace_xfs_alloc_vextent_nofix(args);
3498 xfs_perag_put(args->pag);
3499 args->agbno = NULLAGBLOCK;
3502 if (!args->agbp) {
3504 trace_xfs_alloc_vextent_noagbp(args);
3505 args->agbno = NULLAGBLOCK;
3508 args->wasfromfl = 0;
3521 struct xfs_alloc_arg *args,
3526 struct xfs_mount *mp = args->mp;
3545 if (args->agbp &&
3546 (args->tp->t_highest_agno == NULLAGNUMBER ||
3547 args->agno > minimum_agno))
3548 args->tp->t_highest_agno = args->agno;
3556 if (alloc_error || args->agbno == NULLAGBLOCK) {
3557 args->fsbno = NULLFSBLOCK;
3562 args->fsbno = XFS_AGB_TO_FSB(mp, args->agno, args->agbno);
3564 ASSERT(args->len >= args->minlen);
3565 ASSERT(args->len <= args->maxlen);
3566 ASSERT(args->agbno % args->alignment == 0);
3567 XFS_AG_CHECK_DADDR(mp, XFS_FSB_TO_DADDR(mp, args->fsbno), args->len);
3570 if (!xfs_rmap_should_skip_owner_update(&args->oinfo)) {
3571 error = xfs_rmap_alloc(args->tp, args->agbp, args->pag,
3572 args->agbno, args->len, &args->oinfo);
3577 if (!args->wasfromfl) {
3578 error = xfs_alloc_update_counters(args->tp, args->agbp,
3579 -((long)(args->len)));
3583 ASSERT(!xfs_extent_busy_search(mp, args->pag, args->agbno,
3584 args->len));
3587 xfs_ag_resv_alloc_extent(args->pag, args->resv, args);
3590 XFS_STATS_ADD(mp, xs_allocb, args->len);
3592 trace_xfs_alloc_vextent_finish(args);
3595 if (drop_perag && args->pag) {
3596 xfs_perag_rele(args->pag);
3597 args->pag = NULL;
3607 * Caller is expected to hold a perag reference in args->pag.
3611 struct xfs_alloc_arg *args,
3614 struct xfs_mount *mp = args->mp;
3619 ASSERT(args->pag != NULL);
3620 ASSERT(args->pag->pag_agno == agno);
3622 args->agno = agno;
3623 args->agbno = 0;
3625 trace_xfs_alloc_vextent_this_ag(args);
3627 error = xfs_alloc_vextent_check_args(args, XFS_AGB_TO_FSB(mp, agno, 0),
3635 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags);
3636 if (!error && args->agbp)
3637 error = xfs_alloc_ag_vextent_size(args, alloc_flags);
3639 return xfs_alloc_vextent_finish(args, minimum_agno, error, false);
3651 * On return, args->pag may be left referenced if we finish before the "all
3662 struct xfs_alloc_arg *args,
3668 struct xfs_mount *mp = args->mp;
3677 mp->m_sb.sb_agcount, agno, args->pag) {
3678 args->agno = agno;
3679 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags);
3682 if (!args->agbp) {
3683 trace_xfs_alloc_vextent_loopfailed(args);
3691 if (args->agno == start_agno && target_agbno) {
3692 args->agbno = target_agbno;
3693 error = xfs_alloc_ag_vextent_near(args, alloc_flags);
3695 args->agbno = 0;
3696 error = xfs_alloc_ag_vextent_size(args, alloc_flags);
3701 xfs_perag_rele(args->pag);
3702 args->pag = NULL;
3705 if (args->agbp)
3719 ASSERT(args->pag == NULL);
3720 trace_xfs_alloc_vextent_allfailed(args);
3734 struct xfs_alloc_arg *args,
3737 struct xfs_mount *mp = args->mp;
3745 ASSERT(args->pag == NULL);
3747 args->agno = NULLAGNUMBER;
3748 args->agbno = NULLAGBLOCK;
3750 trace_xfs_alloc_vextent_start_ag(args);
3752 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno);
3759 if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) &&
3768 error = xfs_alloc_vextent_iterate_ags(args, minimum_agno, start_agno,
3772 if (args->agno == start_agno)
3776 mp->m_agfrotor = (args->agno * rotorstep + 1) %
3780 return xfs_alloc_vextent_finish(args, minimum_agno, error, true);
3790 struct xfs_alloc_arg *args,
3793 struct xfs_mount *mp = args->mp;
3799 ASSERT(args->pag == NULL);
3801 args->agno = NULLAGNUMBER;
3802 args->agbno = NULLAGBLOCK;
3804 trace_xfs_alloc_vextent_first_ag(args);
3806 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno);
3814 error = xfs_alloc_vextent_iterate_ags(args, minimum_agno, start_agno,
3816 return xfs_alloc_vextent_finish(args, minimum_agno, error, true);
3821 * perag reference in args->pag.
3825 struct xfs_alloc_arg *args,
3828 struct xfs_mount *mp = args->mp;
3832 ASSERT(args->pag != NULL);
3833 ASSERT(args->pag->pag_agno == XFS_FSB_TO_AGNO(mp, target));
3835 args->agno = XFS_FSB_TO_AGNO(mp, target);
3836 args->agbno = XFS_FSB_TO_AGBNO(mp, target);
3838 trace_xfs_alloc_vextent_exact_bno(args);
3840 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno);
3847 error = xfs_alloc_vextent_prepare_ag(args, 0);
3848 if (!error && args->agbp)
3849 error = xfs_alloc_ag_vextent_exact(args);
3851 return xfs_alloc_vextent_finish(args, minimum_agno, error, false);
3858 * Caller may or may not have a per-ag reference in args->pag.
3862 struct xfs_alloc_arg *args,
3865 struct xfs_mount *mp = args->mp;
3867 bool needs_perag = args->pag == NULL;
3872 ASSERT(args->pag->pag_agno == XFS_FSB_TO_AGNO(mp, target));
3874 args->agno = XFS_FSB_TO_AGNO(mp, target);
3875 args->agbno = XFS_FSB_TO_AGBNO(mp, target);
3877 trace_xfs_alloc_vextent_near_bno(args);
3879 error = xfs_alloc_vextent_check_args(args, target, &minimum_agno);
3887 args->pag = xfs_perag_grab(mp, args->agno);
3889 error = xfs_alloc_vextent_prepare_ag(args, alloc_flags);
3890 if (!error && args->agbp)
3891 error = xfs_alloc_ag_vextent_near(args, alloc_flags);
3893 return xfs_alloc_vextent_finish(args, minimum_agno, error, needs_perag);
3903 struct xfs_alloc_arg args;
3906 memset(&args, 0, sizeof(struct xfs_alloc_arg));
3907 args.tp = tp;
3908 args.mp = tp->t_mountp;
3909 args.agno = pag->pag_agno;
3910 args.pag = pag;
3916 if (args.agno >= args.mp->m_sb.sb_agcount)
3919 error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING);
3923 *agbp = args.agbp;