Lines Matching refs:args
272 xfs_alloc_arg_t *args, /* allocation argument structure */
285 busy = xfs_extent_busy_trim(args, &bno, &len, busy_gen);
291 if (bno < args->min_agbno && bno + len > args->min_agbno) {
292 diff = args->min_agbno - bno;
299 if (args->alignment > 1 && len >= args->minlen) {
300 xfs_agblock_t aligned_bno = roundup(bno, args->alignment);
391 xfs_alloc_arg_t *args) /* allocation argument structure */
396 ASSERT(args->mod < args->prod);
397 rlen = args->len;
398 ASSERT(rlen >= args->minlen);
399 ASSERT(rlen <= args->maxlen);
400 if (args->prod <= 1 || rlen < args->mod || rlen == args->maxlen ||
401 (args->mod == 0 && rlen < args->prod))
403 k = rlen % args->prod;
404 if (k == args->mod)
406 if (k > args->mod)
407 rlen = rlen - (k - args->mod);
409 rlen = rlen - args->prod + (args->mod - k);
411 if ((int)rlen < (int)args->minlen)
413 ASSERT(rlen >= args->minlen && rlen <= args->maxlen);
414 ASSERT(rlen % args->prod == args->mod);
415 ASSERT(args->pag->pagf_freeblks + args->pag->pagf_flcount >=
416 rlen + args->minleft);
417 args->len = rlen;
756 struct xfs_alloc_arg *args,
762 ASSERT(args->alignment == 1 || args->type != XFS_ALLOCTYPE_THIS_BNO);
764 acur->cur_len = args->maxlen;
779 acur->cnt = xfs_allocbt_init_cursor(args->mp, args->tp,
780 args->agbp, args->agno, XFS_BTNUM_CNT);
781 error = xfs_alloc_lookup_ge(acur->cnt, 0, args->maxlen, &i);
789 acur->bnolt = xfs_allocbt_init_cursor(args->mp, args->tp,
790 args->agbp, args->agno, XFS_BTNUM_BNO);
792 acur->bnogt = xfs_allocbt_init_cursor(args->mp, args->tp,
793 args->agbp, args->agno, XFS_BTNUM_BNO);
824 struct xfs_alloc_arg *args,
842 if (XFS_IS_CORRUPT(args->mp, i != 1))
849 if (len < args->minlen) {
854 busy = xfs_alloc_compute_aligned(args, bno, len, &bnoa, &lena,
860 if (bnoa < args->min_agbno || bnoa > args->max_agbno) {
864 if (lena < args->minlen)
867 args->len = XFS_EXTLEN_MIN(lena, args->maxlen);
868 xfs_alloc_fix_len(args);
869 ASSERT(args->len >= args->minlen);
870 if (args->len < acur->len)
877 ASSERT(args->type == XFS_ALLOCTYPE_NEAR_BNO);
878 diff = xfs_alloc_compute_diff(args->agbno, args->len,
879 args->alignment, args->datatype,
892 ASSERT(args->len > acur->len ||
893 (args->len == acur->len && diff <= acur->diff));
897 acur->len = args->len;
906 if (acur->diff == 0 && acur->len == args->maxlen)
911 trace_xfs_alloc_cur_check(args->mp, cur->bc_btnum, bno, len, diff,
918 * trees and update the args structure.
922 struct xfs_alloc_arg *args,
925 struct xfs_agf __maybe_unused *agf = args->agbp->b_addr;
938 args->agbno = acur->bno;
939 args->len = acur->len;
940 args->wasfromfl = 0;
942 trace_xfs_alloc_cur(args);
952 struct xfs_alloc_arg *args,
966 error = xfs_alloc_lookup_ge(cur, args->agbno, cur_len, &i);
976 error = xfs_alloc_cur_check(args, acur, cur, &i);
989 if (bno > args->agbno) {
994 error = xfs_alloc_cur_check(args, acur, cur,
1023 struct xfs_alloc_arg *args, /* allocation argument structure */
1029 struct xfs_agf *agf = args->agbp->b_addr;
1049 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1056 if (args->minlen != 1 || args->alignment != 1 ||
1057 args->resv == XFS_AG_RESV_AGFL ||
1058 be32_to_cpu(agf->agf_flcount) <= args->minleft)
1061 error = xfs_alloc_get_freelist(args->tp, args->agbp, &fbno, 0);
1067 xfs_extent_busy_reuse(args->mp, args->agno, fbno, 1,
1068 (args->datatype & XFS_ALLOC_NOBUSY));
1070 if (args->datatype & XFS_ALLOC_USERDATA) {
1073 error = xfs_trans_get_buf(args->tp, args->mp->m_ddev_targp,
1074 XFS_AGB_TO_DADDR(args->mp, args->agno, fbno),
1075 args->mp->m_bsize, 0, &bp);
1078 xfs_trans_binval(args->tp, bp);
1080 *fbnop = args->agbno = fbno;
1081 *flenp = args->len = 1;
1082 if (XFS_IS_CORRUPT(args->mp, fbno >= be32_to_cpu(agf->agf_length))) {
1086 args->wasfromfl = 1;
1087 trace_xfs_alloc_small_freelist(args);
1093 error = xfs_rmap_free(args->tp, args->agbp, args->agno, fbno, 1,
1105 if (flen < args->minlen) {
1106 args->agbno = NULLAGBLOCK;
1107 trace_xfs_alloc_small_notenough(args);
1113 trace_xfs_alloc_small_done(args);
1117 trace_xfs_alloc_small_error(args);
1131 xfs_alloc_arg_t *args) /* argument structure for allocation */
1135 ASSERT(args->minlen > 0);
1136 ASSERT(args->maxlen > 0);
1137 ASSERT(args->minlen <= args->maxlen);
1138 ASSERT(args->mod < args->prod);
1139 ASSERT(args->alignment > 0);
1144 args->wasfromfl = 0;
1145 switch (args->type) {
1147 error = xfs_alloc_ag_vextent_size(args);
1150 error = xfs_alloc_ag_vextent_near(args);
1153 error = xfs_alloc_ag_vextent_exact(args);
1160 if (error || args->agbno == NULLAGBLOCK)
1163 ASSERT(args->len >= args->minlen);
1164 ASSERT(args->len <= args->maxlen);
1165 ASSERT(!args->wasfromfl || args->resv != XFS_AG_RESV_AGFL);
1166 ASSERT(args->agbno % args->alignment == 0);
1169 if (!xfs_rmap_should_skip_owner_update(&args->oinfo)) {
1170 error = xfs_rmap_alloc(args->tp, args->agbp, args->agno,
1171 args->agbno, args->len, &args->oinfo);
1176 if (!args->wasfromfl) {
1177 error = xfs_alloc_update_counters(args->tp, args->agbp,
1178 -((long)(args->len)));
1182 ASSERT(!xfs_extent_busy_search(args->mp, args->agno,
1183 args->agbno, args->len));
1186 xfs_ag_resv_alloc_extent(args->pag, args->resv, args);
1188 XFS_STATS_INC(args->mp, xs_allocx);
1189 XFS_STATS_ADD(args->mp, xs_allocb, args->len);
1201 xfs_alloc_arg_t *args) /* allocation argument structure */
1203 struct xfs_agf __maybe_unused *agf = args->agbp->b_addr;
1215 ASSERT(args->alignment == 1);
1220 bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
1221 args->agno, XFS_BTNUM_BNO);
1228 error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i);
1240 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1244 ASSERT(fbno <= args->agbno);
1251 xfs_extent_busy_trim(args, &tbno, &tlen, &busy_gen);
1257 if (tbno > args->agbno)
1259 if (tlen < args->minlen)
1262 if (tend < args->agbno + args->minlen)
1271 args->len = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen)
1272 - args->agbno;
1273 xfs_alloc_fix_len(args);
1274 ASSERT(args->agbno + args->len <= tend);
1277 * We are allocating agbno for args->len
1280 cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
1281 args->agno, XFS_BTNUM_CNT);
1282 ASSERT(args->agbno + args->len <= be32_to_cpu(agf->agf_length));
1283 error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, args->agbno,
1284 args->len, XFSA_FIXUP_BNO_OK);
1293 args->wasfromfl = 0;
1294 trace_xfs_alloc_exact_done(args);
1300 args->agbno = NULLAGBLOCK;
1301 trace_xfs_alloc_exact_notfound(args);
1306 trace_xfs_alloc_exact_error(args);
1316 struct xfs_alloc_arg *args,
1335 error = xfs_alloc_cur_check(args, acur, cur, &i);
1368 struct xfs_alloc_arg *args,
1378 ASSERT(args->type == XFS_ALLOCTYPE_NEAR_BNO);
1382 error = xfs_alloc_lookup_ge(acur->cnt, args->agbno, acur->cur_len, &i);
1385 error = xfs_alloc_lookup_le(acur->bnolt, args->agbno, 0, &i);
1388 error = xfs_alloc_lookup_ge(acur->bnogt, args->agbno, 0, &i);
1418 trace_xfs_alloc_cur_lookup(args);
1424 error = xfs_alloc_walk_iter(args, acur, acur->bnolt, false,
1429 trace_xfs_alloc_cur_left(args);
1434 error = xfs_alloc_walk_iter(args, acur, acur->bnogt, true, true,
1439 trace_xfs_alloc_cur_right(args);
1449 error = xfs_alloc_cntbt_iter(args, acur);
1453 trace_xfs_alloc_cur_lookup_done(args);
1479 error = xfs_alloc_walk_iter(args, acur, fbcur, fbinc, true, -1,
1494 struct xfs_alloc_arg *args,
1515 if (*len || args->alignment > 1) {
1521 if (XFS_IS_CORRUPT(args->mp, i != 1))
1523 if (*len >= args->minlen)
1529 ASSERT(*len >= args->minlen);
1534 error = xfs_alloc_walk_iter(args, acur, acur->cnt, true, false, -1, &i);
1545 trace_xfs_alloc_near_first(args);
1558 struct xfs_alloc_arg *args)
1567 if (!args->min_agbno && !args->max_agbno)
1568 args->max_agbno = args->mp->m_sb.sb_agblocks - 1;
1569 ASSERT(args->min_agbno <= args->max_agbno);
1572 if (args->agbno < args->min_agbno)
1573 args->agbno = args->min_agbno;
1574 if (args->agbno > args->max_agbno)
1575 args->agbno = args->max_agbno;
1585 error = xfs_alloc_cur_setup(args, &acur);
1587 error = xfs_alloc_ag_vextent_small(args, acur.cnt, &bno,
1592 trace_xfs_alloc_near_noentry(args);
1611 error = xfs_alloc_ag_vextent_lastblock(args, &acur, &bno, &len,
1623 error = xfs_alloc_ag_vextent_locality(args, &acur, &i);
1632 trace_xfs_alloc_near_busy(args);
1633 xfs_extent_busy_flush(args->mp, args->pag,
1637 trace_xfs_alloc_size_neither(args);
1638 args->agbno = NULLAGBLOCK;
1644 error = xfs_alloc_cur_finish(args, &acur);
1659 xfs_alloc_arg_t *args) /* allocation argument structure */
1661 struct xfs_agf *agf = args->agbp->b_addr;
1677 cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
1678 args->agno, XFS_BTNUM_CNT);
1686 args->maxlen + args->alignment - 1, &i)))
1697 error = xfs_alloc_ag_vextent_small(args, cnt_cur,
1703 trace_xfs_alloc_size_noentry(args);
1707 busy = xfs_alloc_compute_aligned(args, fbno, flen, &rbno,
1717 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1722 busy = xfs_alloc_compute_aligned(args, fbno, flen,
1725 if (rlen >= args->maxlen)
1739 trace_xfs_alloc_size_busy(args);
1740 xfs_extent_busy_flush(args->mp,
1741 args->pag, busy_gen);
1753 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
1754 if (XFS_IS_CORRUPT(args->mp,
1761 if (rlen < args->maxlen) {
1779 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1785 busy = xfs_alloc_compute_aligned(args, fbno, flen,
1787 rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
1788 if (XFS_IS_CORRUPT(args->mp,
1800 if (rlen == args->maxlen)
1807 if (XFS_IS_CORRUPT(args->mp, i != 1)) {
1816 args->wasfromfl = 0;
1820 args->len = rlen;
1821 if (rlen < args->minlen) {
1824 trace_xfs_alloc_size_busy(args);
1825 xfs_extent_busy_flush(args->mp, args->pag, busy_gen);
1830 xfs_alloc_fix_len(args);
1832 rlen = args->len;
1833 if (XFS_IS_CORRUPT(args->mp, rlen > flen)) {
1840 bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
1841 args->agno, XFS_BTNUM_BNO);
1848 args->len = rlen;
1849 args->agbno = rbno;
1850 if (XFS_IS_CORRUPT(args->mp,
1851 args->agbno + args->len >
1856 trace_xfs_alloc_size_done(args);
1860 trace_xfs_alloc_size_error(args);
1869 trace_xfs_alloc_size_nominleft(args);
1870 args->agbno = NULLAGBLOCK;
2283 struct xfs_alloc_arg *args,
2287 struct xfs_perag *pag = args->pag;
2296 reservation = xfs_ag_resv_needed(pag, args->resv);
2299 alloc_len = args->minlen + (args->alignment - 1) + args->minalignslop;
2311 reservation - min_free - args->minleft);
2312 if (available < (int)max(args->total, alloc_len))
2319 if (available < (int)args->maxlen && !(flags & XFS_ALLOC_FLAG_CHECK)) {
2320 args->maxlen = available;
2321 ASSERT(args->maxlen > 0);
2322 ASSERT(args->maxlen >= args->minlen);
2483 struct xfs_alloc_arg *args, /* allocation argument structure */
2486 struct xfs_mount *mp = args->mp;
2487 struct xfs_perag *pag = args->pag;
2488 struct xfs_trans *tp = args->tp;
2500 error = xfs_alloc_read_agf(mp, tp, args->agno, flags, &agbp);
2514 if (pag->pagf_metadata && (args->datatype & XFS_ALLOC_USERDATA) &&
2521 if (!xfs_alloc_space_available(args, need, flags |
2530 error = xfs_alloc_read_agf(mp, tp, args->agno, flags, &agbp);
2545 if (!xfs_alloc_space_available(args, need, flags))
2584 xfs_defer_agfl_block(tp, args->agno, bno, &targs.oinfo);
2590 targs.agno = args->agno;
2630 args->agbp = agbp;
2639 args->agbp = NULL;
3042 struct xfs_alloc_arg *args) /* allocation argument structure */
3053 mp = args->mp;
3054 type = args->otype = args->type;
3055 args->agbno = NULLAGBLOCK;
3062 if (args->maxlen > agsize)
3063 args->maxlen = agsize;
3064 if (args->alignment == 0)
3065 args->alignment = 1;
3066 ASSERT(XFS_FSB_TO_AGNO(mp, args->fsbno) < mp->m_sb.sb_agcount);
3067 ASSERT(XFS_FSB_TO_AGBNO(mp, args->fsbno) < agsize);
3068 ASSERT(args->minlen <= args->maxlen);
3069 ASSERT(args->minlen <= agsize);
3070 ASSERT(args->mod < args->prod);
3071 if (XFS_FSB_TO_AGNO(mp, args->fsbno) >= mp->m_sb.sb_agcount ||
3072 XFS_FSB_TO_AGBNO(mp, args->fsbno) >= agsize ||
3073 args->minlen > args->maxlen || args->minlen > agsize ||
3074 args->mod >= args->prod) {
3075 args->fsbno = NULLFSBLOCK;
3076 trace_xfs_alloc_vextent_badargs(args);
3087 args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
3088 args->pag = xfs_perag_get(mp, args->agno);
3089 error = xfs_alloc_fix_freelist(args, 0);
3091 trace_xfs_alloc_vextent_nofix(args);
3094 if (!args->agbp) {
3095 trace_xfs_alloc_vextent_noagbp(args);
3098 args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
3099 if ((error = xfs_alloc_ag_vextent(args)))
3107 if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) &&
3109 args->fsbno = XFS_AGB_TO_FSB(mp,
3114 args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
3115 args->type = XFS_ALLOCTYPE_NEAR_BNO;
3125 args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
3126 args->type = XFS_ALLOCTYPE_THIS_AG;
3133 args->agno = sagno = XFS_FSB_TO_AGNO(mp, args->fsbno);
3141 args->pag = xfs_perag_get(mp, args->agno);
3142 error = xfs_alloc_fix_freelist(args, flags);
3144 trace_xfs_alloc_vextent_nofix(args);
3150 if (args->agbp) {
3151 if ((error = xfs_alloc_ag_vextent(args)))
3156 trace_xfs_alloc_vextent_loopfailed(args);
3161 if (args->agno == sagno &&
3163 args->type = XFS_ALLOCTYPE_THIS_AG;
3171 if (++(args->agno) == mp->m_sb.sb_agcount) {
3172 if (args->tp->t_firstblock != NULLFSBLOCK)
3173 args->agno = sagno;
3175 args->agno = 0;
3181 if (args->agno == sagno) {
3183 args->agbno = NULLAGBLOCK;
3184 trace_xfs_alloc_vextent_allfailed(args);
3190 args->agbno = XFS_FSB_TO_AGBNO(mp,
3191 args->fsbno);
3192 args->type = XFS_ALLOCTYPE_NEAR_BNO;
3195 xfs_perag_put(args->pag);
3198 if (args->agno == sagno)
3202 mp->m_agfrotor = (args->agno * rotorstep + 1) %
3210 if (args->agbno == NULLAGBLOCK)
3211 args->fsbno = NULLFSBLOCK;
3213 args->fsbno = XFS_AGB_TO_FSB(mp, args->agno, args->agbno);
3215 ASSERT(args->len >= args->minlen);
3216 ASSERT(args->len <= args->maxlen);
3217 ASSERT(args->agbno % args->alignment == 0);
3218 XFS_AG_CHECK_DADDR(mp, XFS_FSB_TO_DADDR(mp, args->fsbno),
3219 args->len);
3223 xfs_perag_put(args->pag);
3226 xfs_perag_put(args->pag);
3237 struct xfs_alloc_arg args;
3240 memset(&args, 0, sizeof(struct xfs_alloc_arg));
3241 args.tp = tp;
3242 args.mp = tp->t_mountp;
3243 args.agno = agno;
3249 if (args.agno >= args.mp->m_sb.sb_agcount)
3252 args.pag = xfs_perag_get(args.mp, args.agno);
3253 ASSERT(args.pag);
3255 error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING);
3259 *agbp = args.agbp;
3261 xfs_perag_put(args.pag);