2  * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
 
   5  * This program is free software; you can redistribute it and/or
 
   6  * modify it under the terms of the GNU General Public License as
 
   7  * published by the Free Software Foundation.
 
   9  * This program is distributed in the hope that it would be useful,
 
  10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
  11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
  12  * GNU General Public License for more details.
 
  14  * You should have received a copy of the GNU General Public License
 
  15  * along with this program; if not, write the Free Software Foundation,
 
  16  * Inc.,  51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
  20 #include "xfs_format.h"
 
  21 #include "xfs_log_format.h"
 
  22 #include "xfs_shared.h"
 
  23 #include "xfs_trans_resv.h"
 
  26 #include "xfs_mount.h"
 
  27 #include "xfs_defer.h"
 
  28 #include "xfs_inode.h"
 
  29 #include "xfs_btree.h"
 
  31 #include "xfs_alloc_btree.h"
 
  32 #include "xfs_alloc.h"
 
  33 #include "xfs_extent_busy.h"
 
  34 #include "xfs_errortag.h"
 
  35 #include "xfs_error.h"
 
  36 #include "xfs_cksum.h"
 
  37 #include "xfs_trace.h"
 
  38 #include "xfs_trans.h"
 
  39 #include "xfs_buf_item.h"
 
  41 #include "xfs_ag_resv.h"
 
  43 struct workqueue_struct *xfs_alloc_wq;
 
  45 #define XFS_ABSDIFF(a,b)        (((a) <= (b)) ? ((b) - (a)) : ((a) - (b)))
 
  47 #define XFSA_FIXUP_BNO_OK       1
 
  48 #define XFSA_FIXUP_CNT_OK       2
 
  50 STATIC int xfs_alloc_ag_vextent_exact(xfs_alloc_arg_t *);
 
  51 STATIC int xfs_alloc_ag_vextent_near(xfs_alloc_arg_t *);
 
  52 STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *);
 
  53 STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *,
 
  54                 xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *);
 
  60         if (xfs_sb_version_hasrmapbt(&mp->m_sb))
 
  61                 return XFS_RMAP_BLOCK(mp) + 1;
 
  62         if (xfs_sb_version_hasfinobt(&mp->m_sb))
 
  63                 return XFS_FIBT_BLOCK(mp) + 1;
 
  64         return XFS_IBT_BLOCK(mp) + 1;
 
  71         if (xfs_sb_version_hasreflink(&mp->m_sb))
 
  72                 return xfs_refc_block(mp) + 1;
 
  73         if (xfs_sb_version_hasrmapbt(&mp->m_sb))
 
  74                 return XFS_RMAP_BLOCK(mp) + 1;
 
  75         if (xfs_sb_version_hasfinobt(&mp->m_sb))
 
  76                 return XFS_FIBT_BLOCK(mp) + 1;
 
  77         return XFS_IBT_BLOCK(mp) + 1;
 
  81  * In order to avoid ENOSPC-related deadlock caused by out-of-order locking of
 
  82  * AGF buffer (PV 947395), we place constraints on the relationship among
 
  83  * actual allocations for data blocks, freelist blocks, and potential file data
 
  84  * bmap btree blocks. However, these restrictions may result in no actual space
 
  85  * allocated for a delayed extent, for example, a data block in a certain AG is
 
  86  * allocated but there is no additional block for the additional bmap btree
 
  87  * block due to a split of the bmap btree of the file. The result of this may
 
  88  * lead to an infinite loop when the file gets flushed to disk and all delayed
 
  89  * extents need to be actually allocated. To get around this, we explicitly set
 
  90  * aside a few blocks which will not be reserved in delayed allocation.
 
  92  * We need to reserve 4 fsbs _per AG_ for the freelist and 4 more to handle a
 
  93  * potential split of the file's bmap btree.
 
  99         return mp->m_sb.sb_agcount * (XFS_ALLOC_AGFL_RESERVE + 4);
 
 103  * When deciding how much space to allocate out of an AG, we limit the
 
 104  * allocation maximum size to the size the AG. However, we cannot use all the
 
 105  * blocks in the AG - some are permanently used by metadata. These
 
 106  * blocks are generally:
 
 107  *      - the AG superblock, AGF, AGI and AGFL
 
 108  *      - the AGF (bno and cnt) and AGI btree root blocks, and optionally
 
 109  *        the AGI free inode and rmap btree root blocks.
 
 110  *      - blocks on the AGFL according to xfs_alloc_set_aside() limits
 
 111  *      - the rmapbt root block
 
 113  * The AG headers are sector sized, so the amount of space they take up is
 
 114  * dependent on filesystem geometry. The others are all single blocks.
 
 117 xfs_alloc_ag_max_usable(
 
 118         struct xfs_mount        *mp)
 
 122         blocks = XFS_BB_TO_FSB(mp, XFS_FSS_TO_BB(mp, 4)); /* ag headers */
 
 123         blocks += XFS_ALLOC_AGFL_RESERVE;
 
 124         blocks += 3;                    /* AGF, AGI btree root blocks */
 
 125         if (xfs_sb_version_hasfinobt(&mp->m_sb))
 
 126                 blocks++;               /* finobt root block */
 
 127         if (xfs_sb_version_hasrmapbt(&mp->m_sb))
 
 128                 blocks++;               /* rmap root block */
 
 129         if (xfs_sb_version_hasreflink(&mp->m_sb))
 
 130                 blocks++;               /* refcount root block */
 
 132         return mp->m_sb.sb_agblocks - blocks;
 
 136  * Lookup the record equal to [bno, len] in the btree given by cur.
 
 138 STATIC int                              /* error */
 
 140         struct xfs_btree_cur    *cur,   /* btree cursor */
 
 141         xfs_agblock_t           bno,    /* starting block of extent */
 
 142         xfs_extlen_t            len,    /* length of extent */
 
 143         int                     *stat)  /* success/failure */
 
 145         cur->bc_rec.a.ar_startblock = bno;
 
 146         cur->bc_rec.a.ar_blockcount = len;
 
 147         return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat);
 
 151  * Lookup the first record greater than or equal to [bno, len]
 
 152  * in the btree given by cur.
 
 156         struct xfs_btree_cur    *cur,   /* btree cursor */
 
 157         xfs_agblock_t           bno,    /* starting block of extent */
 
 158         xfs_extlen_t            len,    /* length of extent */
 
 159         int                     *stat)  /* success/failure */
 
 161         cur->bc_rec.a.ar_startblock = bno;
 
 162         cur->bc_rec.a.ar_blockcount = len;
 
 163         return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat);
 
 167  * Lookup the first record less than or equal to [bno, len]
 
 168  * in the btree given by cur.
 
 172         struct xfs_btree_cur    *cur,   /* btree cursor */
 
 173         xfs_agblock_t           bno,    /* starting block of extent */
 
 174         xfs_extlen_t            len,    /* length of extent */
 
 175         int                     *stat)  /* success/failure */
 
 177         cur->bc_rec.a.ar_startblock = bno;
 
 178         cur->bc_rec.a.ar_blockcount = len;
 
 179         return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat);
 
 183  * Update the record referred to by cur to the value given
 
 185  * This either works (return 0) or gets an EFSCORRUPTED error.
 
 187 STATIC int                              /* error */
 
 189         struct xfs_btree_cur    *cur,   /* btree cursor */
 
 190         xfs_agblock_t           bno,    /* starting block of extent */
 
 191         xfs_extlen_t            len)    /* length of extent */
 
 193         union xfs_btree_rec     rec;
 
 195         rec.alloc.ar_startblock = cpu_to_be32(bno);
 
 196         rec.alloc.ar_blockcount = cpu_to_be32(len);
 
 197         return xfs_btree_update(cur, &rec);
 
 201  * Get the data from the pointed-to record.
 
 205         struct xfs_btree_cur    *cur,   /* btree cursor */
 
 206         xfs_agblock_t           *bno,   /* output: starting block of extent */
 
 207         xfs_extlen_t            *len,   /* output: length of extent */
 
 208         int                     *stat)  /* output: success/failure */
 
 210         union xfs_btree_rec     *rec;
 
 213         error = xfs_btree_get_rec(cur, &rec, stat);
 
 214         if (!error && *stat == 1) {
 
 215                 *bno = be32_to_cpu(rec->alloc.ar_startblock);
 
 216                 *len = be32_to_cpu(rec->alloc.ar_blockcount);
 
 222  * Compute aligned version of the found extent.
 
 223  * Takes alignment and min length into account.
 
 226 xfs_alloc_compute_aligned(
 
 227         xfs_alloc_arg_t *args,          /* allocation argument structure */
 
 228         xfs_agblock_t   foundbno,       /* starting block in found extent */
 
 229         xfs_extlen_t    foundlen,       /* length in found extent */
 
 230         xfs_agblock_t   *resbno,        /* result block number */
 
 231         xfs_extlen_t    *reslen,        /* result length */
 
 234         xfs_agblock_t   bno = foundbno;
 
 235         xfs_extlen_t    len = foundlen;
 
 239         /* Trim busy sections out of found extent */
 
 240         busy = xfs_extent_busy_trim(args, &bno, &len, busy_gen);
 
 243          * If we have a largish extent that happens to start before min_agbno,
 
 244          * see if we can shift it into range...
 
 246         if (bno < args->min_agbno && bno + len > args->min_agbno) {
 
 247                 diff = args->min_agbno - bno;
 
 254         if (args->alignment > 1 && len >= args->minlen) {
 
 255                 xfs_agblock_t   aligned_bno = roundup(bno, args->alignment);
 
 257                 diff = aligned_bno - bno;
 
 259                 *resbno = aligned_bno;
 
 260                 *reslen = diff >= len ? 0 : len - diff;
 
 270  * Compute best start block and diff for "near" allocations.
 
 271  * freelen >= wantlen already checked by caller.
 
 273 STATIC xfs_extlen_t                     /* difference value (absolute) */
 
 274 xfs_alloc_compute_diff(
 
 275         xfs_agblock_t   wantbno,        /* target starting block */
 
 276         xfs_extlen_t    wantlen,        /* target length */
 
 277         xfs_extlen_t    alignment,      /* target alignment */
 
 278         int             datatype,       /* are we allocating data? */
 
 279         xfs_agblock_t   freebno,        /* freespace's starting block */
 
 280         xfs_extlen_t    freelen,        /* freespace's length */
 
 281         xfs_agblock_t   *newbnop)       /* result: best start block from free */
 
 283         xfs_agblock_t   freeend;        /* end of freespace extent */
 
 284         xfs_agblock_t   newbno1;        /* return block number */
 
 285         xfs_agblock_t   newbno2;        /* other new block number */
 
 286         xfs_extlen_t    newlen1=0;      /* length with newbno1 */
 
 287         xfs_extlen_t    newlen2=0;      /* length with newbno2 */
 
 288         xfs_agblock_t   wantend;        /* end of target extent */
 
 289         bool            userdata = xfs_alloc_is_userdata(datatype);
 
 291         ASSERT(freelen >= wantlen);
 
 292         freeend = freebno + freelen;
 
 293         wantend = wantbno + wantlen;
 
 295          * We want to allocate from the start of a free extent if it is past
 
 296          * the desired block or if we are allocating user data and the free
 
 297          * extent is before desired block. The second case is there to allow
 
 298          * for contiguous allocation from the remaining free space if the file
 
 299          * grows in the short term.
 
 301         if (freebno >= wantbno || (userdata && freeend < wantend)) {
 
 302                 if ((newbno1 = roundup(freebno, alignment)) >= freeend)
 
 303                         newbno1 = NULLAGBLOCK;
 
 304         } else if (freeend >= wantend && alignment > 1) {
 
 305                 newbno1 = roundup(wantbno, alignment);
 
 306                 newbno2 = newbno1 - alignment;
 
 307                 if (newbno1 >= freeend)
 
 308                         newbno1 = NULLAGBLOCK;
 
 310                         newlen1 = XFS_EXTLEN_MIN(wantlen, freeend - newbno1);
 
 311                 if (newbno2 < freebno)
 
 312                         newbno2 = NULLAGBLOCK;
 
 314                         newlen2 = XFS_EXTLEN_MIN(wantlen, freeend - newbno2);
 
 315                 if (newbno1 != NULLAGBLOCK && newbno2 != NULLAGBLOCK) {
 
 316                         if (newlen1 < newlen2 ||
 
 317                             (newlen1 == newlen2 &&
 
 318                              XFS_ABSDIFF(newbno1, wantbno) >
 
 319                              XFS_ABSDIFF(newbno2, wantbno)))
 
 321                 } else if (newbno2 != NULLAGBLOCK)
 
 323         } else if (freeend >= wantend) {
 
 325         } else if (alignment > 1) {
 
 326                 newbno1 = roundup(freeend - wantlen, alignment);
 
 327                 if (newbno1 > freeend - wantlen &&
 
 328                     newbno1 - alignment >= freebno)
 
 329                         newbno1 -= alignment;
 
 330                 else if (newbno1 >= freeend)
 
 331                         newbno1 = NULLAGBLOCK;
 
 333                 newbno1 = freeend - wantlen;
 
 335         return newbno1 == NULLAGBLOCK ? 0 : XFS_ABSDIFF(newbno1, wantbno);
 
 339  * Fix up the length, based on mod and prod.
 
 340  * len should be k * prod + mod for some k.
 
 341  * If len is too small it is returned unchanged.
 
 342  * If len hits maxlen it is left alone.
 
 346         xfs_alloc_arg_t *args)          /* allocation argument structure */
 
 351         ASSERT(args->mod < args->prod);
 
 353         ASSERT(rlen >= args->minlen);
 
 354         ASSERT(rlen <= args->maxlen);
 
 355         if (args->prod <= 1 || rlen < args->mod || rlen == args->maxlen ||
 
 356             (args->mod == 0 && rlen < args->prod))
 
 358         k = rlen % args->prod;
 
 362                 rlen = rlen - (k - args->mod);
 
 364                 rlen = rlen - args->prod + (args->mod - k);
 
 365         /* casts to (int) catch length underflows */
 
 366         if ((int)rlen < (int)args->minlen)
 
 368         ASSERT(rlen >= args->minlen && rlen <= args->maxlen);
 
 369         ASSERT(rlen % args->prod == args->mod);
 
 370         ASSERT(args->pag->pagf_freeblks + args->pag->pagf_flcount >=
 
 371                 rlen + args->minleft);
 
 376  * Update the two btrees, logically removing from freespace the extent
 
 377  * starting at rbno, rlen blocks.  The extent is contained within the
 
 378  * actual (current) free extent fbno for flen blocks.
 
 379  * Flags are passed in indicating whether the cursors are set to the
 
 382 STATIC int                              /* error code */
 
 383 xfs_alloc_fixup_trees(
 
 384         xfs_btree_cur_t *cnt_cur,       /* cursor for by-size btree */
 
 385         xfs_btree_cur_t *bno_cur,       /* cursor for by-block btree */
 
 386         xfs_agblock_t   fbno,           /* starting block of free extent */
 
 387         xfs_extlen_t    flen,           /* length of free extent */
 
 388         xfs_agblock_t   rbno,           /* starting block of returned extent */
 
 389         xfs_extlen_t    rlen,           /* length of returned extent */
 
 390         int             flags)          /* flags, XFSA_FIXUP_... */
 
 392         int             error;          /* error code */
 
 393         int             i;              /* operation results */
 
 394         xfs_agblock_t   nfbno1;         /* first new free startblock */
 
 395         xfs_agblock_t   nfbno2;         /* second new free startblock */
 
 396         xfs_extlen_t    nflen1=0;       /* first new free length */
 
 397         xfs_extlen_t    nflen2=0;       /* second new free length */
 
 398         struct xfs_mount *mp;
 
 403          * Look up the record in the by-size tree if necessary.
 
 405         if (flags & XFSA_FIXUP_CNT_OK) {
 
 407                 if ((error = xfs_alloc_get_rec(cnt_cur, &nfbno1, &nflen1, &i)))
 
 409                 XFS_WANT_CORRUPTED_RETURN(mp,
 
 410                         i == 1 && nfbno1 == fbno && nflen1 == flen);
 
 413                 if ((error = xfs_alloc_lookup_eq(cnt_cur, fbno, flen, &i)))
 
 415                 XFS_WANT_CORRUPTED_RETURN(mp, i == 1);
 
 418          * Look up the record in the by-block tree if necessary.
 
 420         if (flags & XFSA_FIXUP_BNO_OK) {
 
 422                 if ((error = xfs_alloc_get_rec(bno_cur, &nfbno1, &nflen1, &i)))
 
 424                 XFS_WANT_CORRUPTED_RETURN(mp,
 
 425                         i == 1 && nfbno1 == fbno && nflen1 == flen);
 
 428                 if ((error = xfs_alloc_lookup_eq(bno_cur, fbno, flen, &i)))
 
 430                 XFS_WANT_CORRUPTED_RETURN(mp, i == 1);
 
 434         if (bno_cur->bc_nlevels == 1 && cnt_cur->bc_nlevels == 1) {
 
 435                 struct xfs_btree_block  *bnoblock;
 
 436                 struct xfs_btree_block  *cntblock;
 
 438                 bnoblock = XFS_BUF_TO_BLOCK(bno_cur->bc_bufs[0]);
 
 439                 cntblock = XFS_BUF_TO_BLOCK(cnt_cur->bc_bufs[0]);
 
 441                 XFS_WANT_CORRUPTED_RETURN(mp,
 
 442                         bnoblock->bb_numrecs == cntblock->bb_numrecs);
 
 447          * Deal with all four cases: the allocated record is contained
 
 448          * within the freespace record, so we can have new freespace
 
 449          * at either (or both) end, or no freespace remaining.
 
 451         if (rbno == fbno && rlen == flen)
 
 452                 nfbno1 = nfbno2 = NULLAGBLOCK;
 
 453         else if (rbno == fbno) {
 
 454                 nfbno1 = rbno + rlen;
 
 455                 nflen1 = flen - rlen;
 
 456                 nfbno2 = NULLAGBLOCK;
 
 457         } else if (rbno + rlen == fbno + flen) {
 
 459                 nflen1 = flen - rlen;
 
 460                 nfbno2 = NULLAGBLOCK;
 
 463                 nflen1 = rbno - fbno;
 
 464                 nfbno2 = rbno + rlen;
 
 465                 nflen2 = (fbno + flen) - nfbno2;
 
 468          * Delete the entry from the by-size btree.
 
 470         if ((error = xfs_btree_delete(cnt_cur, &i)))
 
 472         XFS_WANT_CORRUPTED_RETURN(mp, i == 1);
 
 474          * Add new by-size btree entry(s).
 
 476         if (nfbno1 != NULLAGBLOCK) {
 
 477                 if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno1, nflen1, &i)))
 
 479                 XFS_WANT_CORRUPTED_RETURN(mp, i == 0);
 
 480                 if ((error = xfs_btree_insert(cnt_cur, &i)))
 
 482                 XFS_WANT_CORRUPTED_RETURN(mp, i == 1);
 
 484         if (nfbno2 != NULLAGBLOCK) {
 
 485                 if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno2, nflen2, &i)))
 
 487                 XFS_WANT_CORRUPTED_RETURN(mp, i == 0);
 
 488                 if ((error = xfs_btree_insert(cnt_cur, &i)))
 
 490                 XFS_WANT_CORRUPTED_RETURN(mp, i == 1);
 
 493          * Fix up the by-block btree entry(s).
 
 495         if (nfbno1 == NULLAGBLOCK) {
 
 497                  * No remaining freespace, just delete the by-block tree entry.
 
 499                 if ((error = xfs_btree_delete(bno_cur, &i)))
 
 501                 XFS_WANT_CORRUPTED_RETURN(mp, i == 1);
 
 504                  * Update the by-block entry to start later|be shorter.
 
 506                 if ((error = xfs_alloc_update(bno_cur, nfbno1, nflen1)))
 
 509         if (nfbno2 != NULLAGBLOCK) {
 
 511                  * 2 resulting free entries, need to add one.
 
 513                 if ((error = xfs_alloc_lookup_eq(bno_cur, nfbno2, nflen2, &i)))
 
 515                 XFS_WANT_CORRUPTED_RETURN(mp, i == 0);
 
 516                 if ((error = xfs_btree_insert(bno_cur, &i)))
 
 518                 XFS_WANT_CORRUPTED_RETURN(mp, i == 1);
 
 523 static xfs_failaddr_t
 
 527         struct xfs_mount *mp = bp->b_target->bt_mount;
 
 528         struct xfs_agfl *agfl = XFS_BUF_TO_AGFL(bp);
 
 532          * There is no verification of non-crc AGFLs because mkfs does not
 
 533          * initialise the AGFL to zero or NULL. Hence the only valid part of the
 
 534          * AGFL is what the AGF says is active. We can't get to the AGF, so we
 
 535          * can't verify just those entries are valid.
 
 537         if (!xfs_sb_version_hascrc(&mp->m_sb))
 
 540         if (!uuid_equal(&agfl->agfl_uuid, &mp->m_sb.sb_meta_uuid))
 
 541                 return __this_address;
 
 542         if (be32_to_cpu(agfl->agfl_magicnum) != XFS_AGFL_MAGIC)
 
 543                 return __this_address;
 
 545          * during growfs operations, the perag is not fully initialised,
 
 546          * so we can't use it for any useful checking. growfs ensures we can't
 
 547          * use it by using uncached buffers that don't have the perag attached
 
 548          * so we can detect and avoid this problem.
 
 550         if (bp->b_pag && be32_to_cpu(agfl->agfl_seqno) != bp->b_pag->pag_agno)
 
 551                 return __this_address;
 
 553         for (i = 0; i < XFS_AGFL_SIZE(mp); i++) {
 
 554                 if (be32_to_cpu(agfl->agfl_bno[i]) != NULLAGBLOCK &&
 
 555                     be32_to_cpu(agfl->agfl_bno[i]) >= mp->m_sb.sb_agblocks)
 
 556                         return __this_address;
 
 559         if (!xfs_log_check_lsn(mp, be64_to_cpu(XFS_BUF_TO_AGFL(bp)->agfl_lsn)))
 
 560                 return __this_address;
 
 565 xfs_agfl_read_verify(
 
 568         struct xfs_mount *mp = bp->b_target->bt_mount;
 
 572          * There is no verification of non-crc AGFLs because mkfs does not
 
 573          * initialise the AGFL to zero or NULL. Hence the only valid part of the
 
 574          * AGFL is what the AGF says is active. We can't get to the AGF, so we
 
 575          * can't verify just those entries are valid.
 
 577         if (!xfs_sb_version_hascrc(&mp->m_sb))
 
 580         if (!xfs_buf_verify_cksum(bp, XFS_AGFL_CRC_OFF))
 
 581                 xfs_verifier_error(bp, -EFSBADCRC, __this_address);
 
 583                 fa = xfs_agfl_verify(bp);
 
 585                         xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 
 590 xfs_agfl_write_verify(
 
 593         struct xfs_mount        *mp = bp->b_target->bt_mount;
 
 594         struct xfs_buf_log_item *bip = bp->b_log_item;
 
 597         /* no verification of non-crc AGFLs */
 
 598         if (!xfs_sb_version_hascrc(&mp->m_sb))
 
 601         fa = xfs_agfl_verify(bp);
 
 603                 xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 
 608                 XFS_BUF_TO_AGFL(bp)->agfl_lsn = cpu_to_be64(bip->bli_item.li_lsn);
 
 610         xfs_buf_update_cksum(bp, XFS_AGFL_CRC_OFF);
 
 613 const struct xfs_buf_ops xfs_agfl_buf_ops = {
 
 615         .verify_read = xfs_agfl_read_verify,
 
 616         .verify_write = xfs_agfl_write_verify,
 
 617         .verify_struct = xfs_agfl_verify,
 
 621  * Read in the allocation group free block array.
 
 625         xfs_mount_t     *mp,            /* mount point structure */
 
 626         xfs_trans_t     *tp,            /* transaction pointer */
 
 627         xfs_agnumber_t  agno,           /* allocation group number */
 
 628         xfs_buf_t       **bpp)          /* buffer for the ag free block array */
 
 630         xfs_buf_t       *bp;            /* return value */
 
 633         ASSERT(agno != NULLAGNUMBER);
 
 634         error = xfs_trans_read_buf(
 
 635                         mp, tp, mp->m_ddev_targp,
 
 636                         XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
 
 637                         XFS_FSS_TO_BB(mp, 1), 0, &bp, &xfs_agfl_buf_ops);
 
 640         xfs_buf_set_ref(bp, XFS_AGFL_REF);
 
 646 xfs_alloc_update_counters(
 
 647         struct xfs_trans        *tp,
 
 648         struct xfs_perag        *pag,
 
 649         struct xfs_buf          *agbp,
 
 652         struct xfs_agf          *agf = XFS_BUF_TO_AGF(agbp);
 
 654         pag->pagf_freeblks += len;
 
 655         be32_add_cpu(&agf->agf_freeblks, len);
 
 657         xfs_trans_agblocks_delta(tp, len);
 
 658         if (unlikely(be32_to_cpu(agf->agf_freeblks) >
 
 659                      be32_to_cpu(agf->agf_length)))
 
 660                 return -EFSCORRUPTED;
 
 662         xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS);
 
 667  * Allocation group level functions.
 
 671  * Allocate a variable extent in the allocation group agno.
 
 672  * Type and bno are used to determine where in the allocation group the
 
 674  * Extent's length (returned in *len) will be between minlen and maxlen,
 
 675  * and of the form k * prod + mod unless there's nothing that large.
 
 676  * Return the starting a.g. block, or NULLAGBLOCK if we can't do it.
 
 678 STATIC int                      /* error */
 
 679 xfs_alloc_ag_vextent(
 
 680         xfs_alloc_arg_t *args)  /* argument structure for allocation */
 
 684         ASSERT(args->minlen > 0);
 
 685         ASSERT(args->maxlen > 0);
 
 686         ASSERT(args->minlen <= args->maxlen);
 
 687         ASSERT(args->mod < args->prod);
 
 688         ASSERT(args->alignment > 0);
 
 691          * Branch to correct routine based on the type.
 
 694         switch (args->type) {
 
 695         case XFS_ALLOCTYPE_THIS_AG:
 
 696                 error = xfs_alloc_ag_vextent_size(args);
 
 698         case XFS_ALLOCTYPE_NEAR_BNO:
 
 699                 error = xfs_alloc_ag_vextent_near(args);
 
 701         case XFS_ALLOCTYPE_THIS_BNO:
 
 702                 error = xfs_alloc_ag_vextent_exact(args);
 
 709         if (error || args->agbno == NULLAGBLOCK)
 
 712         ASSERT(args->len >= args->minlen);
 
 713         ASSERT(args->len <= args->maxlen);
 
 714         ASSERT(!args->wasfromfl || args->resv != XFS_AG_RESV_AGFL);
 
 715         ASSERT(args->agbno % args->alignment == 0);
 
 717         /* if not file data, insert new block into the reverse map btree */
 
 718         if (!xfs_rmap_should_skip_owner_update(&args->oinfo)) {
 
 719                 error = xfs_rmap_alloc(args->tp, args->agbp, args->agno,
 
 720                                        args->agbno, args->len, &args->oinfo);
 
 725         if (!args->wasfromfl) {
 
 726                 error = xfs_alloc_update_counters(args->tp, args->pag,
 
 728                                                   -((long)(args->len)));
 
 732                 ASSERT(!xfs_extent_busy_search(args->mp, args->agno,
 
 733                                               args->agbno, args->len));
 
 736         xfs_ag_resv_alloc_extent(args->pag, args->resv, args);
 
 738         XFS_STATS_INC(args->mp, xs_allocx);
 
 739         XFS_STATS_ADD(args->mp, xs_allocb, args->len);
 
 744  * Allocate a variable extent at exactly agno/bno.
 
 745  * Extent's length (returned in *len) will be between minlen and maxlen,
 
 746  * and of the form k * prod + mod unless there's nothing that large.
 
 747  * Return the starting a.g. block (bno), or NULLAGBLOCK if we can't do it.
 
 749 STATIC int                      /* error */
 
 750 xfs_alloc_ag_vextent_exact(
 
 751         xfs_alloc_arg_t *args)  /* allocation argument structure */
 
 753         xfs_btree_cur_t *bno_cur;/* by block-number btree cursor */
 
 754         xfs_btree_cur_t *cnt_cur;/* by count btree cursor */
 
 756         xfs_agblock_t   fbno;   /* start block of found extent */
 
 757         xfs_extlen_t    flen;   /* length of found extent */
 
 758         xfs_agblock_t   tbno;   /* start block of busy extent */
 
 759         xfs_extlen_t    tlen;   /* length of busy extent */
 
 760         xfs_agblock_t   tend;   /* end block of busy extent */
 
 761         int             i;      /* success/failure of operation */
 
 764         ASSERT(args->alignment == 1);
 
 767          * Allocate/initialize a cursor for the by-number freespace btree.
 
 769         bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
 
 770                                           args->agno, XFS_BTNUM_BNO);
 
 773          * Lookup bno and minlen in the btree (minlen is irrelevant, really).
 
 774          * Look for the closest free block <= bno, it must contain bno
 
 775          * if any free block does.
 
 777         error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i);
 
 784          * Grab the freespace record.
 
 786         error = xfs_alloc_get_rec(bno_cur, &fbno, &flen, &i);
 
 789         XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
 790         ASSERT(fbno <= args->agbno);
 
 793          * Check for overlapping busy extents.
 
 797         xfs_extent_busy_trim(args, &tbno, &tlen, &busy_gen);
 
 800          * Give up if the start of the extent is busy, or the freespace isn't
 
 801          * long enough for the minimum request.
 
 803         if (tbno > args->agbno)
 
 805         if (tlen < args->minlen)
 
 808         if (tend < args->agbno + args->minlen)
 
 812          * End of extent will be smaller of the freespace end and the
 
 813          * maximal requested end.
 
 815          * Fix the length according to mod and prod if given.
 
 817         args->len = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen)
 
 819         xfs_alloc_fix_len(args);
 
 820         ASSERT(args->agbno + args->len <= tend);
 
 823          * We are allocating agbno for args->len
 
 824          * Allocate/initialize a cursor for the by-size btree.
 
 826         cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
 
 827                 args->agno, XFS_BTNUM_CNT);
 
 828         ASSERT(args->agbno + args->len <=
 
 829                 be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length));
 
 830         error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, args->agbno,
 
 831                                       args->len, XFSA_FIXUP_BNO_OK);
 
 833                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
 
 837         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
 
 838         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
 841         trace_xfs_alloc_exact_done(args);
 
 845         /* Didn't find it, return null. */
 
 846         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
 
 847         args->agbno = NULLAGBLOCK;
 
 848         trace_xfs_alloc_exact_notfound(args);
 
 852         xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
 
 853         trace_xfs_alloc_exact_error(args);
 
 858  * Search the btree in a given direction via the search cursor and compare
 
 859  * the records found against the good extent we've already found.
 
 862 xfs_alloc_find_best_extent(
 
 863         struct xfs_alloc_arg    *args,  /* allocation argument structure */
 
 864         struct xfs_btree_cur    **gcur, /* good cursor */
 
 865         struct xfs_btree_cur    **scur, /* searching cursor */
 
 866         xfs_agblock_t           gdiff,  /* difference for search comparison */
 
 867         xfs_agblock_t           *sbno,  /* extent found by search */
 
 868         xfs_extlen_t            *slen,  /* extent length */
 
 869         xfs_agblock_t           *sbnoa, /* aligned extent found by search */
 
 870         xfs_extlen_t            *slena, /* aligned extent length */
 
 871         int                     dir)    /* 0 = search right, 1 = search left */
 
 879         /* The good extent is perfect, no need to  search. */
 
 884          * Look until we find a better one, run out of space or run off the end.
 
 887                 error = xfs_alloc_get_rec(*scur, sbno, slen, &i);
 
 890                 XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
 891                 xfs_alloc_compute_aligned(args, *sbno, *slen,
 
 892                                 sbnoa, slena, &busy_gen);
 
 895                  * The good extent is closer than this one.
 
 898                         if (*sbnoa > args->max_agbno)
 
 900                         if (*sbnoa >= args->agbno + gdiff)
 
 903                         if (*sbnoa < args->min_agbno)
 
 905                         if (*sbnoa <= args->agbno - gdiff)
 
 910                  * Same distance, compare length and pick the best.
 
 912                 if (*slena >= args->minlen) {
 
 913                         args->len = XFS_EXTLEN_MIN(*slena, args->maxlen);
 
 914                         xfs_alloc_fix_len(args);
 
 916                         sdiff = xfs_alloc_compute_diff(args->agbno, args->len,
 
 918                                                        args->datatype, *sbnoa,
 
 922                          * Choose closer size and invalidate other cursor.
 
 930                         error = xfs_btree_increment(*scur, 0, &i);
 
 932                         error = xfs_btree_decrement(*scur, 0, &i);
 
 938         xfs_btree_del_cursor(*scur, XFS_BTREE_NOERROR);
 
 943         xfs_btree_del_cursor(*gcur, XFS_BTREE_NOERROR);
 
 948         /* caller invalidates cursors */
 
 953  * Allocate a variable extent near bno in the allocation group agno.
 
 954  * Extent's length (returned in len) will be between minlen and maxlen,
 
 955  * and of the form k * prod + mod unless there's nothing that large.
 
 956  * Return the starting a.g. block, or NULLAGBLOCK if we can't do it.
 
 958 STATIC int                              /* error */
 
 959 xfs_alloc_ag_vextent_near(
 
 960         xfs_alloc_arg_t *args)          /* allocation argument structure */
 
 962         xfs_btree_cur_t *bno_cur_gt;    /* cursor for bno btree, right side */
 
 963         xfs_btree_cur_t *bno_cur_lt;    /* cursor for bno btree, left side */
 
 964         xfs_btree_cur_t *cnt_cur;       /* cursor for count btree */
 
 965         xfs_agblock_t   gtbno;          /* start bno of right side entry */
 
 966         xfs_agblock_t   gtbnoa;         /* aligned ... */
 
 967         xfs_extlen_t    gtdiff;         /* difference to right side entry */
 
 968         xfs_extlen_t    gtlen;          /* length of right side entry */
 
 969         xfs_extlen_t    gtlena;         /* aligned ... */
 
 970         xfs_agblock_t   gtnew;          /* useful start bno of right side */
 
 971         int             error;          /* error code */
 
 972         int             i;              /* result code, temporary */
 
 973         int             j;              /* result code, temporary */
 
 974         xfs_agblock_t   ltbno;          /* start bno of left side entry */
 
 975         xfs_agblock_t   ltbnoa;         /* aligned ... */
 
 976         xfs_extlen_t    ltdiff;         /* difference to left side entry */
 
 977         xfs_extlen_t    ltlen;          /* length of left side entry */
 
 978         xfs_extlen_t    ltlena;         /* aligned ... */
 
 979         xfs_agblock_t   ltnew;          /* useful start bno of left side */
 
 980         xfs_extlen_t    rlen;           /* length of returned extent */
 
 985          * Randomly don't execute the first algorithm.
 
 987         int             dofirst;        /* set to do first algorithm */
 
 989         dofirst = prandom_u32() & 1;
 
 992         /* handle unitialized agbno range so caller doesn't have to */
 
 993         if (!args->min_agbno && !args->max_agbno)
 
 994                 args->max_agbno = args->mp->m_sb.sb_agblocks - 1;
 
 995         ASSERT(args->min_agbno <= args->max_agbno);
 
 997         /* clamp agbno to the range if it's outside */
 
 998         if (args->agbno < args->min_agbno)
 
 999                 args->agbno = args->min_agbno;
 
1000         if (args->agbno > args->max_agbno)
 
1001                 args->agbno = args->max_agbno;
 
1012          * Get a cursor for the by-size btree.
 
1014         cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
 
1015                 args->agno, XFS_BTNUM_CNT);
 
1018          * See if there are any free extents as big as maxlen.
 
1020         if ((error = xfs_alloc_lookup_ge(cnt_cur, 0, args->maxlen, &i)))
 
1023          * If none, then pick up the last entry in the tree unless the
 
1027                 if ((error = xfs_alloc_ag_vextent_small(args, cnt_cur, <bno,
 
1030                 if (i == 0 || ltlen == 0) {
 
1031                         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1032                         trace_xfs_alloc_near_noentry(args);
 
1037         args->wasfromfl = 0;
 
1041          * If the requested extent is large wrt the freespaces available
 
1042          * in this a.g., then the cursor will be pointing to a btree entry
 
1043          * near the right edge of the tree.  If it's in the last btree leaf
 
1044          * block, then we just examine all the entries in that block
 
1045          * that are big enough, and pick the best one.
 
1046          * This is written as a while loop so we can break out of it,
 
1047          * but we never loop back to the top.
 
1049         while (xfs_btree_islastblock(cnt_cur, 0)) {
 
1052                 xfs_extlen_t    blen=0;
 
1053                 xfs_agblock_t   bnew=0;
 
1060                  * Start from the entry that lookup found, sequence through
 
1061                  * all larger free blocks.  If we're actually pointing at a
 
1062                  * record smaller than maxlen, go to the start of this block,
 
1063                  * and skip all those smaller than minlen.
 
1065                 if (ltlen || args->alignment > 1) {
 
1066                         cnt_cur->bc_ptrs[0] = 1;
 
1068                                 if ((error = xfs_alloc_get_rec(cnt_cur, <bno,
 
1071                                 XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1072                                 if (ltlen >= args->minlen)
 
1074                                 if ((error = xfs_btree_increment(cnt_cur, 0, &i)))
 
1077                         ASSERT(ltlen >= args->minlen);
 
1081                 i = cnt_cur->bc_ptrs[0];
 
1082                 for (j = 1, blen = 0, bdiff = 0;
 
1083                      !error && j && (blen < args->maxlen || bdiff > 0);
 
1084                      error = xfs_btree_increment(cnt_cur, 0, &j)) {
 
1086                          * For each entry, decide if it's better than
 
1087                          * the previous best entry.
 
1089                         if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i)))
 
1091                         XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1092                         busy = xfs_alloc_compute_aligned(args, ltbno, ltlen,
 
1093                                         <bnoa, <lena, &busy_gen);
 
1094                         if (ltlena < args->minlen)
 
1096                         if (ltbnoa < args->min_agbno || ltbnoa > args->max_agbno)
 
1098                         args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
 
1099                         xfs_alloc_fix_len(args);
 
1100                         ASSERT(args->len >= args->minlen);
 
1101                         if (args->len < blen)
 
1103                         ltdiff = xfs_alloc_compute_diff(args->agbno, args->len,
 
1104                                 args->alignment, args->datatype, ltbnoa,
 
1106                         if (ltnew != NULLAGBLOCK &&
 
1107                             (args->len > blen || ltdiff < bdiff)) {
 
1111                                 besti = cnt_cur->bc_ptrs[0];
 
1115                  * It didn't work.  We COULD be in a case where
 
1116                  * there's a good record somewhere, so try again.
 
1121                  * Point at the best entry, and retrieve it again.
 
1123                 cnt_cur->bc_ptrs[0] = besti;
 
1124                 if ((error = xfs_alloc_get_rec(cnt_cur, <bno, <len, &i)))
 
1126                 XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1127                 ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length));
 
1131                  * We are allocating starting at bnew for blen blocks.
 
1134                 ASSERT(bnew >= ltbno);
 
1135                 ASSERT(bnew + blen <= ltbno + ltlen);
 
1137                  * Set up a cursor for the by-bno tree.
 
1139                 bno_cur_lt = xfs_allocbt_init_cursor(args->mp, args->tp,
 
1140                         args->agbp, args->agno, XFS_BTNUM_BNO);
 
1142                  * Fix up the btree entries.
 
1144                 if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno,
 
1145                                 ltlen, bnew, blen, XFSA_FIXUP_CNT_OK)))
 
1147                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1148                 xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
 
1150                 trace_xfs_alloc_near_first(args);
 
1155          * Search in the by-bno tree to the left and to the right
 
1156          * simultaneously, until in each case we find a space big enough,
 
1157          * or run into the edge of the tree.  When we run into the edge,
 
1158          * we deallocate that cursor.
 
1159          * If both searches succeed, we compare the two spaces and pick
 
1161          * With alignment, it's possible for both to fail; the upper
 
1162          * level algorithm that picks allocation groups for allocations
 
1163          * is not supposed to do this.
 
1166          * Allocate and initialize the cursor for the leftward search.
 
1168         bno_cur_lt = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
 
1169                 args->agno, XFS_BTNUM_BNO);
 
1171          * Lookup <= bno to find the leftward search's starting point.
 
1173         if ((error = xfs_alloc_lookup_le(bno_cur_lt, args->agbno, args->maxlen, &i)))
 
1177                  * Didn't find anything; use this cursor for the rightward
 
1180                 bno_cur_gt = bno_cur_lt;
 
1184          * Found something.  Duplicate the cursor for the rightward search.
 
1186         else if ((error = xfs_btree_dup_cursor(bno_cur_lt, &bno_cur_gt)))
 
1189          * Increment the cursor, so we will point at the entry just right
 
1190          * of the leftward entry if any, or to the leftmost entry.
 
1192         if ((error = xfs_btree_increment(bno_cur_gt, 0, &i)))
 
1196                  * It failed, there are no rightward entries.
 
1198                 xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_NOERROR);
 
1202          * Loop going left with the leftward cursor, right with the
 
1203          * rightward cursor, until either both directions give up or
 
1204          * we find an entry at least as big as minlen.
 
1208                         if ((error = xfs_alloc_get_rec(bno_cur_lt, <bno, <len, &i)))
 
1210                         XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1211                         busy |= xfs_alloc_compute_aligned(args, ltbno, ltlen,
 
1212                                         <bnoa, <lena, &busy_gen);
 
1213                         if (ltlena >= args->minlen && ltbnoa >= args->min_agbno)
 
1215                         if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i)))
 
1217                         if (!i || ltbnoa < args->min_agbno) {
 
1218                                 xfs_btree_del_cursor(bno_cur_lt,
 
1224                         if ((error = xfs_alloc_get_rec(bno_cur_gt, >bno, >len, &i)))
 
1226                         XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1227                         busy |= xfs_alloc_compute_aligned(args, gtbno, gtlen,
 
1228                                         >bnoa, >lena, &busy_gen);
 
1229                         if (gtlena >= args->minlen && gtbnoa <= args->max_agbno)
 
1231                         if ((error = xfs_btree_increment(bno_cur_gt, 0, &i)))
 
1233                         if (!i || gtbnoa > args->max_agbno) {
 
1234                                 xfs_btree_del_cursor(bno_cur_gt,
 
1239         } while (bno_cur_lt || bno_cur_gt);
 
1242          * Got both cursors still active, need to find better entry.
 
1244         if (bno_cur_lt && bno_cur_gt) {
 
1245                 if (ltlena >= args->minlen) {
 
1247                          * Left side is good, look for a right side entry.
 
1249                         args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
 
1250                         xfs_alloc_fix_len(args);
 
1251                         ltdiff = xfs_alloc_compute_diff(args->agbno, args->len,
 
1252                                 args->alignment, args->datatype, ltbnoa,
 
1255                         error = xfs_alloc_find_best_extent(args,
 
1256                                                 &bno_cur_lt, &bno_cur_gt,
 
1257                                                 ltdiff, >bno, >len,
 
1259                                                 0 /* search right */);
 
1261                         ASSERT(gtlena >= args->minlen);
 
1264                          * Right side is good, look for a left side entry.
 
1266                         args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen);
 
1267                         xfs_alloc_fix_len(args);
 
1268                         gtdiff = xfs_alloc_compute_diff(args->agbno, args->len,
 
1269                                 args->alignment, args->datatype, gtbnoa,
 
1272                         error = xfs_alloc_find_best_extent(args,
 
1273                                                 &bno_cur_gt, &bno_cur_lt,
 
1274                                                 gtdiff, <bno, <len,
 
1276                                                 1 /* search left */);
 
1284          * If we couldn't get anything, give up.
 
1286         if (bno_cur_lt == NULL && bno_cur_gt == NULL) {
 
1287                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1290                         trace_xfs_alloc_near_busy(args);
 
1291                         xfs_extent_busy_flush(args->mp, args->pag, busy_gen);
 
1294                 trace_xfs_alloc_size_neither(args);
 
1295                 args->agbno = NULLAGBLOCK;
 
1300          * At this point we have selected a freespace entry, either to the
 
1301          * left or to the right.  If it's on the right, copy all the
 
1302          * useful variables to the "left" set so we only have one
 
1303          * copy of this code.
 
1306                 bno_cur_lt = bno_cur_gt;
 
1317          * Fix up the length and compute the useful address.
 
1319         args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
 
1320         xfs_alloc_fix_len(args);
 
1322         (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment,
 
1323                                      args->datatype, ltbnoa, ltlena, <new);
 
1324         ASSERT(ltnew >= ltbno);
 
1325         ASSERT(ltnew + rlen <= ltbnoa + ltlena);
 
1326         ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length));
 
1327         ASSERT(ltnew >= args->min_agbno && ltnew <= args->max_agbno);
 
1328         args->agbno = ltnew;
 
1330         if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen,
 
1331                         ltnew, rlen, XFSA_FIXUP_BNO_OK)))
 
1335                 trace_xfs_alloc_near_greater(args);
 
1337                 trace_xfs_alloc_near_lesser(args);
 
1339         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1340         xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
 
1344         trace_xfs_alloc_near_error(args);
 
1345         if (cnt_cur != NULL)
 
1346                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
 
1347         if (bno_cur_lt != NULL)
 
1348                 xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_ERROR);
 
1349         if (bno_cur_gt != NULL)
 
1350                 xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_ERROR);
 
1355  * Allocate a variable extent anywhere in the allocation group agno.
 
1356  * Extent's length (returned in len) will be between minlen and maxlen,
 
1357  * and of the form k * prod + mod unless there's nothing that large.
 
1358  * Return the starting a.g. block, or NULLAGBLOCK if we can't do it.
 
1360 STATIC int                              /* error */
 
1361 xfs_alloc_ag_vextent_size(
 
1362         xfs_alloc_arg_t *args)          /* allocation argument structure */
 
1364         xfs_btree_cur_t *bno_cur;       /* cursor for bno btree */
 
1365         xfs_btree_cur_t *cnt_cur;       /* cursor for cnt btree */
 
1366         int             error;          /* error result */
 
1367         xfs_agblock_t   fbno;           /* start of found freespace */
 
1368         xfs_extlen_t    flen;           /* length of found freespace */
 
1369         int             i;              /* temp status variable */
 
1370         xfs_agblock_t   rbno;           /* returned block number */
 
1371         xfs_extlen_t    rlen;           /* length of returned extent */
 
1377          * Allocate and initialize a cursor for the by-size btree.
 
1379         cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
 
1380                 args->agno, XFS_BTNUM_CNT);
 
1385          * Look for an entry >= maxlen+alignment-1 blocks.
 
1387         if ((error = xfs_alloc_lookup_ge(cnt_cur, 0,
 
1388                         args->maxlen + args->alignment - 1, &i)))
 
1392          * If none then we have to settle for a smaller extent. In the case that
 
1393          * there are no large extents, this will return the last entry in the
 
1394          * tree unless the tree is empty. In the case that there are only busy
 
1395          * large extents, this will return the largest small extent unless there
 
1396          * are no smaller extents available.
 
1399                 error = xfs_alloc_ag_vextent_small(args, cnt_cur,
 
1403                 if (i == 0 || flen == 0) {
 
1404                         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1405                         trace_xfs_alloc_size_noentry(args);
 
1409                 busy = xfs_alloc_compute_aligned(args, fbno, flen, &rbno,
 
1413                  * Search for a non-busy extent that is large enough.
 
1416                         error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i);
 
1419                         XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1421                         busy = xfs_alloc_compute_aligned(args, fbno, flen,
 
1422                                         &rbno, &rlen, &busy_gen);
 
1424                         if (rlen >= args->maxlen)
 
1427                         error = xfs_btree_increment(cnt_cur, 0, &i);
 
1432                                  * Our only valid extents must have been busy.
 
1433                                  * Make it unbusy by forcing the log out and
 
1436                                 xfs_btree_del_cursor(cnt_cur,
 
1438                                 trace_xfs_alloc_size_busy(args);
 
1439                                 xfs_extent_busy_flush(args->mp,
 
1440                                                         args->pag, busy_gen);
 
1447          * In the first case above, we got the last entry in the
 
1448          * by-size btree.  Now we check to see if the space hits maxlen
 
1449          * once aligned; if not, we search left for something better.
 
1450          * This can't happen in the second case above.
 
1452         rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
 
1453         XFS_WANT_CORRUPTED_GOTO(args->mp, rlen == 0 ||
 
1454                         (rlen <= flen && rbno + rlen <= fbno + flen), error0);
 
1455         if (rlen < args->maxlen) {
 
1456                 xfs_agblock_t   bestfbno;
 
1457                 xfs_extlen_t    bestflen;
 
1458                 xfs_agblock_t   bestrbno;
 
1459                 xfs_extlen_t    bestrlen;
 
1466                         if ((error = xfs_btree_decrement(cnt_cur, 0, &i)))
 
1470                         if ((error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen,
 
1473                         XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1474                         if (flen < bestrlen)
 
1476                         busy = xfs_alloc_compute_aligned(args, fbno, flen,
 
1477                                         &rbno, &rlen, &busy_gen);
 
1478                         rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
 
1479                         XFS_WANT_CORRUPTED_GOTO(args->mp, rlen == 0 ||
 
1480                                 (rlen <= flen && rbno + rlen <= fbno + flen),
 
1482                         if (rlen > bestrlen) {
 
1487                                 if (rlen == args->maxlen)
 
1491                 if ((error = xfs_alloc_lookup_eq(cnt_cur, bestfbno, bestflen,
 
1494                 XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1500         args->wasfromfl = 0;
 
1502          * Fix up the length.
 
1505         if (rlen < args->minlen) {
 
1507                         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1508                         trace_xfs_alloc_size_busy(args);
 
1509                         xfs_extent_busy_flush(args->mp, args->pag, busy_gen);
 
1514         xfs_alloc_fix_len(args);
 
1517         XFS_WANT_CORRUPTED_GOTO(args->mp, rlen <= flen, error0);
 
1519          * Allocate and initialize a cursor for the by-block tree.
 
1521         bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
 
1522                 args->agno, XFS_BTNUM_BNO);
 
1523         if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen,
 
1524                         rbno, rlen, XFSA_FIXUP_CNT_OK)))
 
1526         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1527         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
 
1528         cnt_cur = bno_cur = NULL;
 
1531         XFS_WANT_CORRUPTED_GOTO(args->mp,
 
1532                 args->agbno + args->len <=
 
1533                         be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length),
 
1535         trace_xfs_alloc_size_done(args);
 
1539         trace_xfs_alloc_size_error(args);
 
1541                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
 
1543                 xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
 
1547         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1548         trace_xfs_alloc_size_nominleft(args);
 
1549         args->agbno = NULLAGBLOCK;
 
1554  * Deal with the case where only small freespaces remain.
 
1555  * Either return the contents of the last freespace record,
 
1556  * or allocate space from the freelist if there is nothing in the tree.
 
1558 STATIC int                      /* error */
 
1559 xfs_alloc_ag_vextent_small(
 
1560         xfs_alloc_arg_t *args,  /* allocation argument structure */
 
1561         xfs_btree_cur_t *ccur,  /* by-size cursor */
 
1562         xfs_agblock_t   *fbnop, /* result block number */
 
1563         xfs_extlen_t    *flenp, /* result length */
 
1564         int             *stat)  /* status: 0-freelist, 1-normal/none */
 
1566         struct xfs_owner_info   oinfo;
 
1567         struct xfs_perag        *pag;
 
1573         if ((error = xfs_btree_decrement(ccur, 0, &i)))
 
1576                 if ((error = xfs_alloc_get_rec(ccur, &fbno, &flen, &i)))
 
1578                 XFS_WANT_CORRUPTED_GOTO(args->mp, i == 1, error0);
 
1581          * Nothing in the btree, try the freelist.  Make sure
 
1582          * to respect minleft even when pulling from the
 
1585         else if (args->minlen == 1 && args->alignment == 1 &&
 
1586                  args->resv != XFS_AG_RESV_AGFL &&
 
1587                  (be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_flcount)
 
1589                 error = xfs_alloc_get_freelist(args->tp, args->agbp, &fbno, 0);
 
1592                 if (fbno != NULLAGBLOCK) {
 
1593                         xfs_extent_busy_reuse(args->mp, args->agno, fbno, 1,
 
1594                               xfs_alloc_allow_busy_reuse(args->datatype));
 
1596                         if (xfs_alloc_is_userdata(args->datatype)) {
 
1599                                 bp = xfs_btree_get_bufs(args->mp, args->tp,
 
1600                                         args->agno, fbno, 0);
 
1602                                         error = -EFSCORRUPTED;
 
1605                                 xfs_trans_binval(args->tp, bp);
 
1609                         XFS_WANT_CORRUPTED_GOTO(args->mp,
 
1610                                 args->agbno + args->len <=
 
1611                                 be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length),
 
1613                         args->wasfromfl = 1;
 
1614                         trace_xfs_alloc_small_freelist(args);
 
1617                          * If we're feeding an AGFL block to something that
 
1618                          * doesn't live in the free space, we need to clear
 
1619                          * out the OWN_AG rmap and add the block back to
 
1620                          * the AGFL per-AG reservation.
 
1622                         xfs_rmap_ag_owner(&oinfo, XFS_RMAP_OWN_AG);
 
1623                         error = xfs_rmap_free(args->tp, args->agbp, args->agno,
 
1627                         pag = xfs_perag_get(args->mp, args->agno);
 
1628                         xfs_ag_resv_free_extent(pag, XFS_AG_RESV_AGFL,
 
1636                  * Nothing in the freelist.
 
1642          * Can't allocate from the freelist for some reason.
 
1649          * Can't do the allocation, give up.
 
1651         if (flen < args->minlen) {
 
1652                 args->agbno = NULLAGBLOCK;
 
1653                 trace_xfs_alloc_small_notenough(args);
 
1659         trace_xfs_alloc_small_done(args);
 
1663         trace_xfs_alloc_small_error(args);
 
1668  * Free the extent starting at agno/bno for length.
 
1674         xfs_agnumber_t          agno,
 
1677         struct xfs_owner_info   *oinfo,
 
1678         enum xfs_ag_resv_type   type)
 
1680         xfs_btree_cur_t *bno_cur;       /* cursor for by-block btree */
 
1681         xfs_btree_cur_t *cnt_cur;       /* cursor for by-size btree */
 
1682         int             error;          /* error return value */
 
1683         xfs_agblock_t   gtbno;          /* start of right neighbor block */
 
1684         xfs_extlen_t    gtlen;          /* length of right neighbor block */
 
1685         int             haveleft;       /* have a left neighbor block */
 
1686         int             haveright;      /* have a right neighbor block */
 
1687         int             i;              /* temp, result code */
 
1688         xfs_agblock_t   ltbno;          /* start of left neighbor block */
 
1689         xfs_extlen_t    ltlen;          /* length of left neighbor block */
 
1690         xfs_mount_t     *mp;            /* mount point struct for filesystem */
 
1691         xfs_agblock_t   nbno;           /* new starting block of freespace */
 
1692         xfs_extlen_t    nlen;           /* new length of freespace */
 
1693         xfs_perag_t     *pag;           /* per allocation group data */
 
1695         bno_cur = cnt_cur = NULL;
 
1698         if (!xfs_rmap_should_skip_owner_update(oinfo)) {
 
1699                 error = xfs_rmap_free(tp, agbp, agno, bno, len, oinfo);
 
1705          * Allocate and initialize a cursor for the by-block btree.
 
1707         bno_cur = xfs_allocbt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_BNO);
 
1709          * Look for a neighboring block on the left (lower block numbers)
 
1710          * that is contiguous with this space.
 
1712         if ((error = xfs_alloc_lookup_le(bno_cur, bno, len, &haveleft)))
 
1716                  * There is a block to our left.
 
1718                 if ((error = xfs_alloc_get_rec(bno_cur, <bno, <len, &i)))
 
1720                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1722                  * It's not contiguous, though.
 
1724                 if (ltbno + ltlen < bno)
 
1728                          * If this failure happens the request to free this
 
1729                          * space was invalid, it's (partly) already free.
 
1732                         XFS_WANT_CORRUPTED_GOTO(mp,
 
1733                                                 ltbno + ltlen <= bno, error0);
 
1737          * Look for a neighboring block on the right (higher block numbers)
 
1738          * that is contiguous with this space.
 
1740         if ((error = xfs_btree_increment(bno_cur, 0, &haveright)))
 
1744                  * There is a block to our right.
 
1746                 if ((error = xfs_alloc_get_rec(bno_cur, >bno, >len, &i)))
 
1748                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1750                  * It's not contiguous, though.
 
1752                 if (bno + len < gtbno)
 
1756                          * If this failure happens the request to free this
 
1757                          * space was invalid, it's (partly) already free.
 
1760                         XFS_WANT_CORRUPTED_GOTO(mp, gtbno >= bno + len, error0);
 
1764          * Now allocate and initialize a cursor for the by-size tree.
 
1766         cnt_cur = xfs_allocbt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_CNT);
 
1768          * Have both left and right contiguous neighbors.
 
1769          * Merge all three into a single free block.
 
1771         if (haveleft && haveright) {
 
1773                  * Delete the old by-size entry on the left.
 
1775                 if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i)))
 
1777                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1778                 if ((error = xfs_btree_delete(cnt_cur, &i)))
 
1780                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1782                  * Delete the old by-size entry on the right.
 
1784                 if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i)))
 
1786                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1787                 if ((error = xfs_btree_delete(cnt_cur, &i)))
 
1789                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1791                  * Delete the old by-block entry for the right block.
 
1793                 if ((error = xfs_btree_delete(bno_cur, &i)))
 
1795                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1797                  * Move the by-block cursor back to the left neighbor.
 
1799                 if ((error = xfs_btree_decrement(bno_cur, 0, &i)))
 
1801                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1804                  * Check that this is the right record: delete didn't
 
1805                  * mangle the cursor.
 
1808                         xfs_agblock_t   xxbno;
 
1811                         if ((error = xfs_alloc_get_rec(bno_cur, &xxbno, &xxlen,
 
1814                         XFS_WANT_CORRUPTED_GOTO(mp,
 
1815                                 i == 1 && xxbno == ltbno && xxlen == ltlen,
 
1820                  * Update remaining by-block entry to the new, joined block.
 
1823                 nlen = len + ltlen + gtlen;
 
1824                 if ((error = xfs_alloc_update(bno_cur, nbno, nlen)))
 
1828          * Have only a left contiguous neighbor.
 
1829          * Merge it together with the new freespace.
 
1831         else if (haveleft) {
 
1833                  * Delete the old by-size entry on the left.
 
1835                 if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i)))
 
1837                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1838                 if ((error = xfs_btree_delete(cnt_cur, &i)))
 
1840                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1842                  * Back up the by-block cursor to the left neighbor, and
 
1843                  * update its length.
 
1845                 if ((error = xfs_btree_decrement(bno_cur, 0, &i)))
 
1847                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1850                 if ((error = xfs_alloc_update(bno_cur, nbno, nlen)))
 
1854          * Have only a right contiguous neighbor.
 
1855          * Merge it together with the new freespace.
 
1857         else if (haveright) {
 
1859                  * Delete the old by-size entry on the right.
 
1861                 if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i)))
 
1863                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1864                 if ((error = xfs_btree_delete(cnt_cur, &i)))
 
1866                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1868                  * Update the starting block and length of the right
 
1869                  * neighbor in the by-block tree.
 
1873                 if ((error = xfs_alloc_update(bno_cur, nbno, nlen)))
 
1877          * No contiguous neighbors.
 
1878          * Insert the new freespace into the by-block tree.
 
1883                 if ((error = xfs_btree_insert(bno_cur, &i)))
 
1885                 XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1887         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
 
1890          * In all cases we need to insert the new freespace in the by-size tree.
 
1892         if ((error = xfs_alloc_lookup_eq(cnt_cur, nbno, nlen, &i)))
 
1894         XFS_WANT_CORRUPTED_GOTO(mp, i == 0, error0);
 
1895         if ((error = xfs_btree_insert(cnt_cur, &i)))
 
1897         XFS_WANT_CORRUPTED_GOTO(mp, i == 1, error0);
 
1898         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
 
1902          * Update the freespace totals in the ag and superblock.
 
1904         pag = xfs_perag_get(mp, agno);
 
1905         error = xfs_alloc_update_counters(tp, pag, agbp, len);
 
1906         xfs_ag_resv_free_extent(pag, type, tp, len);
 
1911         XFS_STATS_INC(mp, xs_freex);
 
1912         XFS_STATS_ADD(mp, xs_freeb, len);
 
1914         trace_xfs_free_extent(mp, agno, bno, len, type == XFS_AG_RESV_AGFL,
 
1915                         haveleft, haveright);
 
1920         trace_xfs_free_extent(mp, agno, bno, len, type == XFS_AG_RESV_AGFL,
 
1923                 xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
 
1925                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
 
1930  * Visible (exported) allocation/free functions.
 
1931  * Some of these are used just by xfs_alloc_btree.c and this file.
 
1935  * Compute and fill in value of m_ag_maxlevels.
 
1938 xfs_alloc_compute_maxlevels(
 
1939         xfs_mount_t     *mp)    /* file system mount structure */
 
1941         mp->m_ag_maxlevels = xfs_btree_compute_maxlevels(mp, mp->m_alloc_mnr,
 
1942                         (mp->m_sb.sb_agblocks + 1) / 2);
 
1946  * Find the length of the longest extent in an AG.  The 'need' parameter
 
1947  * specifies how much space we're going to need for the AGFL and the
 
1948  * 'reserved' parameter tells us how many blocks in this AG are reserved for
 
1952 xfs_alloc_longest_free_extent(
 
1953         struct xfs_mount        *mp,
 
1954         struct xfs_perag        *pag,
 
1956         xfs_extlen_t            reserved)
 
1958         xfs_extlen_t            delta = 0;
 
1961          * If the AGFL needs a recharge, we'll have to subtract that from the
 
1964         if (need > pag->pagf_flcount)
 
1965                 delta = need - pag->pagf_flcount;
 
1968          * If we cannot maintain others' reservations with space from the
 
1969          * not-longest freesp extents, we'll have to subtract /that/ from
 
1970          * the longest extent too.
 
1972         if (pag->pagf_freeblks - pag->pagf_longest < reserved)
 
1973                 delta += reserved - (pag->pagf_freeblks - pag->pagf_longest);
 
1976          * If the longest extent is long enough to satisfy all the
 
1977          * reservations and AGFL rules in place, we can return this extent.
 
1979         if (pag->pagf_longest > delta)
 
1980                 return pag->pagf_longest - delta;
 
1982         /* Otherwise, let the caller try for 1 block if there's space. */
 
1983         return pag->pagf_flcount > 0 || pag->pagf_longest > 0;
 
1987 xfs_alloc_min_freelist(
 
1988         struct xfs_mount        *mp,
 
1989         struct xfs_perag        *pag)
 
1991         unsigned int            min_free;
 
1993         /* space needed by-bno freespace btree */
 
1994         min_free = min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_BNOi] + 1,
 
1995                                        mp->m_ag_maxlevels);
 
1996         /* space needed by-size freespace btree */
 
1997         min_free += min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_CNTi] + 1,
 
1998                                        mp->m_ag_maxlevels);
 
1999         /* space needed reverse mapping used space btree */
 
2000         if (xfs_sb_version_hasrmapbt(&mp->m_sb))
 
2001                 min_free += min_t(unsigned int,
 
2002                                   pag->pagf_levels[XFS_BTNUM_RMAPi] + 1,
 
2003                                   mp->m_rmap_maxlevels);
 
2009  * Check if the operation we are fixing up the freelist for should go ahead or
 
2010  * not. If we are freeing blocks, we always allow it, otherwise the allocation
 
2011  * is dependent on whether the size and shape of free space available will
 
2012  * permit the requested allocation to take place.
 
2015 xfs_alloc_space_available(
 
2016         struct xfs_alloc_arg    *args,
 
2017         xfs_extlen_t            min_free,
 
2020         struct xfs_perag        *pag = args->pag;
 
2021         xfs_extlen_t            alloc_len, longest;
 
2022         xfs_extlen_t            reservation; /* blocks that are still reserved */
 
2025         if (flags & XFS_ALLOC_FLAG_FREEING)
 
2028         reservation = xfs_ag_resv_needed(pag, args->resv);
 
2030         /* do we have enough contiguous free space for the allocation? */
 
2031         alloc_len = args->minlen + (args->alignment - 1) + args->minalignslop;
 
2032         longest = xfs_alloc_longest_free_extent(args->mp, pag, min_free,
 
2034         if (longest < alloc_len)
 
2037         /* do we have enough free space remaining for the allocation? */
 
2038         available = (int)(pag->pagf_freeblks + pag->pagf_flcount -
 
2039                           reservation - min_free - args->minleft);
 
2040         if (available < (int)max(args->total, alloc_len))
 
2044          * Clamp maxlen to the amount of free space available for the actual
 
2045          * extent allocation.
 
2047         if (available < (int)args->maxlen && !(flags & XFS_ALLOC_FLAG_CHECK)) {
 
2048                 args->maxlen = available;
 
2049                 ASSERT(args->maxlen > 0);
 
2050                 ASSERT(args->maxlen >= args->minlen);
 
2057  * Decide whether to use this allocation group for this allocation.
 
2058  * If so, fix up the btree freelist's size.
 
2061 xfs_alloc_fix_freelist(
 
2062         struct xfs_alloc_arg    *args,  /* allocation argument structure */
 
2063         int                     flags)  /* XFS_ALLOC_FLAG_... */
 
2065         struct xfs_mount        *mp = args->mp;
 
2066         struct xfs_perag        *pag = args->pag;
 
2067         struct xfs_trans        *tp = args->tp;
 
2068         struct xfs_buf          *agbp = NULL;
 
2069         struct xfs_buf          *agflbp = NULL;
 
2070         struct xfs_alloc_arg    targs;  /* local allocation arguments */
 
2071         xfs_agblock_t           bno;    /* freelist block */
 
2072         xfs_extlen_t            need;   /* total blocks needed in freelist */
 
2075         if (!pag->pagf_init) {
 
2076                 error = xfs_alloc_read_agf(mp, tp, args->agno, flags, &agbp);
 
2079                 if (!pag->pagf_init) {
 
2080                         ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK);
 
2081                         ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING));
 
2082                         goto out_agbp_relse;
 
2087          * If this is a metadata preferred pag and we are user data then try
 
2088          * somewhere else if we are not being asked to try harder at this
 
2091         if (pag->pagf_metadata && xfs_alloc_is_userdata(args->datatype) &&
 
2092             (flags & XFS_ALLOC_FLAG_TRYLOCK)) {
 
2093                 ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING));
 
2094                 goto out_agbp_relse;
 
2097         need = xfs_alloc_min_freelist(mp, pag);
 
2098         if (!xfs_alloc_space_available(args, need, flags |
 
2099                         XFS_ALLOC_FLAG_CHECK))
 
2100                 goto out_agbp_relse;
 
2103          * Get the a.g. freespace buffer.
 
2104          * Can fail if we're not blocking on locks, and it's held.
 
2107                 error = xfs_alloc_read_agf(mp, tp, args->agno, flags, &agbp);
 
2111                         ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK);
 
2112                         ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING));
 
2117         /* If there isn't enough total space or single-extent, reject it. */
 
2118         need = xfs_alloc_min_freelist(mp, pag);
 
2119         if (!xfs_alloc_space_available(args, need, flags))
 
2120                 goto out_agbp_relse;
 
2123          * Make the freelist shorter if it's too long.
 
2125          * Note that from this point onwards, we will always release the agf and
 
2126          * agfl buffers on error. This handles the case where we error out and
 
2127          * the buffers are clean or may not have been joined to the transaction
 
2128          * and hence need to be released manually. If they have been joined to
 
2129          * the transaction, then xfs_trans_brelse() will handle them
 
2130          * appropriately based on the recursion count and dirty state of the
 
2133          * XXX (dgc): When we have lots of free space, does this buy us
 
2134          * anything other than extra overhead when we need to put more blocks
 
2135          * back on the free list? Maybe we should only do this when space is
 
2136          * getting low or the AGFL is more than half full?
 
2138          * The NOSHRINK flag prevents the AGFL from being shrunk if it's too
 
2139          * big; the NORMAP flag prevents AGFL expand/shrink operations from
 
2140          * updating the rmapbt.  Both flags are used in xfs_repair while we're
 
2141          * rebuilding the rmapbt, and neither are used by the kernel.  They're
 
2142          * both required to ensure that rmaps are correctly recorded for the
 
2143          * regenerated AGFL, bnobt, and cntbt.  See repair/phase5.c and
 
2144          * repair/rmap.c in xfsprogs for details.
 
2146         memset(&targs, 0, sizeof(targs));
 
2147         if (flags & XFS_ALLOC_FLAG_NORMAP)
 
2148                 xfs_rmap_skip_owner_update(&targs.oinfo);
 
2150                 xfs_rmap_ag_owner(&targs.oinfo, XFS_RMAP_OWN_AG);
 
2151         while (!(flags & XFS_ALLOC_FLAG_NOSHRINK) && pag->pagf_flcount > need) {
 
2154                 error = xfs_alloc_get_freelist(tp, agbp, &bno, 0);
 
2156                         goto out_agbp_relse;
 
2157                 error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1,
 
2158                                            &targs.oinfo, XFS_AG_RESV_AGFL);
 
2160                         goto out_agbp_relse;
 
2161                 bp = xfs_btree_get_bufs(mp, tp, args->agno, bno, 0);
 
2163                         error = -EFSCORRUPTED;
 
2164                         goto out_agbp_relse;
 
2166                 xfs_trans_binval(tp, bp);
 
2172         targs.agno = args->agno;
 
2173         targs.alignment = targs.minlen = targs.prod = 1;
 
2174         targs.type = XFS_ALLOCTYPE_THIS_AG;
 
2176         error = xfs_alloc_read_agfl(mp, tp, targs.agno, &agflbp);
 
2178                 goto out_agbp_relse;
 
2180         /* Make the freelist longer if it's too short. */
 
2181         while (pag->pagf_flcount < need) {
 
2183                 targs.maxlen = need - pag->pagf_flcount;
 
2184                 targs.resv = XFS_AG_RESV_AGFL;
 
2186                 /* Allocate as many blocks as possible at once. */
 
2187                 error = xfs_alloc_ag_vextent(&targs);
 
2189                         goto out_agflbp_relse;
 
2192                  * Stop if we run out.  Won't happen if callers are obeying
 
2193                  * the restrictions correctly.  Can happen for free calls
 
2194                  * on a completely full ag.
 
2196                 if (targs.agbno == NULLAGBLOCK) {
 
2197                         if (flags & XFS_ALLOC_FLAG_FREEING)
 
2199                         goto out_agflbp_relse;
 
2202                  * Put each allocated block on the list.
 
2204                 for (bno = targs.agbno; bno < targs.agbno + targs.len; bno++) {
 
2205                         error = xfs_alloc_put_freelist(tp, agbp,
 
2208                                 goto out_agflbp_relse;
 
2211         xfs_trans_brelse(tp, agflbp);
 
2216         xfs_trans_brelse(tp, agflbp);
 
2219                 xfs_trans_brelse(tp, agbp);
 
2226  * Get a block from the freelist.
 
2227  * Returns with the buffer for the block gotten.
 
2230 xfs_alloc_get_freelist(
 
2231         xfs_trans_t     *tp,    /* transaction pointer */
 
2232         xfs_buf_t       *agbp,  /* buffer containing the agf structure */
 
2233         xfs_agblock_t   *bnop,  /* block address retrieved from freelist */
 
2234         int             btreeblk) /* destination is a AGF btree */
 
2236         xfs_agf_t       *agf;   /* a.g. freespace structure */
 
2237         xfs_buf_t       *agflbp;/* buffer for a.g. freelist structure */
 
2238         xfs_agblock_t   bno;    /* block number returned */
 
2242         xfs_mount_t     *mp = tp->t_mountp;
 
2243         xfs_perag_t     *pag;   /* per allocation group data */
 
2246          * Freelist is empty, give up.
 
2248         agf = XFS_BUF_TO_AGF(agbp);
 
2249         if (!agf->agf_flcount) {
 
2250                 *bnop = NULLAGBLOCK;
 
2254          * Read the array of free blocks.
 
2256         error = xfs_alloc_read_agfl(mp, tp, be32_to_cpu(agf->agf_seqno),
 
2263          * Get the block number and update the data structures.
 
2265         agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp);
 
2266         bno = be32_to_cpu(agfl_bno[be32_to_cpu(agf->agf_flfirst)]);
 
2267         be32_add_cpu(&agf->agf_flfirst, 1);
 
2268         xfs_trans_brelse(tp, agflbp);
 
2269         if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp))
 
2270                 agf->agf_flfirst = 0;
 
2272         pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno));
 
2273         be32_add_cpu(&agf->agf_flcount, -1);
 
2274         xfs_trans_agflist_delta(tp, -1);
 
2275         pag->pagf_flcount--;
 
2278         logflags = XFS_AGF_FLFIRST | XFS_AGF_FLCOUNT;
 
2280                 be32_add_cpu(&agf->agf_btreeblks, 1);
 
2281                 pag->pagf_btreeblks++;
 
2282                 logflags |= XFS_AGF_BTREEBLKS;
 
2285         xfs_alloc_log_agf(tp, agbp, logflags);
 
2292  * Log the given fields from the agf structure.
 
2296         xfs_trans_t     *tp,    /* transaction pointer */
 
2297         xfs_buf_t       *bp,    /* buffer for a.g. freelist header */
 
2298         int             fields) /* mask of fields to be logged (XFS_AGF_...) */
 
2300         int     first;          /* first byte offset */
 
2301         int     last;           /* last byte offset */
 
2302         static const short      offsets[] = {
 
2303                 offsetof(xfs_agf_t, agf_magicnum),
 
2304                 offsetof(xfs_agf_t, agf_versionnum),
 
2305                 offsetof(xfs_agf_t, agf_seqno),
 
2306                 offsetof(xfs_agf_t, agf_length),
 
2307                 offsetof(xfs_agf_t, agf_roots[0]),
 
2308                 offsetof(xfs_agf_t, agf_levels[0]),
 
2309                 offsetof(xfs_agf_t, agf_flfirst),
 
2310                 offsetof(xfs_agf_t, agf_fllast),
 
2311                 offsetof(xfs_agf_t, agf_flcount),
 
2312                 offsetof(xfs_agf_t, agf_freeblks),
 
2313                 offsetof(xfs_agf_t, agf_longest),
 
2314                 offsetof(xfs_agf_t, agf_btreeblks),
 
2315                 offsetof(xfs_agf_t, agf_uuid),
 
2316                 offsetof(xfs_agf_t, agf_rmap_blocks),
 
2317                 offsetof(xfs_agf_t, agf_refcount_blocks),
 
2318                 offsetof(xfs_agf_t, agf_refcount_root),
 
2319                 offsetof(xfs_agf_t, agf_refcount_level),
 
2320                 /* needed so that we don't log the whole rest of the structure: */
 
2321                 offsetof(xfs_agf_t, agf_spare64),
 
2325         trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_);
 
2327         xfs_trans_buf_set_type(tp, bp, XFS_BLFT_AGF_BUF);
 
2329         xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last);
 
2330         xfs_trans_log_buf(tp, bp, (uint)first, (uint)last);
 
2334  * Interface for inode allocation to force the pag data to be initialized.
 
2337 xfs_alloc_pagf_init(
 
2338         xfs_mount_t             *mp,    /* file system mount structure */
 
2339         xfs_trans_t             *tp,    /* transaction pointer */
 
2340         xfs_agnumber_t          agno,   /* allocation group number */
 
2341         int                     flags)  /* XFS_ALLOC_FLAGS_... */
 
2346         if ((error = xfs_alloc_read_agf(mp, tp, agno, flags, &bp)))
 
2349                 xfs_trans_brelse(tp, bp);
 
2354  * Put the block on the freelist for the allocation group.
 
2357 xfs_alloc_put_freelist(
 
2358         xfs_trans_t             *tp,    /* transaction pointer */
 
2359         xfs_buf_t               *agbp,  /* buffer for a.g. freelist header */
 
2360         xfs_buf_t               *agflbp,/* buffer for a.g. free block array */
 
2361         xfs_agblock_t           bno,    /* block being freed */
 
2362         int                     btreeblk) /* block came from a AGF btree */
 
2364         xfs_agf_t               *agf;   /* a.g. freespace structure */
 
2365         __be32                  *blockp;/* pointer to array entry */
 
2368         xfs_mount_t             *mp;    /* mount structure */
 
2369         xfs_perag_t             *pag;   /* per allocation group data */
 
2373         agf = XFS_BUF_TO_AGF(agbp);
 
2376         if (!agflbp && (error = xfs_alloc_read_agfl(mp, tp,
 
2377                         be32_to_cpu(agf->agf_seqno), &agflbp)))
 
2379         be32_add_cpu(&agf->agf_fllast, 1);
 
2380         if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp))
 
2381                 agf->agf_fllast = 0;
 
2383         pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno));
 
2384         be32_add_cpu(&agf->agf_flcount, 1);
 
2385         xfs_trans_agflist_delta(tp, 1);
 
2386         pag->pagf_flcount++;
 
2388         logflags = XFS_AGF_FLLAST | XFS_AGF_FLCOUNT;
 
2390                 be32_add_cpu(&agf->agf_btreeblks, -1);
 
2391                 pag->pagf_btreeblks--;
 
2392                 logflags |= XFS_AGF_BTREEBLKS;
 
2396         xfs_alloc_log_agf(tp, agbp, logflags);
 
2398         ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp));
 
