xfs: detect misaligned rtinherit directory extent size hints
[linux-2.6-microblaze.git] / fs / xfs / xfs_iwalk.c
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2019 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <darrick.wong@oracle.com>
5  */
6 #include "xfs.h"
7 #include "xfs_fs.h"
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_log_format.h"
11 #include "xfs_trans_resv.h"
12 #include "xfs_mount.h"
13 #include "xfs_inode.h"
14 #include "xfs_btree.h"
15 #include "xfs_ialloc.h"
16 #include "xfs_ialloc_btree.h"
17 #include "xfs_iwalk.h"
18 #include "xfs_error.h"
19 #include "xfs_trace.h"
20 #include "xfs_icache.h"
21 #include "xfs_health.h"
22 #include "xfs_trans.h"
23 #include "xfs_pwork.h"
24 #include "xfs_ag.h"
25
26 /*
27  * Walking Inodes in the Filesystem
28  * ================================
29  *
30  * This iterator function walks a subset of filesystem inodes in increasing
31  * order from @startino until there are no more inodes.  For each allocated
32  * inode it finds, it calls a walk function with the relevant inode number and
33  * a pointer to caller-provided data.  The walk function can return the usual
34  * negative error code to stop the iteration; 0 to continue the iteration; or
35  * -ECANCELED to stop the iteration.  This return value is returned to the
36  * caller.
37  *
38  * Internally, we allow the walk function to do anything, which means that we
39  * cannot maintain the inobt cursor or our lock on the AGI buffer.  We
40  * therefore cache the inobt records in kernel memory and only call the walk
41  * function when our memory buffer is full.  @nr_recs is the number of records
42  * that we've cached, and @sz_recs is the size of our cache.
43  *
44  * It is the responsibility of the walk function to ensure it accesses
45  * allocated inodes, as the inobt records may be stale by the time they are
46  * acted upon.
47  */
48
49 struct xfs_iwalk_ag {
50         /* parallel work control data; will be null if single threaded */
51         struct xfs_pwork                pwork;
52
53         struct xfs_mount                *mp;
54         struct xfs_trans                *tp;
55         struct xfs_perag                *pag;
56
57         /* Where do we start the traversal? */
58         xfs_ino_t                       startino;
59
60         /* What was the last inode number we saw when iterating the inobt? */
61         xfs_ino_t                       lastino;
62
63         /* Array of inobt records we cache. */
64         struct xfs_inobt_rec_incore     *recs;
65
66         /* Number of entries allocated for the @recs array. */
67         unsigned int                    sz_recs;
68
69         /* Number of entries in the @recs array that are in use. */
70         unsigned int                    nr_recs;
71
72         /* Inode walk function and data pointer. */
73         xfs_iwalk_fn                    iwalk_fn;
74         xfs_inobt_walk_fn               inobt_walk_fn;
75         void                            *data;
76
77         /*
78          * Make it look like the inodes up to startino are free so that
79          * bulkstat can start its inode iteration at the correct place without
80          * needing to special case everywhere.
81          */
82         unsigned int                    trim_start:1;
83
84         /* Skip empty inobt records? */
85         unsigned int                    skip_empty:1;
86 };
87
88 /*
89  * Loop over all clusters in a chunk for a given incore inode allocation btree
90  * record.  Do a readahead if there are any allocated inodes in that cluster.
91  */
92 STATIC void
93 xfs_iwalk_ichunk_ra(
94         struct xfs_mount                *mp,
95         struct xfs_perag                *pag,
96         struct xfs_inobt_rec_incore     *irec)
97 {
98         struct xfs_ino_geometry         *igeo = M_IGEO(mp);
99         xfs_agblock_t                   agbno;
100         struct blk_plug                 plug;
101         int                             i;      /* inode chunk index */
102
103         agbno = XFS_AGINO_TO_AGBNO(mp, irec->ir_startino);
104
105         blk_start_plug(&plug);
106         for (i = 0; i < XFS_INODES_PER_CHUNK; i += igeo->inodes_per_cluster) {
107                 xfs_inofree_t   imask;
108
109                 imask = xfs_inobt_maskn(i, igeo->inodes_per_cluster);
110                 if (imask & ~irec->ir_free) {
111                         xfs_btree_reada_bufs(mp, pag->pag_agno, agbno,
112                                         igeo->blocks_per_cluster,
113                                         &xfs_inode_buf_ops);
114                 }
115                 agbno += igeo->blocks_per_cluster;
116         }
117         blk_finish_plug(&plug);
118 }
119
120 /*
121  * Set the bits in @irec's free mask that correspond to the inodes before
122  * @agino so that we skip them.  This is how we restart an inode walk that was
123  * interrupted in the middle of an inode record.
124  */
125 STATIC void
126 xfs_iwalk_adjust_start(
127         xfs_agino_t                     agino,  /* starting inode of chunk */
128         struct xfs_inobt_rec_incore     *irec)  /* btree record */
129 {
130         int                             idx;    /* index into inode chunk */
131         int                             i;
132
133         idx = agino - irec->ir_startino;
134
135         /*
136          * We got a right chunk with some left inodes allocated at it.  Grab
137          * the chunk record.  Mark all the uninteresting inodes free because
138          * they're before our start point.
139          */
140         for (i = 0; i < idx; i++) {
141                 if (XFS_INOBT_MASK(i) & ~irec->ir_free)
142                         irec->ir_freecount++;
143         }
144
145         irec->ir_free |= xfs_inobt_maskn(0, idx);
146 }
147
148 /* Allocate memory for a walk. */
149 STATIC int
150 xfs_iwalk_alloc(
151         struct xfs_iwalk_ag     *iwag)
152 {
153         size_t                  size;
154
155         ASSERT(iwag->recs == NULL);
156         iwag->nr_recs = 0;
157
158         /* Allocate a prefetch buffer for inobt records. */
159         size = iwag->sz_recs * sizeof(struct xfs_inobt_rec_incore);
160         iwag->recs = kmem_alloc(size, KM_MAYFAIL);
161         if (iwag->recs == NULL)
162                 return -ENOMEM;
163
164         return 0;
165 }
166
167 /* Free memory we allocated for a walk. */
168 STATIC void
169 xfs_iwalk_free(
170         struct xfs_iwalk_ag     *iwag)
171 {
172         kmem_free(iwag->recs);
173         iwag->recs = NULL;
174 }
175
176 /* For each inuse inode in each cached inobt record, call our function. */
177 STATIC int
178 xfs_iwalk_ag_recs(
179         struct xfs_iwalk_ag     *iwag)
180 {
181         struct xfs_mount        *mp = iwag->mp;
182         struct xfs_trans        *tp = iwag->tp;
183         struct xfs_perag        *pag = iwag->pag;
184         xfs_ino_t               ino;
185         unsigned int            i, j;
186         int                     error;
187
188         for (i = 0; i < iwag->nr_recs; i++) {
189                 struct xfs_inobt_rec_incore     *irec = &iwag->recs[i];
190
191                 trace_xfs_iwalk_ag_rec(mp, pag->pag_agno, irec);
192
193                 if (xfs_pwork_want_abort(&iwag->pwork))
194                         return 0;
195
196                 if (iwag->inobt_walk_fn) {
197                         error = iwag->inobt_walk_fn(mp, tp, pag->pag_agno, irec,
198                                         iwag->data);
199                         if (error)
200                                 return error;
201                 }
202
203                 if (!iwag->iwalk_fn)
204                         continue;
205
206                 for (j = 0; j < XFS_INODES_PER_CHUNK; j++) {
207                         if (xfs_pwork_want_abort(&iwag->pwork))
208                                 return 0;
209
210                         /* Skip if this inode is free */
211                         if (XFS_INOBT_MASK(j) & irec->ir_free)
212                                 continue;
213
214                         /* Otherwise call our function. */
215                         ino = XFS_AGINO_TO_INO(mp, pag->pag_agno,
216                                                 irec->ir_startino + j);
217                         error = iwag->iwalk_fn(mp, tp, ino, iwag->data);
218                         if (error)
219                                 return error;
220                 }
221         }
222
223         return 0;
224 }
225
226 /* Delete cursor and let go of AGI. */
227 static inline void
228 xfs_iwalk_del_inobt(
229         struct xfs_trans        *tp,
230         struct xfs_btree_cur    **curpp,
231         struct xfs_buf          **agi_bpp,
232         int                     error)
233 {
234         if (*curpp) {
235                 xfs_btree_del_cursor(*curpp, error);
236                 *curpp = NULL;
237         }
238         if (*agi_bpp) {
239                 xfs_trans_brelse(tp, *agi_bpp);
240                 *agi_bpp = NULL;
241         }
242 }
243
244 /*
245  * Set ourselves up for walking inobt records starting from a given point in
246  * the filesystem.
247  *
248  * If caller passed in a nonzero start inode number, load the record from the
249  * inobt and make the record look like all the inodes before agino are free so
250  * that we skip them, and then move the cursor to the next inobt record.  This
251  * is how we support starting an iwalk in the middle of an inode chunk.
252  *
253  * If the caller passed in a start number of zero, move the cursor to the first
254  * inobt record.
255  *
256  * The caller is responsible for cleaning up the cursor and buffer pointer
257  * regardless of the error status.
258  */
259 STATIC int
260 xfs_iwalk_ag_start(
261         struct xfs_iwalk_ag     *iwag,
262         xfs_agino_t             agino,
263         struct xfs_btree_cur    **curpp,
264         struct xfs_buf          **agi_bpp,
265         int                     *has_more)
266 {
267         struct xfs_mount        *mp = iwag->mp;
268         struct xfs_trans        *tp = iwag->tp;
269         struct xfs_perag        *pag = iwag->pag;
270         struct xfs_inobt_rec_incore *irec;
271         int                     error;
272
273         /* Set up a fresh cursor and empty the inobt cache. */
274         iwag->nr_recs = 0;
275         error = xfs_inobt_cur(mp, tp, pag, XFS_BTNUM_INO, curpp, agi_bpp);
276         if (error)
277                 return error;
278
279         /* Starting at the beginning of the AG?  That's easy! */
280         if (agino == 0)
281                 return xfs_inobt_lookup(*curpp, 0, XFS_LOOKUP_GE, has_more);
282
283         /*
284          * Otherwise, we have to grab the inobt record where we left off, stuff
285          * the record into our cache, and then see if there are more records.
286          * We require a lookup cache of at least two elements so that the
287          * caller doesn't have to deal with tearing down the cursor to walk the
288          * records.
289          */
290         error = xfs_inobt_lookup(*curpp, agino, XFS_LOOKUP_LE, has_more);
291         if (error)
292                 return error;
293
294         /*
295          * If the LE lookup at @agino yields no records, jump ahead to the
296          * inobt cursor increment to see if there are more records to process.
297          */
298         if (!*has_more)
299                 goto out_advance;
300
301         /* Get the record, should always work */
302         irec = &iwag->recs[iwag->nr_recs];
303         error = xfs_inobt_get_rec(*curpp, irec, has_more);
304         if (error)
305                 return error;
306         if (XFS_IS_CORRUPT(mp, *has_more != 1))
307                 return -EFSCORRUPTED;
308
309         iwag->lastino = XFS_AGINO_TO_INO(mp, pag->pag_agno,
310                                 irec->ir_startino + XFS_INODES_PER_CHUNK - 1);
311
312         /*
313          * If the LE lookup yielded an inobt record before the cursor position,
314          * skip it and see if there's another one after it.
315          */
316         if (irec->ir_startino + XFS_INODES_PER_CHUNK <= agino)
317                 goto out_advance;
318
319         /*
320          * If agino fell in the middle of the inode record, make it look like
321          * the inodes up to agino are free so that we don't return them again.
322          */
323         if (iwag->trim_start)
324                 xfs_iwalk_adjust_start(agino, irec);
325
326         /*
327          * The prefetch calculation is supposed to give us a large enough inobt
328          * record cache that grab_ichunk can stage a partial first record and
329          * the loop body can cache a record without having to check for cache
330          * space until after it reads an inobt record.
331          */
332         iwag->nr_recs++;
333         ASSERT(iwag->nr_recs < iwag->sz_recs);
334
335 out_advance:
336         return xfs_btree_increment(*curpp, 0, has_more);
337 }
338
339 /*
340  * The inobt record cache is full, so preserve the inobt cursor state and
341  * run callbacks on the cached inobt records.  When we're done, restore the
342  * cursor state to wherever the cursor would have been had the cache not been
343  * full (and therefore we could've just incremented the cursor) if *@has_more
344  * is true.  On exit, *@has_more will indicate whether or not the caller should
345  * try for more inode records.
346  */
347 STATIC int
348 xfs_iwalk_run_callbacks(
349         struct xfs_iwalk_ag             *iwag,
350         struct xfs_btree_cur            **curpp,
351         struct xfs_buf                  **agi_bpp,
352         int                             *has_more)
353 {
354         struct xfs_mount                *mp = iwag->mp;
355         struct xfs_trans                *tp = iwag->tp;
356         struct xfs_inobt_rec_incore     *irec;
357         xfs_agino_t                     next_agino;
358         int                             error;
359
360         next_agino = XFS_INO_TO_AGINO(mp, iwag->lastino) + 1;
361
362         ASSERT(iwag->nr_recs > 0);
363
364         /* Delete cursor but remember the last record we cached... */
365         xfs_iwalk_del_inobt(tp, curpp, agi_bpp, 0);
366         irec = &iwag->recs[iwag->nr_recs - 1];
367         ASSERT(next_agino >= irec->ir_startino + XFS_INODES_PER_CHUNK);
368
369         error = xfs_iwalk_ag_recs(iwag);
370         if (error)
371                 return error;
372
373         /* ...empty the cache... */
374         iwag->nr_recs = 0;
375
376         if (!has_more)
377                 return 0;
378
379         /* ...and recreate the cursor just past where we left off. */
380         error = xfs_inobt_cur(mp, tp, iwag->pag, XFS_BTNUM_INO, curpp, agi_bpp);
381         if (error)
382                 return error;
383
384         return xfs_inobt_lookup(*curpp, next_agino, XFS_LOOKUP_GE, has_more);
385 }
386
387 /* Walk all inodes in a single AG, from @iwag->startino to the end of the AG. */
388 STATIC int
389 xfs_iwalk_ag(
390         struct xfs_iwalk_ag             *iwag)
391 {
392         struct xfs_mount                *mp = iwag->mp;
393         struct xfs_trans                *tp = iwag->tp;
394         struct xfs_perag                *pag = iwag->pag;
395         struct xfs_buf                  *agi_bp = NULL;
396         struct xfs_btree_cur            *cur = NULL;
397         xfs_agino_t                     agino;
398         int                             has_more;
399         int                             error = 0;
400
401         /* Set up our cursor at the right place in the inode btree. */
402         ASSERT(pag->pag_agno == XFS_INO_TO_AGNO(mp, iwag->startino));
403         agino = XFS_INO_TO_AGINO(mp, iwag->startino);
404         error = xfs_iwalk_ag_start(iwag, agino, &cur, &agi_bp, &has_more);
405
406         while (!error && has_more) {
407                 struct xfs_inobt_rec_incore     *irec;
408                 xfs_ino_t                       rec_fsino;
409
410                 cond_resched();
411                 if (xfs_pwork_want_abort(&iwag->pwork))
412                         goto out;
413
414                 /* Fetch the inobt record. */
415                 irec = &iwag->recs[iwag->nr_recs];
416                 error = xfs_inobt_get_rec(cur, irec, &has_more);
417                 if (error || !has_more)
418                         break;
419
420                 /* Make sure that we always move forward. */
421                 rec_fsino = XFS_AGINO_TO_INO(mp, pag->pag_agno, irec->ir_startino);
422                 if (iwag->lastino != NULLFSINO &&
423                     XFS_IS_CORRUPT(mp, iwag->lastino >= rec_fsino)) {
424                         error = -EFSCORRUPTED;
425                         goto out;
426                 }
427                 iwag->lastino = rec_fsino + XFS_INODES_PER_CHUNK - 1;
428
429                 /* No allocated inodes in this chunk; skip it. */
430                 if (iwag->skip_empty && irec->ir_freecount == irec->ir_count) {
431                         error = xfs_btree_increment(cur, 0, &has_more);
432                         if (error)
433                                 break;
434                         continue;
435                 }
436
437                 /*
438                  * Start readahead for this inode chunk in anticipation of
439                  * walking the inodes.
440                  */
441                 if (iwag->iwalk_fn)
442                         xfs_iwalk_ichunk_ra(mp, pag, irec);
443
444                 /*
445                  * If there's space in the buffer for more records, increment
446                  * the btree cursor and grab more.
447                  */
448                 if (++iwag->nr_recs < iwag->sz_recs) {
449                         error = xfs_btree_increment(cur, 0, &has_more);
450                         if (error || !has_more)
451                                 break;
452                         continue;
453                 }
454
455                 /*
456                  * Otherwise, we need to save cursor state and run the callback
457                  * function on the cached records.  The run_callbacks function
458                  * is supposed to return a cursor pointing to the record where
459                  * we would be if we had been able to increment like above.
460                  */
461                 ASSERT(has_more);
462                 error = xfs_iwalk_run_callbacks(iwag, &cur, &agi_bp, &has_more);
463         }
464
465         if (iwag->nr_recs == 0 || error)
466                 goto out;
467
468         /* Walk the unprocessed records in the cache. */
469         error = xfs_iwalk_run_callbacks(iwag, &cur, &agi_bp, &has_more);
470
471 out:
472         xfs_iwalk_del_inobt(tp, &cur, &agi_bp, error);
473         return error;
474 }
475
476 /*
477  * We experimentally determined that the reduction in ioctl call overhead
478  * diminishes when userspace asks for more than 2048 inodes, so we'll cap
479  * prefetch at this point.
480  */
481 #define IWALK_MAX_INODE_PREFETCH        (2048U)
482
483 /*
484  * Given the number of inodes to prefetch, set the number of inobt records that
485  * we cache in memory, which controls the number of inodes we try to read
486  * ahead.  Set the maximum if @inodes == 0.
487  */
488 static inline unsigned int
489 xfs_iwalk_prefetch(
490         unsigned int            inodes)
491 {
492         unsigned int            inobt_records;
493
494         /*
495          * If the caller didn't tell us the number of inodes they wanted,
496          * assume the maximum prefetch possible for best performance.
497          * Otherwise, cap prefetch at that maximum so that we don't start an
498          * absurd amount of prefetch.
499          */
500         if (inodes == 0)
501                 inodes = IWALK_MAX_INODE_PREFETCH;
502         inodes = min(inodes, IWALK_MAX_INODE_PREFETCH);
503
504         /* Round the inode count up to a full chunk. */
505         inodes = round_up(inodes, XFS_INODES_PER_CHUNK);
506
507         /*
508          * In order to convert the number of inodes to prefetch into an
509          * estimate of the number of inobt records to cache, we require a
510          * conversion factor that reflects our expectations of the average
511          * loading factor of an inode chunk.  Based on data gathered, most
512          * (but not all) filesystems manage to keep the inode chunks totally
513          * full, so we'll underestimate slightly so that our readahead will
514          * still deliver the performance we want on aging filesystems:
515          *
516          * inobt = inodes / (INODES_PER_CHUNK * (4 / 5));
517          *
518          * The funny math is to avoid integer division.
519          */
520         inobt_records = (inodes * 5) / (4 * XFS_INODES_PER_CHUNK);
521
522         /*
523          * Allocate enough space to prefetch at least two inobt records so that
524          * we can cache both the record where the iwalk started and the next
525          * record.  This simplifies the AG inode walk loop setup code.
526          */
527         return max(inobt_records, 2U);
528 }
529
530 /*
531  * Walk all inodes in the filesystem starting from @startino.  The @iwalk_fn
532  * will be called for each allocated inode, being passed the inode's number and
533  * @data.  @max_prefetch controls how many inobt records' worth of inodes we
534  * try to readahead.
535  */
536 int
537 xfs_iwalk(
538         struct xfs_mount        *mp,
539         struct xfs_trans        *tp,
540         xfs_ino_t               startino,
541         unsigned int            flags,
542         xfs_iwalk_fn            iwalk_fn,
543         unsigned int            inode_records,
544         void                    *data)
545 {
546         struct xfs_iwalk_ag     iwag = {
547                 .mp             = mp,
548                 .tp             = tp,
549                 .iwalk_fn       = iwalk_fn,
550                 .data           = data,
551                 .startino       = startino,
552                 .sz_recs        = xfs_iwalk_prefetch(inode_records),
553                 .trim_start     = 1,
554                 .skip_empty     = 1,
555                 .pwork          = XFS_PWORK_SINGLE_THREADED,
556                 .lastino        = NULLFSINO,
557         };
558         struct xfs_perag        *pag;
559         xfs_agnumber_t          agno = XFS_INO_TO_AGNO(mp, startino);
560         int                     error;
561
562         ASSERT(agno < mp->m_sb.sb_agcount);
563         ASSERT(!(flags & ~XFS_IWALK_FLAGS_ALL));
564
565         error = xfs_iwalk_alloc(&iwag);
566         if (error)
567                 return error;
568
569         for_each_perag_from(mp, agno, pag) {
570                 iwag.pag = pag;
571                 error = xfs_iwalk_ag(&iwag);
572                 if (error)
573                         break;
574                 iwag.startino = XFS_AGINO_TO_INO(mp, agno + 1, 0);
575                 if (flags & XFS_INOBT_WALK_SAME_AG)
576                         break;
577                 iwag.pag = NULL;
578         }
579
580         if (iwag.pag)
581                 xfs_perag_put(pag);
582         xfs_iwalk_free(&iwag);
583         return error;
584 }
585
586 /* Run per-thread iwalk work. */
587 static int
588 xfs_iwalk_ag_work(
589         struct xfs_mount        *mp,
590         struct xfs_pwork        *pwork)
591 {
592         struct xfs_iwalk_ag     *iwag;
593         int                     error = 0;
594
595         iwag = container_of(pwork, struct xfs_iwalk_ag, pwork);
596         if (xfs_pwork_want_abort(pwork))
597                 goto out;
598
599         error = xfs_iwalk_alloc(iwag);
600         if (error)
601                 goto out;
602
603         error = xfs_iwalk_ag(iwag);
604         xfs_iwalk_free(iwag);
605 out:
606         xfs_perag_put(iwag->pag);
607         kmem_free(iwag);
608         return error;
609 }
610
611 /*
612  * Walk all the inodes in the filesystem using multiple threads to process each
613  * AG.
614  */
615 int
616 xfs_iwalk_threaded(
617         struct xfs_mount        *mp,
618         xfs_ino_t               startino,
619         unsigned int            flags,
620         xfs_iwalk_fn            iwalk_fn,
621         unsigned int            inode_records,
622         bool                    polled,
623         void                    *data)
624 {
625         struct xfs_pwork_ctl    pctl;
626         struct xfs_perag        *pag;
627         xfs_agnumber_t          agno = XFS_INO_TO_AGNO(mp, startino);
628         int                     error;
629
630         ASSERT(agno < mp->m_sb.sb_agcount);
631         ASSERT(!(flags & ~XFS_IWALK_FLAGS_ALL));
632
633         error = xfs_pwork_init(mp, &pctl, xfs_iwalk_ag_work, "xfs_iwalk");
634         if (error)
635                 return error;
636
637         for_each_perag_from(mp, agno, pag) {
638                 struct xfs_iwalk_ag     *iwag;
639
640                 if (xfs_pwork_ctl_want_abort(&pctl))
641                         break;
642
643                 iwag = kmem_zalloc(sizeof(struct xfs_iwalk_ag), 0);
644                 iwag->mp = mp;
645
646                 /*
647                  * perag is being handed off to async work, so take another
648                  * reference for the async work to release.
649                  */
650                 atomic_inc(&pag->pag_ref);
651                 iwag->pag = pag;
652                 iwag->iwalk_fn = iwalk_fn;
653                 iwag->data = data;
654                 iwag->startino = startino;
655                 iwag->sz_recs = xfs_iwalk_prefetch(inode_records);
656                 iwag->lastino = NULLFSINO;
657                 xfs_pwork_queue(&pctl, &iwag->pwork);
658                 startino = XFS_AGINO_TO_INO(mp, pag->pag_agno + 1, 0);
659                 if (flags & XFS_INOBT_WALK_SAME_AG)
660                         break;
661         }
662         if (pag)
663                 xfs_perag_put(pag);
664         if (polled)
665                 xfs_pwork_poll(&pctl);
666         return xfs_pwork_destroy(&pctl);
667 }
668
669 /*
670  * Allow callers to cache up to a page's worth of inobt records.  This reflects
671  * the existing inumbers prefetching behavior.  Since the inobt walk does not
672  * itself do anything with the inobt records, we can set a fairly high limit
673  * here.
674  */
675 #define MAX_INOBT_WALK_PREFETCH \
676         (PAGE_SIZE / sizeof(struct xfs_inobt_rec_incore))
677
678 /*
679  * Given the number of records that the user wanted, set the number of inobt
680  * records that we buffer in memory.  Set the maximum if @inobt_records == 0.
681  */
682 static inline unsigned int
683 xfs_inobt_walk_prefetch(
684         unsigned int            inobt_records)
685 {
686         /*
687          * If the caller didn't tell us the number of inobt records they
688          * wanted, assume the maximum prefetch possible for best performance.
689          */
690         if (inobt_records == 0)
691                 inobt_records = MAX_INOBT_WALK_PREFETCH;
692
693         /*
694          * Allocate enough space to prefetch at least two inobt records so that
695          * we can cache both the record where the iwalk started and the next
696          * record.  This simplifies the AG inode walk loop setup code.
697          */
698         inobt_records = max(inobt_records, 2U);
699
700         /*
701          * Cap prefetch at that maximum so that we don't use an absurd amount
702          * of memory.
703          */
704         return min_t(unsigned int, inobt_records, MAX_INOBT_WALK_PREFETCH);
705 }
706
707 /*
708  * Walk all inode btree records in the filesystem starting from @startino.  The
709  * @inobt_walk_fn will be called for each btree record, being passed the incore
710  * record and @data.  @max_prefetch controls how many inobt records we try to
711  * cache ahead of time.
712  */
713 int
714 xfs_inobt_walk(
715         struct xfs_mount        *mp,
716         struct xfs_trans        *tp,
717         xfs_ino_t               startino,
718         unsigned int            flags,
719         xfs_inobt_walk_fn       inobt_walk_fn,
720         unsigned int            inobt_records,
721         void                    *data)
722 {
723         struct xfs_iwalk_ag     iwag = {
724                 .mp             = mp,
725                 .tp             = tp,
726                 .inobt_walk_fn  = inobt_walk_fn,
727                 .data           = data,
728                 .startino       = startino,
729                 .sz_recs        = xfs_inobt_walk_prefetch(inobt_records),
730                 .pwork          = XFS_PWORK_SINGLE_THREADED,
731                 .lastino        = NULLFSINO,
732         };
733         struct xfs_perag        *pag;
734         xfs_agnumber_t          agno = XFS_INO_TO_AGNO(mp, startino);
735         int                     error;
736
737         ASSERT(agno < mp->m_sb.sb_agcount);
738         ASSERT(!(flags & ~XFS_INOBT_WALK_FLAGS_ALL));
739
740         error = xfs_iwalk_alloc(&iwag);
741         if (error)
742                 return error;
743
744         for_each_perag_from(mp, agno, pag) {
745                 iwag.pag = pag;
746                 error = xfs_iwalk_ag(&iwag);
747                 if (error)
748                         break;
749                 iwag.startino = XFS_AGINO_TO_INO(mp, pag->pag_agno + 1, 0);
750                 if (flags & XFS_INOBT_WALK_SAME_AG)
751                         break;
752                 iwag.pag = NULL;
753         }
754
755         if (iwag.pag)
756                 xfs_perag_put(pag);
757         xfs_iwalk_free(&iwag);
758         return error;
759 }