mv643xx_eth: Fix compile error for architectures without clk.
[pandora-kernel.git] / fs / xfs / xfs_alloc.c
1 /*
2  * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
3  * All Rights Reserved.
4  *
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.
8  *
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.
13  *
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
17  */
18 #include "xfs.h"
19 #include "xfs_fs.h"
20 #include "xfs_types.h"
21 #include "xfs_bit.h"
22 #include "xfs_log.h"
23 #include "xfs_trans.h"
24 #include "xfs_sb.h"
25 #include "xfs_ag.h"
26 #include "xfs_mount.h"
27 #include "xfs_bmap_btree.h"
28 #include "xfs_alloc_btree.h"
29 #include "xfs_ialloc_btree.h"
30 #include "xfs_dinode.h"
31 #include "xfs_inode.h"
32 #include "xfs_btree.h"
33 #include "xfs_alloc.h"
34 #include "xfs_extent_busy.h"
35 #include "xfs_error.h"
36 #include "xfs_trace.h"
37
38 struct workqueue_struct *xfs_alloc_wq;
39
40 #define XFS_ABSDIFF(a,b)        (((a) <= (b)) ? ((b) - (a)) : ((a) - (b)))
41
42 #define XFSA_FIXUP_BNO_OK       1
43 #define XFSA_FIXUP_CNT_OK       2
44
45 STATIC int xfs_alloc_ag_vextent_exact(xfs_alloc_arg_t *);
46 STATIC int xfs_alloc_ag_vextent_near(xfs_alloc_arg_t *);
47 STATIC int xfs_alloc_ag_vextent_size(xfs_alloc_arg_t *);
48 STATIC int xfs_alloc_ag_vextent_small(xfs_alloc_arg_t *,
49                 xfs_btree_cur_t *, xfs_agblock_t *, xfs_extlen_t *, int *);
50
51 /*
52  * Lookup the record equal to [bno, len] in the btree given by cur.
53  */
54 STATIC int                              /* error */
55 xfs_alloc_lookup_eq(
56         struct xfs_btree_cur    *cur,   /* btree cursor */
57         xfs_agblock_t           bno,    /* starting block of extent */
58         xfs_extlen_t            len,    /* length of extent */
59         int                     *stat)  /* success/failure */
60 {
61         cur->bc_rec.a.ar_startblock = bno;
62         cur->bc_rec.a.ar_blockcount = len;
63         return xfs_btree_lookup(cur, XFS_LOOKUP_EQ, stat);
64 }
65
66 /*
67  * Lookup the first record greater than or equal to [bno, len]
68  * in the btree given by cur.
69  */
70 int                             /* error */
71 xfs_alloc_lookup_ge(
72         struct xfs_btree_cur    *cur,   /* btree cursor */
73         xfs_agblock_t           bno,    /* starting block of extent */
74         xfs_extlen_t            len,    /* length of extent */
75         int                     *stat)  /* success/failure */
76 {
77         cur->bc_rec.a.ar_startblock = bno;
78         cur->bc_rec.a.ar_blockcount = len;
79         return xfs_btree_lookup(cur, XFS_LOOKUP_GE, stat);
80 }
81
82 /*
83  * Lookup the first record less than or equal to [bno, len]
84  * in the btree given by cur.
85  */
86 int                                     /* error */
87 xfs_alloc_lookup_le(
88         struct xfs_btree_cur    *cur,   /* btree cursor */
89         xfs_agblock_t           bno,    /* starting block of extent */
90         xfs_extlen_t            len,    /* length of extent */
91         int                     *stat)  /* success/failure */
92 {
93         cur->bc_rec.a.ar_startblock = bno;
94         cur->bc_rec.a.ar_blockcount = len;
95         return xfs_btree_lookup(cur, XFS_LOOKUP_LE, stat);
96 }
97
98 /*
99  * Update the record referred to by cur to the value given
100  * by [bno, len].
101  * This either works (return 0) or gets an EFSCORRUPTED error.
102  */
103 STATIC int                              /* error */
104 xfs_alloc_update(
105         struct xfs_btree_cur    *cur,   /* btree cursor */
106         xfs_agblock_t           bno,    /* starting block of extent */
107         xfs_extlen_t            len)    /* length of extent */
108 {
109         union xfs_btree_rec     rec;
110
111         rec.alloc.ar_startblock = cpu_to_be32(bno);
112         rec.alloc.ar_blockcount = cpu_to_be32(len);
113         return xfs_btree_update(cur, &rec);
114 }
115
116 /*
117  * Get the data from the pointed-to record.
118  */
119 int                                     /* error */
120 xfs_alloc_get_rec(
121         struct xfs_btree_cur    *cur,   /* btree cursor */
122         xfs_agblock_t           *bno,   /* output: starting block of extent */
123         xfs_extlen_t            *len,   /* output: length of extent */
124         int                     *stat)  /* output: success/failure */
125 {
126         union xfs_btree_rec     *rec;
127         int                     error;
128
129         error = xfs_btree_get_rec(cur, &rec, stat);
130         if (!error && *stat == 1) {
131                 *bno = be32_to_cpu(rec->alloc.ar_startblock);
132                 *len = be32_to_cpu(rec->alloc.ar_blockcount);
133         }
134         return error;
135 }
136
137 /*
138  * Compute aligned version of the found extent.
139  * Takes alignment and min length into account.
140  */
141 STATIC void
142 xfs_alloc_compute_aligned(
143         xfs_alloc_arg_t *args,          /* allocation argument structure */
144         xfs_agblock_t   foundbno,       /* starting block in found extent */
145         xfs_extlen_t    foundlen,       /* length in found extent */
146         xfs_agblock_t   *resbno,        /* result block number */
147         xfs_extlen_t    *reslen)        /* result length */
148 {
149         xfs_agblock_t   bno;
150         xfs_extlen_t    len;
151
152         /* Trim busy sections out of found extent */
153         xfs_extent_busy_trim(args, foundbno, foundlen, &bno, &len);
154
155         if (args->alignment > 1 && len >= args->minlen) {
156                 xfs_agblock_t   aligned_bno = roundup(bno, args->alignment);
157                 xfs_extlen_t    diff = aligned_bno - bno;
158
159                 *resbno = aligned_bno;
160                 *reslen = diff >= len ? 0 : len - diff;
161         } else {
162                 *resbno = bno;
163                 *reslen = len;
164         }
165 }
166
167 /*
168  * Compute best start block and diff for "near" allocations.
169  * freelen >= wantlen already checked by caller.
170  */
171 STATIC xfs_extlen_t                     /* difference value (absolute) */
172 xfs_alloc_compute_diff(
173         xfs_agblock_t   wantbno,        /* target starting block */
174         xfs_extlen_t    wantlen,        /* target length */
175         xfs_extlen_t    alignment,      /* target alignment */
176         xfs_agblock_t   freebno,        /* freespace's starting block */
177         xfs_extlen_t    freelen,        /* freespace's length */
178         xfs_agblock_t   *newbnop)       /* result: best start block from free */
179 {
180         xfs_agblock_t   freeend;        /* end of freespace extent */
181         xfs_agblock_t   newbno1;        /* return block number */
182         xfs_agblock_t   newbno2;        /* other new block number */
183         xfs_extlen_t    newlen1=0;      /* length with newbno1 */
184         xfs_extlen_t    newlen2=0;      /* length with newbno2 */
185         xfs_agblock_t   wantend;        /* end of target extent */
186
187         ASSERT(freelen >= wantlen);
188         freeend = freebno + freelen;
189         wantend = wantbno + wantlen;
190         if (freebno >= wantbno) {
191                 if ((newbno1 = roundup(freebno, alignment)) >= freeend)
192                         newbno1 = NULLAGBLOCK;
193         } else if (freeend >= wantend && alignment > 1) {
194                 newbno1 = roundup(wantbno, alignment);
195                 newbno2 = newbno1 - alignment;
196                 if (newbno1 >= freeend)
197                         newbno1 = NULLAGBLOCK;
198                 else
199                         newlen1 = XFS_EXTLEN_MIN(wantlen, freeend - newbno1);
200                 if (newbno2 < freebno)
201                         newbno2 = NULLAGBLOCK;
202                 else
203                         newlen2 = XFS_EXTLEN_MIN(wantlen, freeend - newbno2);
204                 if (newbno1 != NULLAGBLOCK && newbno2 != NULLAGBLOCK) {
205                         if (newlen1 < newlen2 ||
206                             (newlen1 == newlen2 &&
207                              XFS_ABSDIFF(newbno1, wantbno) >
208                              XFS_ABSDIFF(newbno2, wantbno)))
209                                 newbno1 = newbno2;
210                 } else if (newbno2 != NULLAGBLOCK)
211                         newbno1 = newbno2;
212         } else if (freeend >= wantend) {
213                 newbno1 = wantbno;
214         } else if (alignment > 1) {
215                 newbno1 = roundup(freeend - wantlen, alignment);
216                 if (newbno1 > freeend - wantlen &&
217                     newbno1 - alignment >= freebno)
218                         newbno1 -= alignment;
219                 else if (newbno1 >= freeend)
220                         newbno1 = NULLAGBLOCK;
221         } else
222                 newbno1 = freeend - wantlen;
223         *newbnop = newbno1;
224         return newbno1 == NULLAGBLOCK ? 0 : XFS_ABSDIFF(newbno1, wantbno);
225 }
226
227 /*
228  * Fix up the length, based on mod and prod.
229  * len should be k * prod + mod for some k.
230  * If len is too small it is returned unchanged.
231  * If len hits maxlen it is left alone.
232  */
233 STATIC void
234 xfs_alloc_fix_len(
235         xfs_alloc_arg_t *args)          /* allocation argument structure */
236 {
237         xfs_extlen_t    k;
238         xfs_extlen_t    rlen;
239
240         ASSERT(args->mod < args->prod);
241         rlen = args->len;
242         ASSERT(rlen >= args->minlen);
243         ASSERT(rlen <= args->maxlen);
244         if (args->prod <= 1 || rlen < args->mod || rlen == args->maxlen ||
245             (args->mod == 0 && rlen < args->prod))
246                 return;
247         k = rlen % args->prod;
248         if (k == args->mod)
249                 return;
250         if (k > args->mod) {
251                 if ((int)(rlen = rlen - k - args->mod) < (int)args->minlen)
252                         return;
253         } else {
254                 if ((int)(rlen = rlen - args->prod - (args->mod - k)) <
255                     (int)args->minlen)
256                         return;
257         }
258         ASSERT(rlen >= args->minlen);
259         ASSERT(rlen <= args->maxlen);
260         args->len = rlen;
261 }
262
263 /*
264  * Fix up length if there is too little space left in the a.g.
265  * Return 1 if ok, 0 if too little, should give up.
266  */
267 STATIC int
268 xfs_alloc_fix_minleft(
269         xfs_alloc_arg_t *args)          /* allocation argument structure */
270 {
271         xfs_agf_t       *agf;           /* a.g. freelist header */
272         int             diff;           /* free space difference */
273
274         if (args->minleft == 0)
275                 return 1;
276         agf = XFS_BUF_TO_AGF(args->agbp);
277         diff = be32_to_cpu(agf->agf_freeblks)
278                 - args->len - args->minleft;
279         if (diff >= 0)
280                 return 1;
281         args->len += diff;              /* shrink the allocated space */
282         if (args->len >= args->minlen)
283                 return 1;
284         args->agbno = NULLAGBLOCK;
285         return 0;
286 }
287
288 /*
289  * Update the two btrees, logically removing from freespace the extent
290  * starting at rbno, rlen blocks.  The extent is contained within the
291  * actual (current) free extent fbno for flen blocks.
292  * Flags are passed in indicating whether the cursors are set to the
293  * relevant records.
294  */
295 STATIC int                              /* error code */
296 xfs_alloc_fixup_trees(
297         xfs_btree_cur_t *cnt_cur,       /* cursor for by-size btree */
298         xfs_btree_cur_t *bno_cur,       /* cursor for by-block btree */
299         xfs_agblock_t   fbno,           /* starting block of free extent */
300         xfs_extlen_t    flen,           /* length of free extent */
301         xfs_agblock_t   rbno,           /* starting block of returned extent */
302         xfs_extlen_t    rlen,           /* length of returned extent */
303         int             flags)          /* flags, XFSA_FIXUP_... */
304 {
305         int             error;          /* error code */
306         int             i;              /* operation results */
307         xfs_agblock_t   nfbno1;         /* first new free startblock */
308         xfs_agblock_t   nfbno2;         /* second new free startblock */
309         xfs_extlen_t    nflen1=0;       /* first new free length */
310         xfs_extlen_t    nflen2=0;       /* second new free length */
311
312         /*
313          * Look up the record in the by-size tree if necessary.
314          */
315         if (flags & XFSA_FIXUP_CNT_OK) {
316 #ifdef DEBUG
317                 if ((error = xfs_alloc_get_rec(cnt_cur, &nfbno1, &nflen1, &i)))
318                         return error;
319                 XFS_WANT_CORRUPTED_RETURN(
320                         i == 1 && nfbno1 == fbno && nflen1 == flen);
321 #endif
322         } else {
323                 if ((error = xfs_alloc_lookup_eq(cnt_cur, fbno, flen, &i)))
324                         return error;
325                 XFS_WANT_CORRUPTED_RETURN(i == 1);
326         }
327         /*
328          * Look up the record in the by-block tree if necessary.
329          */
330         if (flags & XFSA_FIXUP_BNO_OK) {
331 #ifdef DEBUG
332                 if ((error = xfs_alloc_get_rec(bno_cur, &nfbno1, &nflen1, &i)))
333                         return error;
334                 XFS_WANT_CORRUPTED_RETURN(
335                         i == 1 && nfbno1 == fbno && nflen1 == flen);
336 #endif
337         } else {
338                 if ((error = xfs_alloc_lookup_eq(bno_cur, fbno, flen, &i)))
339                         return error;
340                 XFS_WANT_CORRUPTED_RETURN(i == 1);
341         }
342
343 #ifdef DEBUG
344         if (bno_cur->bc_nlevels == 1 && cnt_cur->bc_nlevels == 1) {
345                 struct xfs_btree_block  *bnoblock;
346                 struct xfs_btree_block  *cntblock;
347
348                 bnoblock = XFS_BUF_TO_BLOCK(bno_cur->bc_bufs[0]);
349                 cntblock = XFS_BUF_TO_BLOCK(cnt_cur->bc_bufs[0]);
350
351                 XFS_WANT_CORRUPTED_RETURN(
352                         bnoblock->bb_numrecs == cntblock->bb_numrecs);
353         }
354 #endif
355
356         /*
357          * Deal with all four cases: the allocated record is contained
358          * within the freespace record, so we can have new freespace
359          * at either (or both) end, or no freespace remaining.
360          */
361         if (rbno == fbno && rlen == flen)
362                 nfbno1 = nfbno2 = NULLAGBLOCK;
363         else if (rbno == fbno) {
364                 nfbno1 = rbno + rlen;
365                 nflen1 = flen - rlen;
366                 nfbno2 = NULLAGBLOCK;
367         } else if (rbno + rlen == fbno + flen) {
368                 nfbno1 = fbno;
369                 nflen1 = flen - rlen;
370                 nfbno2 = NULLAGBLOCK;
371         } else {
372                 nfbno1 = fbno;
373                 nflen1 = rbno - fbno;
374                 nfbno2 = rbno + rlen;
375                 nflen2 = (fbno + flen) - nfbno2;
376         }
377         /*
378          * Delete the entry from the by-size btree.
379          */
380         if ((error = xfs_btree_delete(cnt_cur, &i)))
381                 return error;
382         XFS_WANT_CORRUPTED_RETURN(i == 1);
383         /*
384          * Add new by-size btree entry(s).
385          */
386         if (nfbno1 != NULLAGBLOCK) {
387                 if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno1, nflen1, &i)))
388                         return error;
389                 XFS_WANT_CORRUPTED_RETURN(i == 0);
390                 if ((error = xfs_btree_insert(cnt_cur, &i)))
391                         return error;
392                 XFS_WANT_CORRUPTED_RETURN(i == 1);
393         }
394         if (nfbno2 != NULLAGBLOCK) {
395                 if ((error = xfs_alloc_lookup_eq(cnt_cur, nfbno2, nflen2, &i)))
396                         return error;
397                 XFS_WANT_CORRUPTED_RETURN(i == 0);
398                 if ((error = xfs_btree_insert(cnt_cur, &i)))
399                         return error;
400                 XFS_WANT_CORRUPTED_RETURN(i == 1);
401         }
402         /*
403          * Fix up the by-block btree entry(s).
404          */
405         if (nfbno1 == NULLAGBLOCK) {
406                 /*
407                  * No remaining freespace, just delete the by-block tree entry.
408                  */
409                 if ((error = xfs_btree_delete(bno_cur, &i)))
410                         return error;
411                 XFS_WANT_CORRUPTED_RETURN(i == 1);
412         } else {
413                 /*
414                  * Update the by-block entry to start later|be shorter.
415                  */
416                 if ((error = xfs_alloc_update(bno_cur, nfbno1, nflen1)))
417                         return error;
418         }
419         if (nfbno2 != NULLAGBLOCK) {
420                 /*
421                  * 2 resulting free entries, need to add one.
422                  */
423                 if ((error = xfs_alloc_lookup_eq(bno_cur, nfbno2, nflen2, &i)))
424                         return error;
425                 XFS_WANT_CORRUPTED_RETURN(i == 0);
426                 if ((error = xfs_btree_insert(bno_cur, &i)))
427                         return error;
428                 XFS_WANT_CORRUPTED_RETURN(i == 1);
429         }
430         return 0;
431 }
432
433 /*
434  * Read in the allocation group free block array.
435  */
436 STATIC int                              /* error */
437 xfs_alloc_read_agfl(
438         xfs_mount_t     *mp,            /* mount point structure */
439         xfs_trans_t     *tp,            /* transaction pointer */
440         xfs_agnumber_t  agno,           /* allocation group number */
441         xfs_buf_t       **bpp)          /* buffer for the ag free block array */
442 {
443         xfs_buf_t       *bp;            /* return value */
444         int             error;
445
446         ASSERT(agno != NULLAGNUMBER);
447         error = xfs_trans_read_buf(
448                         mp, tp, mp->m_ddev_targp,
449                         XFS_AG_DADDR(mp, agno, XFS_AGFL_DADDR(mp)),
450                         XFS_FSS_TO_BB(mp, 1), 0, &bp);
451         if (error)
452                 return error;
453         ASSERT(!xfs_buf_geterror(bp));
454         xfs_buf_set_ref(bp, XFS_AGFL_REF);
455         *bpp = bp;
456         return 0;
457 }
458
459 STATIC int
460 xfs_alloc_update_counters(
461         struct xfs_trans        *tp,
462         struct xfs_perag        *pag,
463         struct xfs_buf          *agbp,
464         long                    len)
465 {
466         struct xfs_agf          *agf = XFS_BUF_TO_AGF(agbp);
467
468         pag->pagf_freeblks += len;
469         be32_add_cpu(&agf->agf_freeblks, len);
470
471         xfs_trans_agblocks_delta(tp, len);
472         if (unlikely(be32_to_cpu(agf->agf_freeblks) >
473                      be32_to_cpu(agf->agf_length)))
474                 return EFSCORRUPTED;
475
476         xfs_alloc_log_agf(tp, agbp, XFS_AGF_FREEBLKS);
477         return 0;
478 }
479
480 /*
481  * Allocation group level functions.
482  */
483
484 /*
485  * Allocate a variable extent in the allocation group agno.
486  * Type and bno are used to determine where in the allocation group the
487  * extent will start.
488  * Extent's length (returned in *len) will be between minlen and maxlen,
489  * and of the form k * prod + mod unless there's nothing that large.
490  * Return the starting a.g. block, or NULLAGBLOCK if we can't do it.
491  */
492 STATIC int                      /* error */
493 xfs_alloc_ag_vextent(
494         xfs_alloc_arg_t *args)  /* argument structure for allocation */
495 {
496         int             error=0;
497
498         ASSERT(args->minlen > 0);
499         ASSERT(args->maxlen > 0);
500         ASSERT(args->minlen <= args->maxlen);
501         ASSERT(args->mod < args->prod);
502         ASSERT(args->alignment > 0);
503         /*
504          * Branch to correct routine based on the type.
505          */
506         args->wasfromfl = 0;
507         switch (args->type) {
508         case XFS_ALLOCTYPE_THIS_AG:
509                 error = xfs_alloc_ag_vextent_size(args);
510                 break;
511         case XFS_ALLOCTYPE_NEAR_BNO:
512                 error = xfs_alloc_ag_vextent_near(args);
513                 break;
514         case XFS_ALLOCTYPE_THIS_BNO:
515                 error = xfs_alloc_ag_vextent_exact(args);
516                 break;
517         default:
518                 ASSERT(0);
519                 /* NOTREACHED */
520         }
521
522         if (error || args->agbno == NULLAGBLOCK)
523                 return error;
524
525         ASSERT(args->len >= args->minlen);
526         ASSERT(args->len <= args->maxlen);
527         ASSERT(!args->wasfromfl || !args->isfl);
528         ASSERT(args->agbno % args->alignment == 0);
529
530         if (!args->wasfromfl) {
531                 error = xfs_alloc_update_counters(args->tp, args->pag,
532                                                   args->agbp,
533                                                   -((long)(args->len)));
534                 if (error)
535                         return error;
536
537                 ASSERT(!xfs_extent_busy_search(args->mp, args->agno,
538                                               args->agbno, args->len));
539         }
540
541         if (!args->isfl) {
542                 xfs_trans_mod_sb(args->tp, args->wasdel ?
543                                  XFS_TRANS_SB_RES_FDBLOCKS :
544                                  XFS_TRANS_SB_FDBLOCKS,
545                                  -((long)(args->len)));
546         }
547
548         XFS_STATS_INC(xs_allocx);
549         XFS_STATS_ADD(xs_allocb, args->len);
550         return error;
551 }
552
553 /*
554  * Allocate a variable extent at exactly agno/bno.
555  * Extent's length (returned in *len) will be between minlen and maxlen,
556  * and of the form k * prod + mod unless there's nothing that large.
557  * Return the starting a.g. block (bno), or NULLAGBLOCK if we can't do it.
558  */
559 STATIC int                      /* error */
560 xfs_alloc_ag_vextent_exact(
561         xfs_alloc_arg_t *args)  /* allocation argument structure */
562 {
563         xfs_btree_cur_t *bno_cur;/* by block-number btree cursor */
564         xfs_btree_cur_t *cnt_cur;/* by count btree cursor */
565         int             error;
566         xfs_agblock_t   fbno;   /* start block of found extent */
567         xfs_extlen_t    flen;   /* length of found extent */
568         xfs_agblock_t   tbno;   /* start block of trimmed extent */
569         xfs_extlen_t    tlen;   /* length of trimmed extent */
570         xfs_agblock_t   tend;   /* end block of trimmed extent */
571         int             i;      /* success/failure of operation */
572
573         ASSERT(args->alignment == 1);
574
575         /*
576          * Allocate/initialize a cursor for the by-number freespace btree.
577          */
578         bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
579                                           args->agno, XFS_BTNUM_BNO);
580
581         /*
582          * Lookup bno and minlen in the btree (minlen is irrelevant, really).
583          * Look for the closest free block <= bno, it must contain bno
584          * if any free block does.
585          */
586         error = xfs_alloc_lookup_le(bno_cur, args->agbno, args->minlen, &i);
587         if (error)
588                 goto error0;
589         if (!i)
590                 goto not_found;
591
592         /*
593          * Grab the freespace record.
594          */
595         error = xfs_alloc_get_rec(bno_cur, &fbno, &flen, &i);
596         if (error)
597                 goto error0;
598         XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
599         ASSERT(fbno <= args->agbno);
600
601         /*
602          * Check for overlapping busy extents.
603          */
604         xfs_extent_busy_trim(args, fbno, flen, &tbno, &tlen);
605
606         /*
607          * Give up if the start of the extent is busy, or the freespace isn't
608          * long enough for the minimum request.
609          */
610         if (tbno > args->agbno)
611                 goto not_found;
612         if (tlen < args->minlen)
613                 goto not_found;
614         tend = tbno + tlen;
615         if (tend < args->agbno + args->minlen)
616                 goto not_found;
617
618         /*
619          * End of extent will be smaller of the freespace end and the
620          * maximal requested end.
621          *
622          * Fix the length according to mod and prod if given.
623          */
624         args->len = XFS_AGBLOCK_MIN(tend, args->agbno + args->maxlen)
625                                                 - args->agbno;
626         xfs_alloc_fix_len(args);
627         if (!xfs_alloc_fix_minleft(args))
628                 goto not_found;
629
630         ASSERT(args->agbno + args->len <= tend);
631
632         /*
633          * We are allocating agbno for args->len
634          * Allocate/initialize a cursor for the by-size btree.
635          */
636         cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
637                 args->agno, XFS_BTNUM_CNT);
638         ASSERT(args->agbno + args->len <=
639                 be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length));
640         error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen, args->agbno,
641                                       args->len, XFSA_FIXUP_BNO_OK);
642         if (error) {
643                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
644                 goto error0;
645         }
646
647         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
648         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
649
650         args->wasfromfl = 0;
651         trace_xfs_alloc_exact_done(args);
652         return 0;
653
654 not_found:
655         /* Didn't find it, return null. */
656         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
657         args->agbno = NULLAGBLOCK;
658         trace_xfs_alloc_exact_notfound(args);
659         return 0;
660
661 error0:
662         xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
663         trace_xfs_alloc_exact_error(args);
664         return error;
665 }
666
667 /*
668  * Search the btree in a given direction via the search cursor and compare
669  * the records found against the good extent we've already found.
670  */
671 STATIC int
672 xfs_alloc_find_best_extent(
673         struct xfs_alloc_arg    *args,  /* allocation argument structure */
674         struct xfs_btree_cur    **gcur, /* good cursor */
675         struct xfs_btree_cur    **scur, /* searching cursor */
676         xfs_agblock_t           gdiff,  /* difference for search comparison */
677         xfs_agblock_t           *sbno,  /* extent found by search */
678         xfs_extlen_t            *slen,  /* extent length */
679         xfs_agblock_t           *sbnoa, /* aligned extent found by search */
680         xfs_extlen_t            *slena, /* aligned extent length */
681         int                     dir)    /* 0 = search right, 1 = search left */
682 {
683         xfs_agblock_t           new;
684         xfs_agblock_t           sdiff;
685         int                     error;
686         int                     i;
687
688         /* The good extent is perfect, no need to  search. */
689         if (!gdiff)
690                 goto out_use_good;
691
692         /*
693          * Look until we find a better one, run out of space or run off the end.
694          */
695         do {
696                 error = xfs_alloc_get_rec(*scur, sbno, slen, &i);
697                 if (error)
698                         goto error0;
699                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
700                 xfs_alloc_compute_aligned(args, *sbno, *slen, sbnoa, slena);
701
702                 /*
703                  * The good extent is closer than this one.
704                  */
705                 if (!dir) {
706                         if (*sbnoa >= args->agbno + gdiff)
707                                 goto out_use_good;
708                 } else {
709                         if (*sbnoa <= args->agbno - gdiff)
710                                 goto out_use_good;
711                 }
712
713                 /*
714                  * Same distance, compare length and pick the best.
715                  */
716                 if (*slena >= args->minlen) {
717                         args->len = XFS_EXTLEN_MIN(*slena, args->maxlen);
718                         xfs_alloc_fix_len(args);
719
720                         sdiff = xfs_alloc_compute_diff(args->agbno, args->len,
721                                                        args->alignment, *sbnoa,
722                                                        *slena, &new);
723
724                         /*
725                          * Choose closer size and invalidate other cursor.
726                          */
727                         if (sdiff < gdiff)
728                                 goto out_use_search;
729                         goto out_use_good;
730                 }
731
732                 if (!dir)
733                         error = xfs_btree_increment(*scur, 0, &i);
734                 else
735                         error = xfs_btree_decrement(*scur, 0, &i);
736                 if (error)
737                         goto error0;
738         } while (i);
739
740 out_use_good:
741         xfs_btree_del_cursor(*scur, XFS_BTREE_NOERROR);
742         *scur = NULL;
743         return 0;
744
745 out_use_search:
746         xfs_btree_del_cursor(*gcur, XFS_BTREE_NOERROR);
747         *gcur = NULL;
748         return 0;
749
750 error0:
751         /* caller invalidates cursors */
752         return error;
753 }
754
755 /*
756  * Allocate a variable extent near bno in the allocation group agno.
757  * Extent's length (returned in len) will be between minlen and maxlen,
758  * and of the form k * prod + mod unless there's nothing that large.
759  * Return the starting a.g. block, or NULLAGBLOCK if we can't do it.
760  */
761 STATIC int                              /* error */
762 xfs_alloc_ag_vextent_near(
763         xfs_alloc_arg_t *args)          /* allocation argument structure */
764 {
765         xfs_btree_cur_t *bno_cur_gt;    /* cursor for bno btree, right side */
766         xfs_btree_cur_t *bno_cur_lt;    /* cursor for bno btree, left side */
767         xfs_btree_cur_t *cnt_cur;       /* cursor for count btree */
768         xfs_agblock_t   gtbno;          /* start bno of right side entry */
769         xfs_agblock_t   gtbnoa;         /* aligned ... */
770         xfs_extlen_t    gtdiff;         /* difference to right side entry */
771         xfs_extlen_t    gtlen;          /* length of right side entry */
772         xfs_extlen_t    gtlena;         /* aligned ... */
773         xfs_agblock_t   gtnew;          /* useful start bno of right side */
774         int             error;          /* error code */
775         int             i;              /* result code, temporary */
776         int             j;              /* result code, temporary */
777         xfs_agblock_t   ltbno;          /* start bno of left side entry */
778         xfs_agblock_t   ltbnoa;         /* aligned ... */
779         xfs_extlen_t    ltdiff;         /* difference to left side entry */
780         xfs_extlen_t    ltlen;          /* length of left side entry */
781         xfs_extlen_t    ltlena;         /* aligned ... */
782         xfs_agblock_t   ltnew;          /* useful start bno of left side */
783         xfs_extlen_t    rlen;           /* length of returned extent */
784         int             forced = 0;
785 #if defined(DEBUG) && defined(__KERNEL__)
786         /*
787          * Randomly don't execute the first algorithm.
788          */
789         int             dofirst;        /* set to do first algorithm */
790
791         dofirst = random32() & 1;
792 #endif
793
794 restart:
795         bno_cur_lt = NULL;
796         bno_cur_gt = NULL;
797         ltlen = 0;
798         gtlena = 0;
799         ltlena = 0;
800
801         /*
802          * Get a cursor for the by-size btree.
803          */
804         cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
805                 args->agno, XFS_BTNUM_CNT);
806
807         /*
808          * See if there are any free extents as big as maxlen.
809          */
810         if ((error = xfs_alloc_lookup_ge(cnt_cur, 0, args->maxlen, &i)))
811                 goto error0;
812         /*
813          * If none, then pick up the last entry in the tree unless the
814          * tree is empty.
815          */
816         if (!i) {
817                 if ((error = xfs_alloc_ag_vextent_small(args, cnt_cur, &ltbno,
818                                 &ltlen, &i)))
819                         goto error0;
820                 if (i == 0 || ltlen == 0) {
821                         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
822                         trace_xfs_alloc_near_noentry(args);
823                         return 0;
824                 }
825                 ASSERT(i == 1);
826         }
827         args->wasfromfl = 0;
828
829         /*
830          * First algorithm.
831          * If the requested extent is large wrt the freespaces available
832          * in this a.g., then the cursor will be pointing to a btree entry
833          * near the right edge of the tree.  If it's in the last btree leaf
834          * block, then we just examine all the entries in that block
835          * that are big enough, and pick the best one.
836          * This is written as a while loop so we can break out of it,
837          * but we never loop back to the top.
838          */
839         while (xfs_btree_islastblock(cnt_cur, 0)) {
840                 xfs_extlen_t    bdiff;
841                 int             besti=0;
842                 xfs_extlen_t    blen=0;
843                 xfs_agblock_t   bnew=0;
844
845 #if defined(DEBUG) && defined(__KERNEL__)
846                 if (!dofirst)
847                         break;
848 #endif
849                 /*
850                  * Start from the entry that lookup found, sequence through
851                  * all larger free blocks.  If we're actually pointing at a
852                  * record smaller than maxlen, go to the start of this block,
853                  * and skip all those smaller than minlen.
854                  */
855                 if (ltlen || args->alignment > 1) {
856                         cnt_cur->bc_ptrs[0] = 1;
857                         do {
858                                 if ((error = xfs_alloc_get_rec(cnt_cur, &ltbno,
859                                                 &ltlen, &i)))
860                                         goto error0;
861                                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
862                                 if (ltlen >= args->minlen)
863                                         break;
864                                 if ((error = xfs_btree_increment(cnt_cur, 0, &i)))
865                                         goto error0;
866                         } while (i);
867                         ASSERT(ltlen >= args->minlen);
868                         if (!i)
869                                 break;
870                 }
871                 i = cnt_cur->bc_ptrs[0];
872                 for (j = 1, blen = 0, bdiff = 0;
873                      !error && j && (blen < args->maxlen || bdiff > 0);
874                      error = xfs_btree_increment(cnt_cur, 0, &j)) {
875                         /*
876                          * For each entry, decide if it's better than
877                          * the previous best entry.
878                          */
879                         if ((error = xfs_alloc_get_rec(cnt_cur, &ltbno, &ltlen, &i)))
880                                 goto error0;
881                         XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
882                         xfs_alloc_compute_aligned(args, ltbno, ltlen,
883                                                   &ltbnoa, &ltlena);
884                         if (ltlena < args->minlen)
885                                 continue;
886                         args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
887                         xfs_alloc_fix_len(args);
888                         ASSERT(args->len >= args->minlen);
889                         if (args->len < blen)
890                                 continue;
891                         ltdiff = xfs_alloc_compute_diff(args->agbno, args->len,
892                                 args->alignment, ltbnoa, ltlena, &ltnew);
893                         if (ltnew != NULLAGBLOCK &&
894                             (args->len > blen || ltdiff < bdiff)) {
895                                 bdiff = ltdiff;
896                                 bnew = ltnew;
897                                 blen = args->len;
898                                 besti = cnt_cur->bc_ptrs[0];
899                         }
900                 }
901                 /*
902                  * It didn't work.  We COULD be in a case where
903                  * there's a good record somewhere, so try again.
904                  */
905                 if (blen == 0)
906                         break;
907                 /*
908                  * Point at the best entry, and retrieve it again.
909                  */
910                 cnt_cur->bc_ptrs[0] = besti;
911                 if ((error = xfs_alloc_get_rec(cnt_cur, &ltbno, &ltlen, &i)))
912                         goto error0;
913                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
914                 ASSERT(ltbno + ltlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length));
915                 args->len = blen;
916                 if (!xfs_alloc_fix_minleft(args)) {
917                         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
918                         trace_xfs_alloc_near_nominleft(args);
919                         return 0;
920                 }
921                 blen = args->len;
922                 /*
923                  * We are allocating starting at bnew for blen blocks.
924                  */
925                 args->agbno = bnew;
926                 ASSERT(bnew >= ltbno);
927                 ASSERT(bnew + blen <= ltbno + ltlen);
928                 /*
929                  * Set up a cursor for the by-bno tree.
930                  */
931                 bno_cur_lt = xfs_allocbt_init_cursor(args->mp, args->tp,
932                         args->agbp, args->agno, XFS_BTNUM_BNO);
933                 /*
934                  * Fix up the btree entries.
935                  */
936                 if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno,
937                                 ltlen, bnew, blen, XFSA_FIXUP_CNT_OK)))
938                         goto error0;
939                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
940                 xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
941
942                 trace_xfs_alloc_near_first(args);
943                 return 0;
944         }
945         /*
946          * Second algorithm.
947          * Search in the by-bno tree to the left and to the right
948          * simultaneously, until in each case we find a space big enough,
949          * or run into the edge of the tree.  When we run into the edge,
950          * we deallocate that cursor.
951          * If both searches succeed, we compare the two spaces and pick
952          * the better one.
953          * With alignment, it's possible for both to fail; the upper
954          * level algorithm that picks allocation groups for allocations
955          * is not supposed to do this.
956          */
957         /*
958          * Allocate and initialize the cursor for the leftward search.
959          */
960         bno_cur_lt = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
961                 args->agno, XFS_BTNUM_BNO);
962         /*
963          * Lookup <= bno to find the leftward search's starting point.
964          */
965         if ((error = xfs_alloc_lookup_le(bno_cur_lt, args->agbno, args->maxlen, &i)))
966                 goto error0;
967         if (!i) {
968                 /*
969                  * Didn't find anything; use this cursor for the rightward
970                  * search.
971                  */
972                 bno_cur_gt = bno_cur_lt;
973                 bno_cur_lt = NULL;
974         }
975         /*
976          * Found something.  Duplicate the cursor for the rightward search.
977          */
978         else if ((error = xfs_btree_dup_cursor(bno_cur_lt, &bno_cur_gt)))
979                 goto error0;
980         /*
981          * Increment the cursor, so we will point at the entry just right
982          * of the leftward entry if any, or to the leftmost entry.
983          */
984         if ((error = xfs_btree_increment(bno_cur_gt, 0, &i)))
985                 goto error0;
986         if (!i) {
987                 /*
988                  * It failed, there are no rightward entries.
989                  */
990                 xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_NOERROR);
991                 bno_cur_gt = NULL;
992         }
993         /*
994          * Loop going left with the leftward cursor, right with the
995          * rightward cursor, until either both directions give up or
996          * we find an entry at least as big as minlen.
997          */
998         do {
999                 if (bno_cur_lt) {
1000                         if ((error = xfs_alloc_get_rec(bno_cur_lt, &ltbno, &ltlen, &i)))
1001                                 goto error0;
1002                         XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1003                         xfs_alloc_compute_aligned(args, ltbno, ltlen,
1004                                                   &ltbnoa, &ltlena);
1005                         if (ltlena >= args->minlen)
1006                                 break;
1007                         if ((error = xfs_btree_decrement(bno_cur_lt, 0, &i)))
1008                                 goto error0;
1009                         if (!i) {
1010                                 xfs_btree_del_cursor(bno_cur_lt,
1011                                                      XFS_BTREE_NOERROR);
1012                                 bno_cur_lt = NULL;
1013                         }
1014                 }
1015                 if (bno_cur_gt) {
1016                         if ((error = xfs_alloc_get_rec(bno_cur_gt, &gtbno, &gtlen, &i)))
1017                                 goto error0;
1018                         XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1019                         xfs_alloc_compute_aligned(args, gtbno, gtlen,
1020                                                   &gtbnoa, &gtlena);
1021                         if (gtlena >= args->minlen)
1022                                 break;
1023                         if ((error = xfs_btree_increment(bno_cur_gt, 0, &i)))
1024                                 goto error0;
1025                         if (!i) {
1026                                 xfs_btree_del_cursor(bno_cur_gt,
1027                                                      XFS_BTREE_NOERROR);
1028                                 bno_cur_gt = NULL;
1029                         }
1030                 }
1031         } while (bno_cur_lt || bno_cur_gt);
1032
1033         /*
1034          * Got both cursors still active, need to find better entry.
1035          */
1036         if (bno_cur_lt && bno_cur_gt) {
1037                 if (ltlena >= args->minlen) {
1038                         /*
1039                          * Left side is good, look for a right side entry.
1040                          */
1041                         args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
1042                         xfs_alloc_fix_len(args);
1043                         ltdiff = xfs_alloc_compute_diff(args->agbno, args->len,
1044                                 args->alignment, ltbnoa, ltlena, &ltnew);
1045
1046                         error = xfs_alloc_find_best_extent(args,
1047                                                 &bno_cur_lt, &bno_cur_gt,
1048                                                 ltdiff, &gtbno, &gtlen,
1049                                                 &gtbnoa, &gtlena,
1050                                                 0 /* search right */);
1051                 } else {
1052                         ASSERT(gtlena >= args->minlen);
1053
1054                         /*
1055                          * Right side is good, look for a left side entry.
1056                          */
1057                         args->len = XFS_EXTLEN_MIN(gtlena, args->maxlen);
1058                         xfs_alloc_fix_len(args);
1059                         gtdiff = xfs_alloc_compute_diff(args->agbno, args->len,
1060                                 args->alignment, gtbnoa, gtlena, &gtnew);
1061
1062                         error = xfs_alloc_find_best_extent(args,
1063                                                 &bno_cur_gt, &bno_cur_lt,
1064                                                 gtdiff, &ltbno, &ltlen,
1065                                                 &ltbnoa, &ltlena,
1066                                                 1 /* search left */);
1067                 }
1068
1069                 if (error)
1070                         goto error0;
1071         }
1072
1073         /*
1074          * If we couldn't get anything, give up.
1075          */
1076         if (bno_cur_lt == NULL && bno_cur_gt == NULL) {
1077                 if (!forced++) {
1078                         trace_xfs_alloc_near_busy(args);
1079                         xfs_log_force(args->mp, XFS_LOG_SYNC);
1080                         goto restart;
1081                 }
1082
1083                 trace_xfs_alloc_size_neither(args);
1084                 args->agbno = NULLAGBLOCK;
1085                 return 0;
1086         }
1087
1088         /*
1089          * At this point we have selected a freespace entry, either to the
1090          * left or to the right.  If it's on the right, copy all the
1091          * useful variables to the "left" set so we only have one
1092          * copy of this code.
1093          */
1094         if (bno_cur_gt) {
1095                 bno_cur_lt = bno_cur_gt;
1096                 bno_cur_gt = NULL;
1097                 ltbno = gtbno;
1098                 ltbnoa = gtbnoa;
1099                 ltlen = gtlen;
1100                 ltlena = gtlena;
1101                 j = 1;
1102         } else
1103                 j = 0;
1104
1105         /*
1106          * Fix up the length and compute the useful address.
1107          */
1108         args->len = XFS_EXTLEN_MIN(ltlena, args->maxlen);
1109         xfs_alloc_fix_len(args);
1110         if (!xfs_alloc_fix_minleft(args)) {
1111                 trace_xfs_alloc_near_nominleft(args);
1112                 xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
1113                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
1114                 return 0;
1115         }
1116         rlen = args->len;
1117         (void)xfs_alloc_compute_diff(args->agbno, rlen, args->alignment,
1118                                      ltbnoa, ltlena, &ltnew);
1119         ASSERT(ltnew >= ltbno);
1120         ASSERT(ltnew + rlen <= ltbnoa + ltlena);
1121         ASSERT(ltnew + rlen <= be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length));
1122         args->agbno = ltnew;
1123
1124         if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur_lt, ltbno, ltlen,
1125                         ltnew, rlen, XFSA_FIXUP_BNO_OK)))
1126                 goto error0;
1127
1128         if (j)
1129                 trace_xfs_alloc_near_greater(args);
1130         else
1131                 trace_xfs_alloc_near_lesser(args);
1132
1133         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
1134         xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_NOERROR);
1135         return 0;
1136
1137  error0:
1138         trace_xfs_alloc_near_error(args);
1139         if (cnt_cur != NULL)
1140                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
1141         if (bno_cur_lt != NULL)
1142                 xfs_btree_del_cursor(bno_cur_lt, XFS_BTREE_ERROR);
1143         if (bno_cur_gt != NULL)
1144                 xfs_btree_del_cursor(bno_cur_gt, XFS_BTREE_ERROR);
1145         return error;
1146 }
1147
1148 /*
1149  * Allocate a variable extent anywhere in the allocation group agno.
1150  * Extent's length (returned in len) will be between minlen and maxlen,
1151  * and of the form k * prod + mod unless there's nothing that large.
1152  * Return the starting a.g. block, or NULLAGBLOCK if we can't do it.
1153  */
1154 STATIC int                              /* error */
1155 xfs_alloc_ag_vextent_size(
1156         xfs_alloc_arg_t *args)          /* allocation argument structure */
1157 {
1158         xfs_btree_cur_t *bno_cur;       /* cursor for bno btree */
1159         xfs_btree_cur_t *cnt_cur;       /* cursor for cnt btree */
1160         int             error;          /* error result */
1161         xfs_agblock_t   fbno;           /* start of found freespace */
1162         xfs_extlen_t    flen;           /* length of found freespace */
1163         int             i;              /* temp status variable */
1164         xfs_agblock_t   rbno;           /* returned block number */
1165         xfs_extlen_t    rlen;           /* length of returned extent */
1166         int             forced = 0;
1167
1168 restart:
1169         /*
1170          * Allocate and initialize a cursor for the by-size btree.
1171          */
1172         cnt_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
1173                 args->agno, XFS_BTNUM_CNT);
1174         bno_cur = NULL;
1175
1176         /*
1177          * Look for an entry >= maxlen+alignment-1 blocks.
1178          */
1179         if ((error = xfs_alloc_lookup_ge(cnt_cur, 0,
1180                         args->maxlen + args->alignment - 1, &i)))
1181                 goto error0;
1182
1183         /*
1184          * If none or we have busy extents that we cannot allocate from, then
1185          * we have to settle for a smaller extent. In the case that there are
1186          * no large extents, this will return the last entry in the tree unless
1187          * the tree is empty. In the case that there are only busy large
1188          * extents, this will return the largest small extent unless there
1189          * are no smaller extents available.
1190          */
1191         if (!i || forced > 1) {
1192                 error = xfs_alloc_ag_vextent_small(args, cnt_cur,
1193                                                    &fbno, &flen, &i);
1194                 if (error)
1195                         goto error0;
1196                 if (i == 0 || flen == 0) {
1197                         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
1198                         trace_xfs_alloc_size_noentry(args);
1199                         return 0;
1200                 }
1201                 ASSERT(i == 1);
1202                 xfs_alloc_compute_aligned(args, fbno, flen, &rbno, &rlen);
1203         } else {
1204                 /*
1205                  * Search for a non-busy extent that is large enough.
1206                  * If we are at low space, don't check, or if we fall of
1207                  * the end of the btree, turn off the busy check and
1208                  * restart.
1209                  */
1210                 for (;;) {
1211                         error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen, &i);
1212                         if (error)
1213                                 goto error0;
1214                         XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1215
1216                         xfs_alloc_compute_aligned(args, fbno, flen,
1217                                                   &rbno, &rlen);
1218
1219                         if (rlen >= args->maxlen)
1220                                 break;
1221
1222                         error = xfs_btree_increment(cnt_cur, 0, &i);
1223                         if (error)
1224                                 goto error0;
1225                         if (i == 0) {
1226                                 /*
1227                                  * Our only valid extents must have been busy.
1228                                  * Make it unbusy by forcing the log out and
1229                                  * retrying. If we've been here before, forcing
1230                                  * the log isn't making the extents available,
1231                                  * which means they have probably been freed in
1232                                  * this transaction.  In that case, we have to
1233                                  * give up on them and we'll attempt a minlen
1234                                  * allocation the next time around.
1235                                  */
1236                                 xfs_btree_del_cursor(cnt_cur,
1237                                                      XFS_BTREE_NOERROR);
1238                                 trace_xfs_alloc_size_busy(args);
1239                                 if (!forced++)
1240                                         xfs_log_force(args->mp, XFS_LOG_SYNC);
1241                                 goto restart;
1242                         }
1243                 }
1244         }
1245
1246         /*
1247          * In the first case above, we got the last entry in the
1248          * by-size btree.  Now we check to see if the space hits maxlen
1249          * once aligned; if not, we search left for something better.
1250          * This can't happen in the second case above.
1251          */
1252         rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
1253         XFS_WANT_CORRUPTED_GOTO(rlen == 0 ||
1254                         (rlen <= flen && rbno + rlen <= fbno + flen), error0);
1255         if (rlen < args->maxlen) {
1256                 xfs_agblock_t   bestfbno;
1257                 xfs_extlen_t    bestflen;
1258                 xfs_agblock_t   bestrbno;
1259                 xfs_extlen_t    bestrlen;
1260
1261                 bestrlen = rlen;
1262                 bestrbno = rbno;
1263                 bestflen = flen;
1264                 bestfbno = fbno;
1265                 for (;;) {
1266                         if ((error = xfs_btree_decrement(cnt_cur, 0, &i)))
1267                                 goto error0;
1268                         if (i == 0)
1269                                 break;
1270                         if ((error = xfs_alloc_get_rec(cnt_cur, &fbno, &flen,
1271                                         &i)))
1272                                 goto error0;
1273                         XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1274                         if (flen < bestrlen)
1275                                 break;
1276                         xfs_alloc_compute_aligned(args, fbno, flen,
1277                                                   &rbno, &rlen);
1278                         rlen = XFS_EXTLEN_MIN(args->maxlen, rlen);
1279                         XFS_WANT_CORRUPTED_GOTO(rlen == 0 ||
1280                                 (rlen <= flen && rbno + rlen <= fbno + flen),
1281                                 error0);
1282                         if (rlen > bestrlen) {
1283                                 bestrlen = rlen;
1284                                 bestrbno = rbno;
1285                                 bestflen = flen;
1286                                 bestfbno = fbno;
1287                                 if (rlen == args->maxlen)
1288                                         break;
1289                         }
1290                 }
1291                 if ((error = xfs_alloc_lookup_eq(cnt_cur, bestfbno, bestflen,
1292                                 &i)))
1293                         goto error0;
1294                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1295                 rlen = bestrlen;
1296                 rbno = bestrbno;
1297                 flen = bestflen;
1298                 fbno = bestfbno;
1299         }
1300         args->wasfromfl = 0;
1301         /*
1302          * Fix up the length.
1303          */
1304         args->len = rlen;
1305         if (rlen < args->minlen) {
1306                 if (!forced++) {
1307                         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
1308                         trace_xfs_alloc_size_busy(args);
1309                         xfs_log_force(args->mp, XFS_LOG_SYNC);
1310                         goto restart;
1311                 }
1312                 goto out_nominleft;
1313         }
1314         xfs_alloc_fix_len(args);
1315
1316         if (!xfs_alloc_fix_minleft(args))
1317                 goto out_nominleft;
1318         rlen = args->len;
1319         XFS_WANT_CORRUPTED_GOTO(rlen <= flen, error0);
1320         /*
1321          * Allocate and initialize a cursor for the by-block tree.
1322          */
1323         bno_cur = xfs_allocbt_init_cursor(args->mp, args->tp, args->agbp,
1324                 args->agno, XFS_BTNUM_BNO);
1325         if ((error = xfs_alloc_fixup_trees(cnt_cur, bno_cur, fbno, flen,
1326                         rbno, rlen, XFSA_FIXUP_CNT_OK)))
1327                 goto error0;
1328         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
1329         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
1330         cnt_cur = bno_cur = NULL;
1331         args->len = rlen;
1332         args->agbno = rbno;
1333         XFS_WANT_CORRUPTED_GOTO(
1334                 args->agbno + args->len <=
1335                         be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length),
1336                 error0);
1337         trace_xfs_alloc_size_done(args);
1338         return 0;
1339
1340 error0:
1341         trace_xfs_alloc_size_error(args);
1342         if (cnt_cur)
1343                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
1344         if (bno_cur)
1345                 xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
1346         return error;
1347
1348 out_nominleft:
1349         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
1350         trace_xfs_alloc_size_nominleft(args);
1351         args->agbno = NULLAGBLOCK;
1352         return 0;
1353 }
1354
1355 /*
1356  * Deal with the case where only small freespaces remain.
1357  * Either return the contents of the last freespace record,
1358  * or allocate space from the freelist if there is nothing in the tree.
1359  */
1360 STATIC int                      /* error */
1361 xfs_alloc_ag_vextent_small(
1362         xfs_alloc_arg_t *args,  /* allocation argument structure */
1363         xfs_btree_cur_t *ccur,  /* by-size cursor */
1364         xfs_agblock_t   *fbnop, /* result block number */
1365         xfs_extlen_t    *flenp, /* result length */
1366         int             *stat)  /* status: 0-freelist, 1-normal/none */
1367 {
1368         int             error;
1369         xfs_agblock_t   fbno;
1370         xfs_extlen_t    flen;
1371         int             i;
1372
1373         if ((error = xfs_btree_decrement(ccur, 0, &i)))
1374                 goto error0;
1375         if (i) {
1376                 if ((error = xfs_alloc_get_rec(ccur, &fbno, &flen, &i)))
1377                         goto error0;
1378                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1379         }
1380         /*
1381          * Nothing in the btree, try the freelist.  Make sure
1382          * to respect minleft even when pulling from the
1383          * freelist.
1384          */
1385         else if (args->minlen == 1 && args->alignment == 1 && !args->isfl &&
1386                  (be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_flcount)
1387                   > args->minleft)) {
1388                 error = xfs_alloc_get_freelist(args->tp, args->agbp, &fbno, 0);
1389                 if (error)
1390                         goto error0;
1391                 if (fbno != NULLAGBLOCK) {
1392                         xfs_extent_busy_reuse(args->mp, args->agno, fbno, 1,
1393                                              args->userdata);
1394
1395                         if (args->userdata) {
1396                                 xfs_buf_t       *bp;
1397
1398                                 bp = xfs_btree_get_bufs(args->mp, args->tp,
1399                                         args->agno, fbno, 0);
1400                                 xfs_trans_binval(args->tp, bp);
1401                         }
1402                         args->len = 1;
1403                         args->agbno = fbno;
1404                         XFS_WANT_CORRUPTED_GOTO(
1405                                 args->agbno + args->len <=
1406                                 be32_to_cpu(XFS_BUF_TO_AGF(args->agbp)->agf_length),
1407                                 error0);
1408                         args->wasfromfl = 1;
1409                         trace_xfs_alloc_small_freelist(args);
1410                         *stat = 0;
1411                         return 0;
1412                 }
1413                 /*
1414                  * Nothing in the freelist.
1415                  */
1416                 else
1417                         flen = 0;
1418         }
1419         /*
1420          * Can't allocate from the freelist for some reason.
1421          */
1422         else {
1423                 fbno = NULLAGBLOCK;
1424                 flen = 0;
1425         }
1426         /*
1427          * Can't do the allocation, give up.
1428          */
1429         if (flen < args->minlen) {
1430                 args->agbno = NULLAGBLOCK;
1431                 trace_xfs_alloc_small_notenough(args);
1432                 flen = 0;
1433         }
1434         *fbnop = fbno;
1435         *flenp = flen;
1436         *stat = 1;
1437         trace_xfs_alloc_small_done(args);
1438         return 0;
1439
1440 error0:
1441         trace_xfs_alloc_small_error(args);
1442         return error;
1443 }
1444
1445 /*
1446  * Free the extent starting at agno/bno for length.
1447  */
1448 STATIC int                      /* error */
1449 xfs_free_ag_extent(
1450         xfs_trans_t     *tp,    /* transaction pointer */
1451         xfs_buf_t       *agbp,  /* buffer for a.g. freelist header */
1452         xfs_agnumber_t  agno,   /* allocation group number */
1453         xfs_agblock_t   bno,    /* starting block number */
1454         xfs_extlen_t    len,    /* length of extent */
1455         int             isfl)   /* set if is freelist blocks - no sb acctg */
1456 {
1457         xfs_btree_cur_t *bno_cur;       /* cursor for by-block btree */
1458         xfs_btree_cur_t *cnt_cur;       /* cursor for by-size btree */
1459         int             error;          /* error return value */
1460         xfs_agblock_t   gtbno;          /* start of right neighbor block */
1461         xfs_extlen_t    gtlen;          /* length of right neighbor block */
1462         int             haveleft;       /* have a left neighbor block */
1463         int             haveright;      /* have a right neighbor block */
1464         int             i;              /* temp, result code */
1465         xfs_agblock_t   ltbno;          /* start of left neighbor block */
1466         xfs_extlen_t    ltlen;          /* length of left neighbor block */
1467         xfs_mount_t     *mp;            /* mount point struct for filesystem */
1468         xfs_agblock_t   nbno;           /* new starting block of freespace */
1469         xfs_extlen_t    nlen;           /* new length of freespace */
1470         xfs_perag_t     *pag;           /* per allocation group data */
1471
1472         mp = tp->t_mountp;
1473         /*
1474          * Allocate and initialize a cursor for the by-block btree.
1475          */
1476         bno_cur = xfs_allocbt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_BNO);
1477         cnt_cur = NULL;
1478         /*
1479          * Look for a neighboring block on the left (lower block numbers)
1480          * that is contiguous with this space.
1481          */
1482         if ((error = xfs_alloc_lookup_le(bno_cur, bno, len, &haveleft)))
1483                 goto error0;
1484         if (haveleft) {
1485                 /*
1486                  * There is a block to our left.
1487                  */
1488                 if ((error = xfs_alloc_get_rec(bno_cur, &ltbno, &ltlen, &i)))
1489                         goto error0;
1490                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1491                 /*
1492                  * It's not contiguous, though.
1493                  */
1494                 if (ltbno + ltlen < bno)
1495                         haveleft = 0;
1496                 else {
1497                         /*
1498                          * If this failure happens the request to free this
1499                          * space was invalid, it's (partly) already free.
1500                          * Very bad.
1501                          */
1502                         XFS_WANT_CORRUPTED_GOTO(ltbno + ltlen <= bno, error0);
1503                 }
1504         }
1505         /*
1506          * Look for a neighboring block on the right (higher block numbers)
1507          * that is contiguous with this space.
1508          */
1509         if ((error = xfs_btree_increment(bno_cur, 0, &haveright)))
1510                 goto error0;
1511         if (haveright) {
1512                 /*
1513                  * There is a block to our right.
1514                  */
1515                 if ((error = xfs_alloc_get_rec(bno_cur, &gtbno, &gtlen, &i)))
1516                         goto error0;
1517                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1518                 /*
1519                  * It's not contiguous, though.
1520                  */
1521                 if (bno + len < gtbno)
1522                         haveright = 0;
1523                 else {
1524                         /*
1525                          * If this failure happens the request to free this
1526                          * space was invalid, it's (partly) already free.
1527                          * Very bad.
1528                          */
1529                         XFS_WANT_CORRUPTED_GOTO(gtbno >= bno + len, error0);
1530                 }
1531         }
1532         /*
1533          * Now allocate and initialize a cursor for the by-size tree.
1534          */
1535         cnt_cur = xfs_allocbt_init_cursor(mp, tp, agbp, agno, XFS_BTNUM_CNT);
1536         /*
1537          * Have both left and right contiguous neighbors.
1538          * Merge all three into a single free block.
1539          */
1540         if (haveleft && haveright) {
1541                 /*
1542                  * Delete the old by-size entry on the left.
1543                  */
1544                 if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i)))
1545                         goto error0;
1546                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1547                 if ((error = xfs_btree_delete(cnt_cur, &i)))
1548                         goto error0;
1549                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1550                 /*
1551                  * Delete the old by-size entry on the right.
1552                  */
1553                 if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i)))
1554                         goto error0;
1555                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1556                 if ((error = xfs_btree_delete(cnt_cur, &i)))
1557                         goto error0;
1558                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1559                 /*
1560                  * Delete the old by-block entry for the right block.
1561                  */
1562                 if ((error = xfs_btree_delete(bno_cur, &i)))
1563                         goto error0;
1564                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1565                 /*
1566                  * Move the by-block cursor back to the left neighbor.
1567                  */
1568                 if ((error = xfs_btree_decrement(bno_cur, 0, &i)))
1569                         goto error0;
1570                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1571 #ifdef DEBUG
1572                 /*
1573                  * Check that this is the right record: delete didn't
1574                  * mangle the cursor.
1575                  */
1576                 {
1577                         xfs_agblock_t   xxbno;
1578                         xfs_extlen_t    xxlen;
1579
1580                         if ((error = xfs_alloc_get_rec(bno_cur, &xxbno, &xxlen,
1581                                         &i)))
1582                                 goto error0;
1583                         XFS_WANT_CORRUPTED_GOTO(
1584                                 i == 1 && xxbno == ltbno && xxlen == ltlen,
1585                                 error0);
1586                 }
1587 #endif
1588                 /*
1589                  * Update remaining by-block entry to the new, joined block.
1590                  */
1591                 nbno = ltbno;
1592                 nlen = len + ltlen + gtlen;
1593                 if ((error = xfs_alloc_update(bno_cur, nbno, nlen)))
1594                         goto error0;
1595         }
1596         /*
1597          * Have only a left contiguous neighbor.
1598          * Merge it together with the new freespace.
1599          */
1600         else if (haveleft) {
1601                 /*
1602                  * Delete the old by-size entry on the left.
1603                  */
1604                 if ((error = xfs_alloc_lookup_eq(cnt_cur, ltbno, ltlen, &i)))
1605                         goto error0;
1606                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1607                 if ((error = xfs_btree_delete(cnt_cur, &i)))
1608                         goto error0;
1609                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1610                 /*
1611                  * Back up the by-block cursor to the left neighbor, and
1612                  * update its length.
1613                  */
1614                 if ((error = xfs_btree_decrement(bno_cur, 0, &i)))
1615                         goto error0;
1616                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1617                 nbno = ltbno;
1618                 nlen = len + ltlen;
1619                 if ((error = xfs_alloc_update(bno_cur, nbno, nlen)))
1620                         goto error0;
1621         }
1622         /*
1623          * Have only a right contiguous neighbor.
1624          * Merge it together with the new freespace.
1625          */
1626         else if (haveright) {
1627                 /*
1628                  * Delete the old by-size entry on the right.
1629                  */
1630                 if ((error = xfs_alloc_lookup_eq(cnt_cur, gtbno, gtlen, &i)))
1631                         goto error0;
1632                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1633                 if ((error = xfs_btree_delete(cnt_cur, &i)))
1634                         goto error0;
1635                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1636                 /*
1637                  * Update the starting block and length of the right
1638                  * neighbor in the by-block tree.
1639                  */
1640                 nbno = bno;
1641                 nlen = len + gtlen;
1642                 if ((error = xfs_alloc_update(bno_cur, nbno, nlen)))
1643                         goto error0;
1644         }
1645         /*
1646          * No contiguous neighbors.
1647          * Insert the new freespace into the by-block tree.
1648          */
1649         else {
1650                 nbno = bno;
1651                 nlen = len;
1652                 if ((error = xfs_btree_insert(bno_cur, &i)))
1653                         goto error0;
1654                 XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1655         }
1656         xfs_btree_del_cursor(bno_cur, XFS_BTREE_NOERROR);
1657         bno_cur = NULL;
1658         /*
1659          * In all cases we need to insert the new freespace in the by-size tree.
1660          */
1661         if ((error = xfs_alloc_lookup_eq(cnt_cur, nbno, nlen, &i)))
1662                 goto error0;
1663         XFS_WANT_CORRUPTED_GOTO(i == 0, error0);
1664         if ((error = xfs_btree_insert(cnt_cur, &i)))
1665                 goto error0;
1666         XFS_WANT_CORRUPTED_GOTO(i == 1, error0);
1667         xfs_btree_del_cursor(cnt_cur, XFS_BTREE_NOERROR);
1668         cnt_cur = NULL;
1669
1670         /*
1671          * Update the freespace totals in the ag and superblock.
1672          */
1673         pag = xfs_perag_get(mp, agno);
1674         error = xfs_alloc_update_counters(tp, pag, agbp, len);
1675         xfs_perag_put(pag);
1676         if (error)
1677                 goto error0;
1678
1679         if (!isfl)
1680                 xfs_trans_mod_sb(tp, XFS_TRANS_SB_FDBLOCKS, (long)len);
1681         XFS_STATS_INC(xs_freex);
1682         XFS_STATS_ADD(xs_freeb, len);
1683
1684         trace_xfs_free_extent(mp, agno, bno, len, isfl, haveleft, haveright);
1685
1686         return 0;
1687
1688  error0:
1689         trace_xfs_free_extent(mp, agno, bno, len, isfl, -1, -1);
1690         if (bno_cur)
1691                 xfs_btree_del_cursor(bno_cur, XFS_BTREE_ERROR);
1692         if (cnt_cur)
1693                 xfs_btree_del_cursor(cnt_cur, XFS_BTREE_ERROR);
1694         return error;
1695 }
1696
1697 /*
1698  * Visible (exported) allocation/free functions.
1699  * Some of these are used just by xfs_alloc_btree.c and this file.
1700  */
1701
1702 /*
1703  * Compute and fill in value of m_ag_maxlevels.
1704  */
1705 void
1706 xfs_alloc_compute_maxlevels(
1707         xfs_mount_t     *mp)    /* file system mount structure */
1708 {
1709         int             level;
1710         uint            maxblocks;
1711         uint            maxleafents;
1712         int             minleafrecs;
1713         int             minnoderecs;
1714
1715         maxleafents = (mp->m_sb.sb_agblocks + 1) / 2;
1716         minleafrecs = mp->m_alloc_mnr[0];
1717         minnoderecs = mp->m_alloc_mnr[1];
1718         maxblocks = (maxleafents + minleafrecs - 1) / minleafrecs;
1719         for (level = 1; maxblocks > 1; level++)
1720                 maxblocks = (maxblocks + minnoderecs - 1) / minnoderecs;
1721         mp->m_ag_maxlevels = level;
1722 }
1723
1724 /*
1725  * Find the length of the longest extent in an AG.
1726  */
1727 xfs_extlen_t
1728 xfs_alloc_longest_free_extent(
1729         struct xfs_mount        *mp,
1730         struct xfs_perag        *pag)
1731 {
1732         xfs_extlen_t            need, delta = 0;
1733
1734         need = XFS_MIN_FREELIST_PAG(pag, mp);
1735         if (need > pag->pagf_flcount)
1736                 delta = need - pag->pagf_flcount;
1737
1738         if (pag->pagf_longest > delta)
1739                 return pag->pagf_longest - delta;
1740         return pag->pagf_flcount > 0 || pag->pagf_longest > 0;
1741 }
1742
1743 /*
1744  * Decide whether to use this allocation group for this allocation.
1745  * If so, fix up the btree freelist's size.
1746  */
1747 STATIC int                      /* error */
1748 xfs_alloc_fix_freelist(
1749         xfs_alloc_arg_t *args,  /* allocation argument structure */
1750         int             flags)  /* XFS_ALLOC_FLAG_... */
1751 {
1752         xfs_buf_t       *agbp;  /* agf buffer pointer */
1753         xfs_agf_t       *agf;   /* a.g. freespace structure pointer */
1754         xfs_buf_t       *agflbp;/* agfl buffer pointer */
1755         xfs_agblock_t   bno;    /* freelist block */
1756         xfs_extlen_t    delta;  /* new blocks needed in freelist */
1757         int             error;  /* error result code */
1758         xfs_extlen_t    longest;/* longest extent in allocation group */
1759         xfs_mount_t     *mp;    /* file system mount point structure */
1760         xfs_extlen_t    need;   /* total blocks needed in freelist */
1761         xfs_perag_t     *pag;   /* per-ag information structure */
1762         xfs_alloc_arg_t targs;  /* local allocation arguments */
1763         xfs_trans_t     *tp;    /* transaction pointer */
1764
1765         mp = args->mp;
1766
1767         pag = args->pag;
1768         tp = args->tp;
1769         if (!pag->pagf_init) {
1770                 if ((error = xfs_alloc_read_agf(mp, tp, args->agno, flags,
1771                                 &agbp)))
1772                         return error;
1773                 if (!pag->pagf_init) {
1774                         ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK);
1775                         ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING));
1776                         args->agbp = NULL;
1777                         return 0;
1778                 }
1779         } else
1780                 agbp = NULL;
1781
1782         /*
1783          * If this is a metadata preferred pag and we are user data
1784          * then try somewhere else if we are not being asked to
1785          * try harder at this point
1786          */
1787         if (pag->pagf_metadata && args->userdata &&
1788             (flags & XFS_ALLOC_FLAG_TRYLOCK)) {
1789                 ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING));
1790                 args->agbp = NULL;
1791                 return 0;
1792         }
1793
1794         if (!(flags & XFS_ALLOC_FLAG_FREEING)) {
1795                 /*
1796                  * If it looks like there isn't a long enough extent, or enough
1797                  * total blocks, reject it.
1798                  */
1799                 need = XFS_MIN_FREELIST_PAG(pag, mp);
1800                 longest = xfs_alloc_longest_free_extent(mp, pag);
1801                 if ((args->minlen + args->alignment + args->minalignslop - 1) >
1802                                 longest ||
1803                     ((int)(pag->pagf_freeblks + pag->pagf_flcount -
1804                            need - args->total) < (int)args->minleft)) {
1805                         if (agbp)
1806                                 xfs_trans_brelse(tp, agbp);
1807                         args->agbp = NULL;
1808                         return 0;
1809                 }
1810         }
1811
1812         /*
1813          * Get the a.g. freespace buffer.
1814          * Can fail if we're not blocking on locks, and it's held.
1815          */
1816         if (agbp == NULL) {
1817                 if ((error = xfs_alloc_read_agf(mp, tp, args->agno, flags,
1818                                 &agbp)))
1819                         return error;
1820                 if (agbp == NULL) {
1821                         ASSERT(flags & XFS_ALLOC_FLAG_TRYLOCK);
1822                         ASSERT(!(flags & XFS_ALLOC_FLAG_FREEING));
1823                         args->agbp = NULL;
1824                         return 0;
1825                 }
1826         }
1827         /*
1828          * Figure out how many blocks we should have in the freelist.
1829          */
1830         agf = XFS_BUF_TO_AGF(agbp);
1831         need = XFS_MIN_FREELIST(agf, mp);
1832         /*
1833          * If there isn't enough total or single-extent, reject it.
1834          */
1835         if (!(flags & XFS_ALLOC_FLAG_FREEING)) {
1836                 delta = need > be32_to_cpu(agf->agf_flcount) ?
1837                         (need - be32_to_cpu(agf->agf_flcount)) : 0;
1838                 longest = be32_to_cpu(agf->agf_longest);
1839                 longest = (longest > delta) ? (longest - delta) :
1840                         (be32_to_cpu(agf->agf_flcount) > 0 || longest > 0);
1841                 if ((args->minlen + args->alignment + args->minalignslop - 1) >
1842                                 longest ||
1843                     ((int)(be32_to_cpu(agf->agf_freeblks) +
1844                      be32_to_cpu(agf->agf_flcount) - need - args->total) <
1845                                 (int)args->minleft)) {
1846                         xfs_trans_brelse(tp, agbp);
1847                         args->agbp = NULL;
1848                         return 0;
1849                 }
1850         }
1851         /*
1852          * Make the freelist shorter if it's too long.
1853          */
1854         while (be32_to_cpu(agf->agf_flcount) > need) {
1855                 xfs_buf_t       *bp;
1856
1857                 error = xfs_alloc_get_freelist(tp, agbp, &bno, 0);
1858                 if (error)
1859                         return error;
1860                 if ((error = xfs_free_ag_extent(tp, agbp, args->agno, bno, 1, 1)))
1861                         return error;
1862                 bp = xfs_btree_get_bufs(mp, tp, args->agno, bno, 0);
1863                 xfs_trans_binval(tp, bp);
1864         }
1865         /*
1866          * Initialize the args structure.
1867          */
1868         targs.tp = tp;
1869         targs.mp = mp;
1870         targs.agbp = agbp;
1871         targs.agno = args->agno;
1872         targs.mod = targs.minleft = targs.wasdel = targs.userdata =
1873                 targs.minalignslop = 0;
1874         targs.alignment = targs.minlen = targs.prod = targs.isfl = 1;
1875         targs.type = XFS_ALLOCTYPE_THIS_AG;
1876         targs.pag = pag;
1877         if ((error = xfs_alloc_read_agfl(mp, tp, targs.agno, &agflbp)))
1878                 return error;
1879         /*
1880          * Make the freelist longer if it's too short.
1881          */
1882         while (be32_to_cpu(agf->agf_flcount) < need) {
1883                 targs.agbno = 0;
1884                 targs.maxlen = need - be32_to_cpu(agf->agf_flcount);
1885                 /*
1886                  * Allocate as many blocks as possible at once.
1887                  */
1888                 if ((error = xfs_alloc_ag_vextent(&targs))) {
1889                         xfs_trans_brelse(tp, agflbp);
1890                         return error;
1891                 }
1892                 /*
1893                  * Stop if we run out.  Won't happen if callers are obeying
1894                  * the restrictions correctly.  Can happen for free calls
1895                  * on a completely full ag.
1896                  */
1897                 if (targs.agbno == NULLAGBLOCK) {
1898                         if (flags & XFS_ALLOC_FLAG_FREEING)
1899                                 break;
1900                         xfs_trans_brelse(tp, agflbp);
1901                         args->agbp = NULL;
1902                         return 0;
1903                 }
1904                 /*
1905                  * Put each allocated block on the list.
1906                  */
1907                 for (bno = targs.agbno; bno < targs.agbno + targs.len; bno++) {
1908                         error = xfs_alloc_put_freelist(tp, agbp,
1909                                                         agflbp, bno, 0);
1910                         if (error)
1911                                 return error;
1912                 }
1913         }
1914         xfs_trans_brelse(tp, agflbp);
1915         args->agbp = agbp;
1916         return 0;
1917 }
1918
1919 /*
1920  * Get a block from the freelist.
1921  * Returns with the buffer for the block gotten.
1922  */
1923 int                             /* error */
1924 xfs_alloc_get_freelist(
1925         xfs_trans_t     *tp,    /* transaction pointer */
1926         xfs_buf_t       *agbp,  /* buffer containing the agf structure */
1927         xfs_agblock_t   *bnop,  /* block address retrieved from freelist */
1928         int             btreeblk) /* destination is a AGF btree */
1929 {
1930         xfs_agf_t       *agf;   /* a.g. freespace structure */
1931         xfs_agfl_t      *agfl;  /* a.g. freelist structure */
1932         xfs_buf_t       *agflbp;/* buffer for a.g. freelist structure */
1933         xfs_agblock_t   bno;    /* block number returned */
1934         int             error;
1935         int             logflags;
1936         xfs_mount_t     *mp;    /* mount structure */
1937         xfs_perag_t     *pag;   /* per allocation group data */
1938
1939         agf = XFS_BUF_TO_AGF(agbp);
1940         /*
1941          * Freelist is empty, give up.
1942          */
1943         if (!agf->agf_flcount) {
1944                 *bnop = NULLAGBLOCK;
1945                 return 0;
1946         }
1947         /*
1948          * Read the array of free blocks.
1949          */
1950         mp = tp->t_mountp;
1951         if ((error = xfs_alloc_read_agfl(mp, tp,
1952                         be32_to_cpu(agf->agf_seqno), &agflbp)))
1953                 return error;
1954         agfl = XFS_BUF_TO_AGFL(agflbp);
1955         /*
1956          * Get the block number and update the data structures.
1957          */
1958         bno = be32_to_cpu(agfl->agfl_bno[be32_to_cpu(agf->agf_flfirst)]);
1959         be32_add_cpu(&agf->agf_flfirst, 1);
1960         xfs_trans_brelse(tp, agflbp);
1961         if (be32_to_cpu(agf->agf_flfirst) == XFS_AGFL_SIZE(mp))
1962                 agf->agf_flfirst = 0;
1963
1964         pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno));
1965         be32_add_cpu(&agf->agf_flcount, -1);
1966         xfs_trans_agflist_delta(tp, -1);
1967         pag->pagf_flcount--;
1968         xfs_perag_put(pag);
1969
1970         logflags = XFS_AGF_FLFIRST | XFS_AGF_FLCOUNT;
1971         if (btreeblk) {
1972                 be32_add_cpu(&agf->agf_btreeblks, 1);
1973                 pag->pagf_btreeblks++;
1974                 logflags |= XFS_AGF_BTREEBLKS;
1975         }
1976
1977         xfs_alloc_log_agf(tp, agbp, logflags);
1978         *bnop = bno;
1979
1980         return 0;
1981 }
1982
1983 /*
1984  * Log the given fields from the agf structure.
1985  */
1986 void
1987 xfs_alloc_log_agf(
1988         xfs_trans_t     *tp,    /* transaction pointer */
1989         xfs_buf_t       *bp,    /* buffer for a.g. freelist header */
1990         int             fields) /* mask of fields to be logged (XFS_AGF_...) */
1991 {
1992         int     first;          /* first byte offset */
1993         int     last;           /* last byte offset */
1994         static const short      offsets[] = {
1995                 offsetof(xfs_agf_t, agf_magicnum),
1996                 offsetof(xfs_agf_t, agf_versionnum),
1997                 offsetof(xfs_agf_t, agf_seqno),
1998                 offsetof(xfs_agf_t, agf_length),
1999                 offsetof(xfs_agf_t, agf_roots[0]),
2000                 offsetof(xfs_agf_t, agf_levels[0]),
2001                 offsetof(xfs_agf_t, agf_flfirst),
2002                 offsetof(xfs_agf_t, agf_fllast),
2003                 offsetof(xfs_agf_t, agf_flcount),
2004                 offsetof(xfs_agf_t, agf_freeblks),
2005                 offsetof(xfs_agf_t, agf_longest),
2006                 offsetof(xfs_agf_t, agf_btreeblks),
2007                 sizeof(xfs_agf_t)
2008         };
2009
2010         trace_xfs_agf(tp->t_mountp, XFS_BUF_TO_AGF(bp), fields, _RET_IP_);
2011
2012         xfs_btree_offsets(fields, offsets, XFS_AGF_NUM_BITS, &first, &last);
2013         xfs_trans_log_buf(tp, bp, (uint)first, (uint)last);
2014 }
2015
2016 /*
2017  * Interface for inode allocation to force the pag data to be initialized.
2018  */
2019 int                                     /* error */
2020 xfs_alloc_pagf_init(
2021         xfs_mount_t             *mp,    /* file system mount structure */
2022         xfs_trans_t             *tp,    /* transaction pointer */
2023         xfs_agnumber_t          agno,   /* allocation group number */
2024         int                     flags)  /* XFS_ALLOC_FLAGS_... */
2025 {
2026         xfs_buf_t               *bp;
2027         int                     error;
2028
2029         if ((error = xfs_alloc_read_agf(mp, tp, agno, flags, &bp)))
2030                 return error;
2031         if (bp)
2032                 xfs_trans_brelse(tp, bp);
2033         return 0;
2034 }
2035
2036 /*
2037  * Put the block on the freelist for the allocation group.
2038  */
2039 int                                     /* error */
2040 xfs_alloc_put_freelist(
2041         xfs_trans_t             *tp,    /* transaction pointer */
2042         xfs_buf_t               *agbp,  /* buffer for a.g. freelist header */
2043         xfs_buf_t               *agflbp,/* buffer for a.g. free block array */
2044         xfs_agblock_t           bno,    /* block being freed */
2045         int                     btreeblk) /* block came from a AGF btree */
2046 {
2047         xfs_agf_t               *agf;   /* a.g. freespace structure */
2048         xfs_agfl_t              *agfl;  /* a.g. free block array */
2049         __be32                  *blockp;/* pointer to array entry */
2050         int                     error;
2051         int                     logflags;
2052         xfs_mount_t             *mp;    /* mount structure */
2053         xfs_perag_t             *pag;   /* per allocation group data */
2054
2055         agf = XFS_BUF_TO_AGF(agbp);
2056         mp = tp->t_mountp;
2057
2058         if (!agflbp && (error = xfs_alloc_read_agfl(mp, tp,
2059                         be32_to_cpu(agf->agf_seqno), &agflbp)))
2060                 return error;
2061         agfl = XFS_BUF_TO_AGFL(agflbp);
2062         be32_add_cpu(&agf->agf_fllast, 1);
2063         if (be32_to_cpu(agf->agf_fllast) == XFS_AGFL_SIZE(mp))
2064                 agf->agf_fllast = 0;
2065
2066         pag = xfs_perag_get(mp, be32_to_cpu(agf->agf_seqno));
2067         be32_add_cpu(&agf->agf_flcount, 1);
2068         xfs_trans_agflist_delta(tp, 1);
2069         pag->pagf_flcount++;
2070
2071         logflags = XFS_AGF_FLLAST | XFS_AGF_FLCOUNT;
2072         if (btreeblk) {
2073                 be32_add_cpu(&agf->agf_btreeblks, -1);
2074                 pag->pagf_btreeblks--;
2075                 logflags |= XFS_AGF_BTREEBLKS;
2076         }
2077         xfs_perag_put(pag);
2078
2079         xfs_alloc_log_agf(tp, agbp, logflags);
2080
2081         ASSERT(be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp));
2082         blockp = &agfl->agfl_bno[be32_to_cpu(agf->agf_fllast)];
2083         *blockp = cpu_to_be32(bno);
2084         xfs_alloc_log_agf(tp, agbp, logflags);
2085         xfs_trans_log_buf(tp, agflbp,
2086                 (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl),
2087                 (int)((xfs_caddr_t)blockp - (xfs_caddr_t)agfl +
2088                         sizeof(xfs_agblock_t) - 1));
2089         return 0;
2090 }
2091
2092 /*
2093  * Read in the allocation group header (free/alloc section).
2094  */
2095 int                                     /* error */
2096 xfs_read_agf(
2097         struct xfs_mount        *mp,    /* mount point structure */
2098         struct xfs_trans        *tp,    /* transaction pointer */
2099         xfs_agnumber_t          agno,   /* allocation group number */
2100         int                     flags,  /* XFS_BUF_ */
2101         struct xfs_buf          **bpp)  /* buffer for the ag freelist header */
2102 {
2103         struct xfs_agf  *agf;           /* ag freelist header */
2104         int             agf_ok;         /* set if agf is consistent */
2105         int             error;
2106
2107         ASSERT(agno != NULLAGNUMBER);
2108         error = xfs_trans_read_buf(
2109                         mp, tp, mp->m_ddev_targp,
2110                         XFS_AG_DADDR(mp, agno, XFS_AGF_DADDR(mp)),
2111                         XFS_FSS_TO_BB(mp, 1), flags, bpp);
2112         if (error)
2113                 return error;
2114         if (!*bpp)
2115                 return 0;
2116
2117         ASSERT(!(*bpp)->b_error);
2118         agf = XFS_BUF_TO_AGF(*bpp);
2119
2120         /*
2121          * Validate the magic number of the agf block.
2122          */
2123         agf_ok =
2124                 agf->agf_magicnum == cpu_to_be32(XFS_AGF_MAGIC) &&
2125                 XFS_AGF_GOOD_VERSION(be32_to_cpu(agf->agf_versionnum)) &&
2126                 be32_to_cpu(agf->agf_freeblks) <= be32_to_cpu(agf->agf_length) &&
2127                 be32_to_cpu(agf->agf_flfirst) < XFS_AGFL_SIZE(mp) &&
2128                 be32_to_cpu(agf->agf_fllast) < XFS_AGFL_SIZE(mp) &&
2129                 be32_to_cpu(agf->agf_flcount) <= XFS_AGFL_SIZE(mp) &&
2130                 be32_to_cpu(agf->agf_seqno) == agno;
2131         if (xfs_sb_version_haslazysbcount(&mp->m_sb))
2132                 agf_ok = agf_ok && be32_to_cpu(agf->agf_btreeblks) <=
2133                                                 be32_to_cpu(agf->agf_length);
2134         if (unlikely(XFS_TEST_ERROR(!agf_ok, mp, XFS_ERRTAG_ALLOC_READ_AGF,
2135                         XFS_RANDOM_ALLOC_READ_AGF))) {
2136                 XFS_CORRUPTION_ERROR("xfs_alloc_read_agf",
2137                                      XFS_ERRLEVEL_LOW, mp, agf);
2138                 xfs_trans_brelse(tp, *bpp);
2139                 return XFS_ERROR(EFSCORRUPTED);
2140         }
2141         xfs_buf_set_ref(*bpp, XFS_AGF_REF);
2142         return 0;
2143 }
2144
2145 /*
2146  * Read in the allocation group header (free/alloc section).
2147  */
2148 int                                     /* error */
2149 xfs_alloc_read_agf(
2150         struct xfs_mount        *mp,    /* mount point structure */
2151         struct xfs_trans        *tp,    /* transaction pointer */
2152         xfs_agnumber_t          agno,   /* allocation group number */
2153         int                     flags,  /* XFS_ALLOC_FLAG_... */
2154         struct xfs_buf          **bpp)  /* buffer for the ag freelist header */
2155 {
2156         struct xfs_agf          *agf;           /* ag freelist header */
2157         struct xfs_perag        *pag;           /* per allocation group data */
2158         int                     error;
2159
2160         ASSERT(agno != NULLAGNUMBER);
2161
2162         error = xfs_read_agf(mp, tp, agno,
2163                         (flags & XFS_ALLOC_FLAG_TRYLOCK) ? XBF_TRYLOCK : 0,
2164                         bpp);
2165         if (error)
2166                 return error;
2167         if (!*bpp)
2168                 return 0;
2169         ASSERT(!(*bpp)->b_error);
2170
2171         agf = XFS_BUF_TO_AGF(*bpp);
2172         pag = xfs_perag_get(mp, agno);
2173         if (!pag->pagf_init) {
2174                 pag->pagf_freeblks = be32_to_cpu(agf->agf_freeblks);
2175                 pag->pagf_btreeblks = be32_to_cpu(agf->agf_btreeblks);
2176                 pag->pagf_flcount = be32_to_cpu(agf->agf_flcount);
2177                 pag->pagf_longest = be32_to_cpu(agf->agf_longest);
2178                 pag->pagf_levels[XFS_BTNUM_BNOi] =
2179                         be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi]);
2180                 pag->pagf_levels[XFS_BTNUM_CNTi] =
2181                         be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]);
2182                 spin_lock_init(&pag->pagb_lock);
2183                 pag->pagb_count = 0;
2184                 pag->pagb_tree = RB_ROOT;
2185                 pag->pagf_init = 1;
2186         }
2187 #ifdef DEBUG
2188         else if (!XFS_FORCED_SHUTDOWN(mp)) {
2189                 ASSERT(pag->pagf_freeblks == be32_to_cpu(agf->agf_freeblks));
2190                 ASSERT(pag->pagf_btreeblks == be32_to_cpu(agf->agf_btreeblks));
2191                 ASSERT(pag->pagf_flcount == be32_to_cpu(agf->agf_flcount));
2192                 ASSERT(pag->pagf_longest == be32_to_cpu(agf->agf_longest));
2193                 ASSERT(pag->pagf_levels[XFS_BTNUM_BNOi] ==
2194                        be32_to_cpu(agf->agf_levels[XFS_BTNUM_BNOi]));
2195                 ASSERT(pag->pagf_levels[XFS_BTNUM_CNTi] ==
2196                        be32_to_cpu(agf->agf_levels[XFS_BTNUM_CNTi]));
2197         }
2198 #endif
2199         xfs_perag_put(pag);
2200         return 0;
2201 }
2202
2203 /*
2204  * Allocate an extent (variable-size).
2205  * Depending on the allocation type, we either look in a single allocation
2206  * group or loop over the allocation groups to find the result.
2207  */
2208 int                             /* error */
2209 __xfs_alloc_vextent(
2210         xfs_alloc_arg_t *args)  /* allocation argument structure */
2211 {
2212         xfs_agblock_t   agsize; /* allocation group size */
2213         int             error;
2214         int             flags;  /* XFS_ALLOC_FLAG_... locking flags */
2215         xfs_extlen_t    minleft;/* minimum left value, temp copy */
2216         xfs_mount_t     *mp;    /* mount structure pointer */
2217         xfs_agnumber_t  sagno;  /* starting allocation group number */
2218         xfs_alloctype_t type;   /* input allocation type */
2219         int             bump_rotor = 0;
2220         int             no_min = 0;
2221         xfs_agnumber_t  rotorstep = xfs_rotorstep; /* inode32 agf stepper */
2222
2223         mp = args->mp;
2224         type = args->otype = args->type;
2225         args->agbno = NULLAGBLOCK;
2226         /*
2227          * Just fix this up, for the case where the last a.g. is shorter
2228          * (or there's only one a.g.) and the caller couldn't easily figure
2229          * that out (xfs_bmap_alloc).
2230          */
2231         agsize = mp->m_sb.sb_agblocks;
2232         if (args->maxlen > agsize)
2233                 args->maxlen = agsize;
2234         if (args->alignment == 0)
2235                 args->alignment = 1;
2236         ASSERT(XFS_FSB_TO_AGNO(mp, args->fsbno) < mp->m_sb.sb_agcount);
2237         ASSERT(XFS_FSB_TO_AGBNO(mp, args->fsbno) < agsize);
2238         ASSERT(args->minlen <= args->maxlen);
2239         ASSERT(args->minlen <= agsize);
2240         ASSERT(args->mod < args->prod);
2241         if (XFS_FSB_TO_AGNO(mp, args->fsbno) >= mp->m_sb.sb_agcount ||
2242             XFS_FSB_TO_AGBNO(mp, args->fsbno) >= agsize ||
2243             args->minlen > args->maxlen || args->minlen > agsize ||
2244             args->mod >= args->prod) {
2245                 args->fsbno = NULLFSBLOCK;
2246                 trace_xfs_alloc_vextent_badargs(args);
2247                 return 0;
2248         }
2249         minleft = args->minleft;
2250
2251         switch (type) {
2252         case XFS_ALLOCTYPE_THIS_AG:
2253         case XFS_ALLOCTYPE_NEAR_BNO:
2254         case XFS_ALLOCTYPE_THIS_BNO:
2255                 /*
2256                  * These three force us into a single a.g.
2257                  */
2258                 args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
2259                 args->pag = xfs_perag_get(mp, args->agno);
2260                 args->minleft = 0;
2261                 error = xfs_alloc_fix_freelist(args, 0);
2262                 args->minleft = minleft;
2263                 if (error) {
2264                         trace_xfs_alloc_vextent_nofix(args);
2265                         goto error0;
2266                 }
2267                 if (!args->agbp) {
2268                         trace_xfs_alloc_vextent_noagbp(args);
2269                         break;
2270                 }
2271                 args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
2272                 if ((error = xfs_alloc_ag_vextent(args)))
2273                         goto error0;
2274                 break;
2275         case XFS_ALLOCTYPE_START_BNO:
2276                 /*
2277                  * Try near allocation first, then anywhere-in-ag after
2278                  * the first a.g. fails.
2279                  */
2280                 if ((args->userdata  == XFS_ALLOC_INITIAL_USER_DATA) &&
2281                     (mp->m_flags & XFS_MOUNT_32BITINODES)) {
2282                         args->fsbno = XFS_AGB_TO_FSB(mp,
2283                                         ((mp->m_agfrotor / rotorstep) %
2284                                         mp->m_sb.sb_agcount), 0);
2285                         bump_rotor = 1;
2286                 }
2287                 args->agbno = XFS_FSB_TO_AGBNO(mp, args->fsbno);
2288                 args->type = XFS_ALLOCTYPE_NEAR_BNO;
2289                 /* FALLTHROUGH */
2290         case XFS_ALLOCTYPE_ANY_AG:
2291         case XFS_ALLOCTYPE_START_AG:
2292         case XFS_ALLOCTYPE_FIRST_AG:
2293                 /*
2294                  * Rotate through the allocation groups looking for a winner.
2295                  */
2296                 if (type == XFS_ALLOCTYPE_ANY_AG) {
2297                         /*
2298                          * Start with the last place we left off.
2299                          */
2300                         args->agno = sagno = (mp->m_agfrotor / rotorstep) %
2301                                         mp->m_sb.sb_agcount;
2302                         args->type = XFS_ALLOCTYPE_THIS_AG;
2303                         flags = XFS_ALLOC_FLAG_TRYLOCK;
2304                 } else if (type == XFS_ALLOCTYPE_FIRST_AG) {
2305                         /*
2306                          * Start with allocation group given by bno.
2307                          */
2308                         args->agno = XFS_FSB_TO_AGNO(mp, args->fsbno);
2309                         args->type = XFS_ALLOCTYPE_THIS_AG;
2310                         sagno = 0;
2311                         flags = 0;
2312                 } else {
2313                         if (type == XFS_ALLOCTYPE_START_AG)
2314                                 args->type = XFS_ALLOCTYPE_THIS_AG;
2315                         /*
2316                          * Start with the given allocation group.
2317                          */
2318                         args->agno = sagno = XFS_FSB_TO_AGNO(mp, args->fsbno);
2319                         flags = XFS_ALLOC_FLAG_TRYLOCK;
2320                 }
2321                 /*
2322                  * Loop over allocation groups twice; first time with
2323                  * trylock set, second time without.
2324                  */
2325                 for (;;) {
2326                         args->pag = xfs_perag_get(mp, args->agno);
2327                         if (no_min) args->minleft = 0;
2328                         error = xfs_alloc_fix_freelist(args, flags);
2329                         args->minleft = minleft;
2330                         if (error) {
2331                                 trace_xfs_alloc_vextent_nofix(args);
2332                                 goto error0;
2333                         }
2334                         /*
2335                          * If we get a buffer back then the allocation will fly.
2336                          */
2337                         if (args->agbp) {
2338                                 if ((error = xfs_alloc_ag_vextent(args)))
2339                                         goto error0;
2340                                 break;
2341                         }
2342
2343                         trace_xfs_alloc_vextent_loopfailed(args);
2344
2345                         /*
2346                          * Didn't work, figure out the next iteration.
2347                          */
2348                         if (args->agno == sagno &&
2349                             type == XFS_ALLOCTYPE_START_BNO)
2350                                 args->type = XFS_ALLOCTYPE_THIS_AG;
2351                         /*
2352                         * For the first allocation, we can try any AG to get
2353                         * space.  However, if we already have allocated a
2354                         * block, we don't want to try AGs whose number is below
2355                         * sagno. Otherwise, we may end up with out-of-order
2356                         * locking of AGF, which might cause deadlock.
2357                         */
2358                         if (++(args->agno) == mp->m_sb.sb_agcount) {
2359                                 if (args->firstblock != NULLFSBLOCK)
2360                                         args->agno = sagno;
2361                                 else
2362                                         args->agno = 0;
2363                         }
2364                         /*
2365                          * Reached the starting a.g., must either be done
2366                          * or switch to non-trylock mode.
2367                          */
2368                         if (args->agno == sagno) {
2369                                 if (no_min == 1) {
2370                                         args->agbno = NULLAGBLOCK;
2371                                         trace_xfs_alloc_vextent_allfailed(args);
2372                                         break;
2373                                 }
2374                                 if (flags == 0) {
2375                                         no_min = 1;
2376                                 } else {
2377                                         flags = 0;
2378                                         if (type == XFS_ALLOCTYPE_START_BNO) {
2379                                                 args->agbno = XFS_FSB_TO_AGBNO(mp,
2380                                                         args->fsbno);
2381                                                 args->type = XFS_ALLOCTYPE_NEAR_BNO;
2382                                         }
2383                                 }
2384                         }
2385                         xfs_perag_put(args->pag);
2386                 }
2387                 if (bump_rotor || (type == XFS_ALLOCTYPE_ANY_AG)) {
2388                         if (args->agno == sagno)
2389                                 mp->m_agfrotor = (mp->m_agfrotor + 1) %
2390                                         (mp->m_sb.sb_agcount * rotorstep);
2391                         else
2392                                 mp->m_agfrotor = (args->agno * rotorstep + 1) %
2393                                         (mp->m_sb.sb_agcount * rotorstep);
2394                 }
2395                 break;
2396         default:
2397                 ASSERT(0);
2398                 /* NOTREACHED */
2399         }
2400         if (args->agbno == NULLAGBLOCK)
2401                 args->fsbno = NULLFSBLOCK;
2402         else {
2403                 args->fsbno = XFS_AGB_TO_FSB(mp, args->agno, args->agbno);
2404 #ifdef DEBUG
2405                 ASSERT(args->len >= args->minlen);
2406                 ASSERT(args->len <= args->maxlen);
2407                 ASSERT(args->agbno % args->alignment == 0);
2408                 XFS_AG_CHECK_DADDR(mp, XFS_FSB_TO_DADDR(mp, args->fsbno),
2409                         args->len);
2410 #endif
2411         }
2412         xfs_perag_put(args->pag);
2413         return 0;
2414 error0:
2415         xfs_perag_put(args->pag);
2416         return error;
2417 }
2418
2419 static void
2420 xfs_alloc_vextent_worker(
2421         struct work_struct      *work)
2422 {
2423         struct xfs_alloc_arg    *args = container_of(work,
2424                                                 struct xfs_alloc_arg, work);
2425         unsigned long           pflags;
2426
2427         /* we are in a transaction context here */
2428         current_set_flags_nested(&pflags, PF_FSTRANS);
2429
2430         args->result = __xfs_alloc_vextent(args);
2431         complete(args->done);
2432
2433         current_restore_flags_nested(&pflags, PF_FSTRANS);
2434 }
2435
2436
2437 int                             /* error */
2438 xfs_alloc_vextent(
2439         xfs_alloc_arg_t *args)  /* allocation argument structure */
2440 {
2441         DECLARE_COMPLETION_ONSTACK(done);
2442
2443         args->done = &done;
2444         INIT_WORK(&args->work, xfs_alloc_vextent_worker);
2445         queue_work(xfs_alloc_wq, &args->work);
2446         wait_for_completion(&done);
2447         return args->result;
2448 }
2449
2450 /*
2451  * Free an extent.
2452  * Just break up the extent address and hand off to xfs_free_ag_extent
2453  * after fixing up the freelist.
2454  */
2455 int                             /* error */
2456 xfs_free_extent(
2457         xfs_trans_t     *tp,    /* transaction pointer */
2458         xfs_fsblock_t   bno,    /* starting block number of extent */
2459         xfs_extlen_t    len)    /* length of extent */
2460 {
2461         xfs_alloc_arg_t args;
2462         int             error;
2463
2464         ASSERT(len != 0);
2465         memset(&args, 0, sizeof(xfs_alloc_arg_t));
2466         args.tp = tp;
2467         args.mp = tp->t_mountp;
2468
2469         /*
2470          * validate that the block number is legal - the enables us to detect
2471          * and handle a silent filesystem corruption rather than crashing.
2472          */
2473         args.agno = XFS_FSB_TO_AGNO(args.mp, bno);
2474         if (args.agno >= args.mp->m_sb.sb_agcount)
2475                 return EFSCORRUPTED;
2476
2477         args.agbno = XFS_FSB_TO_AGBNO(args.mp, bno);
2478         if (args.agbno >= args.mp->m_sb.sb_agblocks)
2479                 return EFSCORRUPTED;
2480
2481         args.pag = xfs_perag_get(args.mp, args.agno);
2482         ASSERT(args.pag);
2483
2484         error = xfs_alloc_fix_freelist(&args, XFS_ALLOC_FLAG_FREEING);
2485         if (error)
2486                 goto error0;
2487
2488         /* validate the extent size is legal now we have the agf locked */
2489         if (args.agbno + len >
2490                         be32_to_cpu(XFS_BUF_TO_AGF(args.agbp)->agf_length)) {
2491                 error = EFSCORRUPTED;
2492                 goto error0;
2493         }
2494
2495         error = xfs_free_ag_extent(tp, args.agbp, args.agno, args.agbno, len, 0);
2496         if (!error)
2497                 xfs_extent_busy_insert(tp, args.agno, args.agbno, len, 0);
2498 error0:
2499         xfs_perag_put(args.pag);
2500         return error;
2501 }