2400         agfl_bno = XFS_BUF_TO_AGFL_BNO(mp, agflbp);
 
2401         blockp = &agfl_bno[be32_to_cpu(agf->agf_fllast)];
 
2402         *blockp = cpu_to_be32(bno);
 
2403         startoff = (char *)blockp - (char *)agflbp->b_addr;
 
2405         xfs_alloc_log_agf(tp, agbp, logflags);
 
2407         xfs_trans_buf_set_type(tp, agflbp, XFS_BLFT_AGFL_BUF);
 
2408         xfs_trans_log_buf(tp, agflbp, startoff,
 
2409                           startoff + sizeof(xfs_agblock_t) - 1);
 
2413 static xfs_failaddr_t
 
2417         struct xfs_mount        *mp = bp->b_target->bt_mount;
 
2418         struct xfs_agf          *agf = XFS_BUF_TO_AGF(bp);
 
2420         if (xfs_sb_version_hascrc(&mp->m_sb)) {
 
2421                 if (!uuid_equal(&agf->agf_uuid, &mp->m_sb.sb_meta_uuid))
 
2422                         return __this_address;
 
2423                 if (!xfs_log_check_lsn(mp,
 
2424                                 be64_to_cpu(XFS_BUF_TO_AGF(bp)->agf_lsn)))
 
2425                         return __this_address;
 
2428         if (!(agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) &&
 
2429               XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) &&
 
2430               be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) &&
 
2431               be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) &&
 
2432               be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) &&
 
2433               be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp)))
 
2434                 return __this_address;
 
2436         if (be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) < 1 ||
 
2437             be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) < 1 ||
 
2438             be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNO]) > XFS_BTREE_MAXLEVELS ||
 
2439             be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNT]) > XFS_BTREE_MAXLEVELS)
 
2440                 return __this_address;
 
2442         if (xfs_sb_version_hasrmapbt(&mp->m_sb) &&
 
2443             (be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) < 1 ||
 
2444              be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAP]) > XFS_BTREE_MAXLEVELS))
 
2445                 return __this_address;
 
2448          * during growfs operations, the perag is not fully initialised,
 
2449          * so we can't use it for any useful checking. growfs ensures we can't
 
2450          * use it by using uncached buffers that don't have the perag attached
 
2451          * so we can detect and avoid this problem.
 
2453         if (bp->b_pag && be32_to_cpu(agf->agf_seqno) != bp->b_pag->pag_agno)
 
2454                 return __this_address;
 
2456         if (xfs_sb_version_haslazysbcount(&mp->m_sb) &&
 
2457             be32_to_cpu(agf->agf_btreeblks) > be32_to_cpu(agf->agf_length))
 
2458                 return __this_address;
 
2460         if (xfs_sb_version_hasreflink(&mp->m_sb) &&
 
2461             (be32_to_cpu(agf->agf_refcount_level) < 1 ||
 
2462              be32_to_cpu(agf->agf_refcount_level) > XFS_BTREE_MAXLEVELS))
 
2463                 return __this_address;
 
2470 xfs_agf_read_verify(
 
2473         struct xfs_mount *mp = bp->b_target->bt_mount;
 
2476         if (xfs_sb_version_hascrc(&mp->m_sb) &&
 
2477             !xfs_buf_verify_cksum(bp, XFS_AGF_CRC_OFF))
 
2478                 xfs_verifier_error(bp, -EFSBADCRC, __this_address);
 
2480                 fa = xfs_agf_verify(bp);
 
2481                 if (XFS_TEST_ERROR(fa, mp, XFS_ERRTAG_ALLOC_READ_AGF))
 
2482                         xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 
2487 xfs_agf_write_verify(
 
2490         struct xfs_mount        *mp = bp->b_target->bt_mount;
 
2491         struct xfs_buf_log_item *bip = bp->b_log_item;
 
2494         fa = xfs_agf_verify(bp);
 
2496                 xfs_verifier_error(bp, -EFSCORRUPTED, fa);
 
2500         if (!xfs_sb_version_hascrc(&mp->m_sb))
 
2504                 XFS_BUF_TO_AGF(bp)->agf_lsn = cpu_to_be64(bip->bli_item.li_lsn);
 
2506         xfs_buf_update_cksum(bp, XFS_AGF_CRC_OFF);
 
2509 const struct xfs_buf_ops xfs_agf_buf_ops = {
 
2511         .verify_read = xfs_agf_read_verify,
 
2512         .verify_write = xfs_agf_write_verify,
 
2513         .verify_struct = xfs_agf_verify,
 
2517  * Read in the allocation group header (free/alloc section).
 
2521         struct xfs_mount        *mp,    /* mount point structure */
 
2522         struct xfs_trans        *tp,    /* transaction pointer */
 
2523         xfs_agnumber_t          agno,   /* allocation group number */
 
2524         int                     flags,  /* XFS_BUF_ */
 
2525         struct xfs_buf          **bpp)  /* buffer for the ag freelist header */
 
2529         trace_xfs_read_agf(mp, agno);
 
2531         ASSERT(agno != NULLAGNUMBER);
 
2532         error = xfs_trans_read_buf(
 
2533                         mp, tp, mp->m_ddev_targp,
 
2534                         XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
 
2535                         XFS_FSS_TO_BB(mp, 1), flags, bpp, &xfs_agf_buf_ops);
 
2541         ASSERT(!(*bpp)->b_error);
 
2542         xfs_buf_set_ref(*bpp, XFS_AGF_REF);
 
2547  * Read in the allocation group header (free/alloc section).
 
2551         struct xfs_mount        *mp,    /* mount point structure */
 
2552         struct xfs_trans        *tp,    /* transaction pointer */
 
2553         xfs_agnumber_t          agno,   /* allocation group number */
 
2554         int                     flags,  /* XFS_ALLOC_FLAG_... */
 
2555         struct xfs_buf          **bpp)  /* buffer for the ag freelist header */
 
2557         struct xfs_agf          *agf;           /* ag freelist header */
 
2558         struct xfs_perag        *pag;           /* per allocation group data */
 
2561         trace_xfs_alloc_read_agf(mp, agno);
 
2563         ASSERT(agno != NULLAGNUMBER);
 
2564         error = xfs_read_agf(mp, tp, agno,
 
2565                         (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XBF_TRYLOCK : 0,
 
2571         ASSERT(!(*bpp)->b_error);
 
2573         agf = XFS_BUF_TO_AGF(*bpp);
 
2574         pag = xfs_perag_get(mp, agno);
 
2575         if (!pag->pagf_init) {
 
2576                 pag->pagf_freeblks = be32_to_cpu(agf->agf_freeblks);
 
2577                 pag->pagf_btreeblks = be32_to_cpu(agf->agf_btreeblks);
 
2578                 pag->pagf_flcount = be32_to_cpu(agf->agf_flcount);
 
2579                 pag->pagf_longest = be32_to_cpu(agf->agf_longest);
 
2580                 pag->pagf_levels[XFS_BTNUM_BNOi] =
 
2581                         be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi]);
 
2582                 pag->pagf_levels[XFS_BTNUM_CNTi] =
 
2583                         be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]);
 
2584                 pag->pagf_levels[XFS_BTNUM_RMAPi] =
 
2585                         be32_to_cpu(agf->agf_levels[XFS_BTNUM_RMAPi]);
 
2586                 pag->pagf_refcount_level = be32_to_cpu(agf->agf_refcount_level);
 
2587                 spin_lock_init(&pag->pagb_lock);
 
2588                 pag->pagb_count = 0;
 
2589                 pag->pagb_tree = RB_ROOT;
 
2593         else if (!XFS_FORCED_SHUTDOWN(mp)) {
 
2594                 ASSERT(pag->pagf_freeblks == be32_to_cpu(agf->agf_freeblks));
 
2595                 ASSERT(pag->pagf_btreeblks == be32_to_cpu(agf->agf_btreeblks));
 
2596                 ASSERT(pag->pagf_flcount == be32_to_cpu(agf->agf_flcount));
 
2597                 ASSERT(pag->pagf_longest == be32_to_cpu(agf->agf_longest));
 
2598                 ASSERT(pag->pagf_levels[XFS_BTNUM_BNOi] ==
 
2599                        be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi]));
 
2600                 ASSERT(pag->pagf_levels[XFS_BTNUM_CNTi] ==
 
2601                        be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]));
 
2609  * Allocate an extent (variable-size).
 
2610  * Depending on the allocation type, we either look in a single allocation
 
2611  * group or loop over the allocation groups to find the result.
 
2615         xfs_alloc_arg_t *args)  /* allocation argument structure */
 
2617         xfs_agblock_t   agsize; /* allocation group size */
 
2619         int             flags;  /* XFS_ALLOC_FLAG_... locking flags */
 
2620         xfs_mount_t     *mp;    /* mount structure pointer */
 
2621         xfs_agnumber_t  sagno;  /* starting allocation group number */
 
2622         xfs_alloctype_t type;   /* input allocation type */
 
2624         xfs_agnumber_t  rotorstep = xfs_rotorstep; /* inode32 agf stepper */
 
2627         type = args->otype = args->type;
 
2628         args->agbno = NULLAGBLOCK;
 
2630          * Just fix this up, for the case where the last a.g. is shorter
 
2631          * (or there's only one a.g.) and the caller couldn't easily figure
 
2632          * that out (xfs_bmap_alloc).
 
2634         agsize = mp->m_sb.sb_agblocks;
 
2635         if (args->maxlen > agsize)
 
2636                 args->maxlen = agsize;
 
2637         if (args->alignment == 0)
 
2638                 args->alignment = 1;
 
2639         ASSERT(XFS_FSB_TO_AGNO(mp, args->fsbno) < mp->m_sb.sb_agcount);
 
2640         ASSERT(XFS_FSB_TO_AGBNO(mp, args->fsbno) < agsize);
 
2641         ASSERT(args->minlen <= args->maxlen);
 
2642         ASSERT(args->minlen <= agsize);
 
2643         ASSERT(args->mod < args->prod);
 
2644         if (XFS_FSB_TO_AGNO(mp, args->fsbno) >= mp->m_sb.sb_agcount ||
 
2645             XFS_FSB_TO_AGBNO(mp, args->fsbno) >= agsize ||
 
2646             args->minlen > args->maxlen || args->minlen > agsize ||
 
2647             args->mod >= args->prod) {
 
2648                 args->fsbno = NULLFSBLOCK;
 
2649                 trace_xfs_alloc_vextent_badargs(args);
 
2654         case XFS_ALLOCTYPE_THIS_AG:
 
2655         case XFS_ALLOCTYPE_NEAR_BNO:
 
2656         case XFS_ALLOCTYPE_THIS_BNO:
 
2658                  * These three force us into a single a.g.
 
2660                 args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
 
2661                 args->pag = xfs_perag_get(mp, args->agno);
 
2662                 error = xfs_alloc_fix_freelist(args, 0);
 
2664                         trace_xfs_alloc_vextent_nofix(args);
 
2668                         trace_xfs_alloc_vextent_noagbp(args);
 
2671                 args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
 
2672                 if ((error = xfs_alloc_ag_vextent(args)))
 
2675         case XFS_ALLOCTYPE_START_BNO:
 
2677                  * Try near allocation first, then anywhere-in-ag after
 
2678                  * the first a.g. fails.
 
2680                 if ((args->datatype & XFS_ALLOC_INITIAL_USER_DATA) &&
 
2681                     (mp->m_flags & XFS_MOUNT_32BITINODES)) {
 
2682                         args->fsbno = XFS_AGB_TO_FSB(mp,
 
2683                                         ((mp->m_agfrotor / rotorstep) %
 
2684                                         mp->m_sb.sb_agcount), 0);
 
2687                 args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
 
2688                 args->type = XFS_ALLOCTYPE_NEAR_BNO;
 
2690         case XFS_ALLOCTYPE_FIRST_AG:
 
2692                  * Rotate through the allocation groups looking for a winner.
 
2694                 if (type == XFS_ALLOCTYPE_FIRST_AG) {
 
2696                          * Start with allocation group given by bno.
 
2698                         args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
 
2699                         args->type = XFS_ALLOCTYPE_THIS_AG;
 
2704                          * Start with the given allocation group.
 
2706                         args->agno = sagno = XFS_FSB_TO_AGNO(mp, args->fsbno);
 
2707                         flags = XFS_ALLOC_FLAG_TRYLOCK;
 
2710                  * Loop over allocation groups twice; first time with
 
2711                  * trylock set, second time without.
 
2714                         args->pag = xfs_perag_get(mp, args->agno);
 
2715                         error = xfs_alloc_fix_freelist(args, flags);
 
2717                                 trace_xfs_alloc_vextent_nofix(args);
 
2721                          * If we get a buffer back then the allocation will fly.
 
2724                                 if ((error = xfs_alloc_ag_vextent(args)))
 
2729                         trace_xfs_alloc_vextent_loopfailed(args);
 
2732                          * Didn't work, figure out the next iteration.
 
2734                         if (args->agno == sagno &&
 
2735                             type == XFS_ALLOCTYPE_START_BNO)
 
2736                                 args->type = XFS_ALLOCTYPE_THIS_AG;
 
2738                         * For the first allocation, we can try any AG to get
 
2739                         * space.  However, if we already have allocated a
 
2740                         * block, we don't want to try AGs whose number is below
 
2741                         * sagno. Otherwise, we may end up with out-of-order
 
2742                         * locking of AGF, which might cause deadlock.
 
2744                         if (++(args->agno) == mp->m_sb.sb_agcount) {
 
2745                                 if (args->firstblock != NULLFSBLOCK)
 
2751                          * Reached the starting a.g., must either be done
 
2752                          * or switch to non-trylock mode.
 
2754                         if (args->agno == sagno) {
 
2756                                         args->agbno = NULLAGBLOCK;
 
2757                                         trace_xfs_alloc_vextent_allfailed(args);
 
2762                                 if (type == XFS_ALLOCTYPE_START_BNO) {
 
2763                                         args->agbno = XFS_FSB_TO_AGBNO(mp,
 
2765                                         args->type = XFS_ALLOCTYPE_NEAR_BNO;
 
2768                         xfs_perag_put(args->pag);
 
2771                         if (args->agno == sagno)
 
2772                                 mp->m_agfrotor = (mp->m_agfrotor + 1) %
 
2773                                         (mp->m_sb.sb_agcount * rotorstep);
 
2775                                 mp->m_agfrotor = (args->agno * rotorstep + 1) %
 
2776                                         (mp->m_sb.sb_agcount * rotorstep);
 
2783         if (args->agbno == NULLAGBLOCK)
 
2784                 args->fsbno = NULLFSBLOCK;
 
2786                 args->fsbno = XFS_AGB_TO_FSB(mp, args->agno, args->agbno);
 
2788                 ASSERT(args->len >= args->minlen);
 
2789                 ASSERT(args->len <= args->maxlen);
 
2790                 ASSERT(args->agbno % args->alignment == 0);
 
2791                 XFS_AG_CHECK_DADDR(mp, XFS_FSB_TO_DADDR(mp, args->fsbno),
 
2795                 /* Zero the extent if we were asked to do so */
 
2796                 if (args->datatype & XFS_ALLOC_USERDATA_ZERO) {
 
2797                         error = xfs_zero_extent(args->ip, args->fsbno, args->len);
 
2803         xfs_perag_put(args->pag);
 
2806         xfs_perag_put(args->pag);
 
2810 /* Ensure that the freelist is at full capacity. */
 
2812 xfs_free_extent_fix_freelist(
 
2813         struct xfs_trans        *tp,
 
2814         xfs_agnumber_t          agno,
 
2815         struct xfs_buf          **agbp)
 
2817         struct xfs_alloc_arg    args;
 
2820         memset(&args, 0, sizeof(struct xfs_alloc_arg));
 
2822         args.mp = tp->t_mountp;
 
2826          * validate that the block number is legal - the enables us to detect
 
2827          * and handle a silent filesystem corruption rather than crashing.
 
2829         if (args.agno >= args.mp->m_sb.sb_agcount)
 
2830                 return -EFSCORRUPTED;
 
2832         args.pag = xfs_perag_get(args.mp, args.agno);
 
2835         error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING);
 
2841         xfs_perag_put(args.pag);
 
2847  * Just break up the extent address and hand off to xfs_free_ag_extent
 
2848  * after fixing up the freelist.
 
2852         struct xfs_trans        *tp,    /* transaction pointer */
 
2853         xfs_fsblock_t           bno,    /* starting block number of extent */
 
2854         xfs_extlen_t            len,    /* length of extent */
 
2855         struct xfs_owner_info   *oinfo, /* extent owner */
 
2856         enum xfs_ag_resv_type   type)   /* block reservation type */
 
2858         struct xfs_mount        *mp = tp->t_mountp;
 
2859         struct xfs_buf          *agbp;
 
2860         xfs_agnumber_t          agno = XFS_FSB_TO_AGNO(mp, bno);
 
2861         xfs_agblock_t           agbno = XFS_FSB_TO_AGBNO(mp, bno);
 
2865         ASSERT(type != XFS_AG_RESV_AGFL);
 
2867         if (XFS_TEST_ERROR(false, mp,
 
2868                         XFS_ERRTAG_FREE_EXTENT))
 
2871         error = xfs_free_extent_fix_freelist(tp, agno, &agbp);
 
2875         XFS_WANT_CORRUPTED_GOTO(mp, agbno < mp->m_sb.sb_agblocks, err);
 
2877         /* validate the extent size is legal now we have the agf locked */
 
2878         XFS_WANT_CORRUPTED_GOTO(mp,
 
2879                 agbno + len <= be32_to_cpu(XFS_BUF_TO_AGF(agbp)->agf_length),
 
2882         error = xfs_free_ag_extent(tp, agbp, agno, agbno, len, oinfo, type);
 
2886         xfs_extent_busy_insert(tp, agno, agbno, len, 0);
 
2890         xfs_trans_brelse(tp, agbp);
 
2894 struct xfs_alloc_query_range_info {
 
2895         xfs_alloc_query_range_fn        fn;
 
2899 /* Format btree record and pass to our callback. */
 
2901 xfs_alloc_query_range_helper(
 
2902         struct xfs_btree_cur            *cur,
 
2903         union xfs_btree_rec             *rec,
 
2906         struct xfs_alloc_query_range_info       *query = priv;
 
2907         struct xfs_alloc_rec_incore             irec;
 
2909         irec.ar_startblock = be32_to_cpu(rec->alloc.ar_startblock);
 
2910         irec.ar_blockcount = be32_to_cpu(rec->alloc.ar_blockcount);
 
2911         return query->fn(cur, &irec, query->priv);
 
2914 /* Find all free space within a given range of blocks. */
 
2916 xfs_alloc_query_range(
 
2917         struct xfs_btree_cur                    *cur,
 
2918         struct xfs_alloc_rec_incore             *low_rec,
 
2919         struct xfs_alloc_rec_incore             *high_rec,
 
2920         xfs_alloc_query_range_fn                fn,
 
2923         union xfs_btree_irec                    low_brec;
 
2924         union xfs_btree_irec                    high_brec;
 
2925         struct xfs_alloc_query_range_info       query;
 
2927         ASSERT(cur->bc_btnum == XFS_BTNUM_BNO);
 
2928         low_brec.a = *low_rec;
 
2929         high_brec.a = *high_rec;
 
2932         return xfs_btree_query_range(cur, &low_brec, &high_brec,
 
2933                         xfs_alloc_query_range_helper, &query);
 
2936 /* Find all free space records. */
 
2938 xfs_alloc_query_all(
 
2939         struct xfs_btree_cur                    *cur,
 
2940         xfs_alloc_query_range_fn                fn,
 
2943         struct xfs_alloc_query_range_info       query;
 
2945         ASSERT(cur->bc_btnum == XFS_BTNUM_BNO);
 
2948         return xfs_btree_query_all(cur, xfs_alloc_query_range_helper, &query);
 
2951 /* Find the size of the AG, in blocks. */
 
2954         struct xfs_mount        *mp,
 
2955         xfs_agnumber_t          agno)
 
2957         ASSERT(agno < mp->m_sb.sb_agcount);
 
2959         if (agno < mp->m_sb.sb_agcount - 1)
 
2960                 return mp->m_sb.sb_agblocks;
 
2961         return mp->m_sb.sb_dblocks - (agno * mp->m_sb.sb_agblocks);
 
2965  * Verify that an AG block number pointer neither points outside the AG
 
2966  * nor points at static metadata.
 
2970         struct xfs_mount        *mp,
 
2971         xfs_agnumber_t          agno,
 
2972         xfs_agblock_t           agbno)
 
2976         eoag = xfs_ag_block_count(mp, agno);
 
2979         if (agbno <= XFS_AGFL_BLOCK(mp))
 
2985  * Verify that an FS block number pointer neither points outside the
 
2986  * filesystem nor points at static AG metadata.
 
2990         struct xfs_mount        *mp,
 
2991         xfs_fsblock_t           fsbno)
 
2993         xfs_agnumber_t          agno = XFS_FSB_TO_AGNO(mp, fsbno);
 
2995         if (agno >= mp->m_sb.sb_agcount)
 
2997         return xfs_verify_agbno(mp, agno, XFS_FSB_TO_AGBNO(mp, fsbno));
 
3000 /* Is there a record covering a given extent? */
 
3002 xfs_alloc_has_record(
 
3003         struct xfs_btree_cur    *cur,
 
3008         union xfs_btree_irec    low;
 
3009         union xfs_btree_irec    high;
 
3011         memset(&low, 0, sizeof(low));
 
3012         low.a.ar_startblock = bno;
 
3013         memset(&high, 0xFF, sizeof(high));
 
3014         high.a.ar_startblock = bno + len - 1;
 
3016         return xfs_btree_has_record(cur, &low, &high, exists);