xref: /linux/fs/xfs/scrub/alloc_repair.c (revision 49869d5d0356c9468621de24d49bac43b7893782)
1 // SPDX-License-Identifier: GPL-2.0-or-later
2 /*
3  * Copyright (C) 2018-2023 Oracle.  All Rights Reserved.
4  * Author: Darrick J. Wong <djwong@kernel.org>
5  */
6 #include "xfs_platform.h"
7 #include "xfs_fs.h"
8 #include "xfs_shared.h"
9 #include "xfs_format.h"
10 #include "xfs_trans_resv.h"
11 #include "xfs_mount.h"
12 #include "xfs_defer.h"
13 #include "xfs_btree.h"
14 #include "xfs_btree_staging.h"
15 #include "xfs_bit.h"
16 #include "xfs_log_format.h"
17 #include "xfs_trans.h"
18 #include "xfs_sb.h"
19 #include "xfs_alloc.h"
20 #include "xfs_alloc_btree.h"
21 #include "xfs_rmap.h"
22 #include "xfs_rmap_btree.h"
23 #include "xfs_inode.h"
24 #include "xfs_refcount.h"
25 #include "xfs_extent_busy.h"
26 #include "xfs_health.h"
27 #include "xfs_bmap.h"
28 #include "xfs_ialloc.h"
29 #include "xfs_ag.h"
30 #include "scrub/xfs_scrub.h"
31 #include "scrub/scrub.h"
32 #include "scrub/common.h"
33 #include "scrub/btree.h"
34 #include "scrub/trace.h"
35 #include "scrub/repair.h"
36 #include "scrub/bitmap.h"
37 #include "scrub/agb_bitmap.h"
38 #include "scrub/xfile.h"
39 #include "scrub/xfarray.h"
40 #include "scrub/newbt.h"
41 #include "scrub/reap.h"
42 
43 /*
44  * Free Space Btree Repair
45  * =======================
46  *
47  * The reverse mappings are supposed to record all space usage for the entire
48  * AG.  Therefore, we can recreate the free extent records in an AG by looking
49  * for gaps in the physical extents recorded in the rmapbt.  These records are
50  * staged in @free_records.  Identifying the gaps is more difficult on a
51  * reflink filesystem because rmap records are allowed to overlap.
52  *
53  * Because the final step of building a new index is to free the space used by
54  * the old index, repair needs to find that space.  Unfortunately, all
55  * structures that live in the free space (bnobt, cntbt, rmapbt, agfl) share
56  * the same rmapbt owner code (OWN_AG), so this is not straightforward.
57  *
58  * The scan of the reverse mapping information records the space used by OWN_AG
59  * in @old_allocbt_blocks, which (at this stage) is somewhat misnamed.  While
60  * walking the rmapbt records, we create a second bitmap @not_allocbt_blocks to
61  * record all visited rmap btree blocks and all blocks owned by the AGFL.
62  *
63  * After that is where the definitions of old_allocbt_blocks shifts.  This
64  * expression identifies possible former bnobt/cntbt blocks:
65  *
66  *	(OWN_AG blocks) & ~(rmapbt blocks | agfl blocks);
67  *
68  * Substituting from above definitions, that becomes:
69  *
70  *	old_allocbt_blocks & ~not_allocbt_blocks
71  *
72  * The OWN_AG bitmap itself isn't needed after this point, so what we really do
73  * instead is:
74  *
75  *	old_allocbt_blocks &= ~not_allocbt_blocks;
76  *
77  * After this point, @old_allocbt_blocks is a bitmap of alleged former
78  * bnobt/cntbt blocks.  The xagb_bitmap_disunion operation modifies its first
79  * parameter in place to avoid copying records around.
80  *
81  * Next, some of the space described by @free_records are diverted to the newbt
82  * reservation and used to format new btree blocks.  The remaining records are
83  * written to the new btree indices.  We reconstruct both bnobt and cntbt at
84  * the same time since we've already done all the work.
85  *
86  * We use the prefix 'xrep_abt' here because we regenerate both free space
87  * allocation btrees at the same time.
88  */
89 
90 struct xrep_abt {
91 	/* Blocks owned by the rmapbt or the agfl. */
92 	struct xagb_bitmap	not_allocbt_blocks;
93 
94 	/* All OWN_AG blocks. */
95 	struct xagb_bitmap	old_allocbt_blocks;
96 
97 	/*
98 	 * New bnobt information.  All btree block reservations are added to
99 	 * the reservation list in new_bnobt.
100 	 */
101 	struct xrep_newbt	new_bnobt;
102 
103 	/* new cntbt information */
104 	struct xrep_newbt	new_cntbt;
105 
106 	/* Free space extents. */
107 	struct xfarray		*free_records;
108 
109 	struct xfs_scrub	*sc;
110 
111 	/* get_records()'s position in the free space record array. */
112 	xfarray_idx_t		array_cur;
113 
114 	/*
115 	 * Next block we anticipate seeing in the rmap records.  If the next
116 	 * rmap record is greater than next_agbno, we have found unused space.
117 	 */
118 	xfs_agblock_t		next_agbno;
119 
120 	/* Number of free blocks in this AG. */
121 	xfs_agblock_t		nr_blocks;
122 
123 	/* Longest free extent we found in the AG. */
124 	xfs_agblock_t		longest;
125 };
126 
127 /* Set up to repair AG free space btrees. */
128 int
129 xrep_setup_ag_allocbt(
130 	struct xfs_scrub	*sc)
131 {
132 	struct xfs_group	*xg = pag_group(sc->sa.pag);
133 	unsigned int		busy_gen;
134 
135 	/*
136 	 * Make sure the busy extent list is clear because we can't put extents
137 	 * on there twice.
138 	 */
139 	if (xfs_extent_busy_list_empty(xg, &busy_gen))
140 		return 0;
141 	return xfs_extent_busy_flush(sc->tp, xg, busy_gen, 0);
142 }
143 
144 /* Check for any obvious conflicts in the free extent. */
145 STATIC int
146 xrep_abt_check_free_ext(
147 	struct xfs_scrub	*sc,
148 	const struct xfs_alloc_rec_incore *rec)
149 {
150 	enum xbtree_recpacking	outcome;
151 	int			error;
152 
153 	if (xfs_alloc_check_irec(sc->sa.pag, rec) != NULL)
154 		return -EFSCORRUPTED;
155 
156 	/* Must not be an inode chunk. */
157 	error = xfs_ialloc_has_inodes_at_extent(sc->sa.ino_cur,
158 			rec->ar_startblock, rec->ar_blockcount, &outcome);
159 	if (error)
160 		return error;
161 	if (outcome != XBTREE_RECPACKING_EMPTY)
162 		return -EFSCORRUPTED;
163 
164 	/* Must not be shared or CoW staging. */
165 	if (sc->sa.refc_cur) {
166 		error = xfs_refcount_has_records(sc->sa.refc_cur,
167 				XFS_REFC_DOMAIN_SHARED, rec->ar_startblock,
168 				rec->ar_blockcount, &outcome);
169 		if (error)
170 			return error;
171 		if (outcome != XBTREE_RECPACKING_EMPTY)
172 			return -EFSCORRUPTED;
173 
174 		error = xfs_refcount_has_records(sc->sa.refc_cur,
175 				XFS_REFC_DOMAIN_COW, rec->ar_startblock,
176 				rec->ar_blockcount, &outcome);
177 		if (error)
178 			return error;
179 		if (outcome != XBTREE_RECPACKING_EMPTY)
180 			return -EFSCORRUPTED;
181 	}
182 
183 	return 0;
184 }
185 
186 /*
187  * Stash a free space record for all the space since the last bno we found
188  * all the way up to @end.
189  */
190 static int
191 xrep_abt_stash(
192 	struct xrep_abt		*ra,
193 	xfs_agblock_t		end)
194 {
195 	struct xfs_alloc_rec_incore arec = {
196 		.ar_startblock	= ra->next_agbno,
197 		.ar_blockcount	= end - ra->next_agbno,
198 	};
199 	struct xfs_scrub	*sc = ra->sc;
200 	int			error = 0;
201 
202 	if (xchk_should_terminate(sc, &error))
203 		return error;
204 
205 	error = xrep_abt_check_free_ext(ra->sc, &arec);
206 	if (error)
207 		return error;
208 
209 	trace_xrep_abt_found(sc->sa.pag, &arec);
210 
211 	error = xfarray_append(ra->free_records, &arec);
212 	if (error)
213 		return error;
214 
215 	ra->nr_blocks += arec.ar_blockcount;
216 	return 0;
217 }
218 
219 /* Record extents that aren't in use from gaps in the rmap records. */
220 STATIC int
221 xrep_abt_walk_rmap(
222 	struct xfs_btree_cur		*cur,
223 	const struct xfs_rmap_irec	*rec,
224 	void				*priv)
225 {
226 	struct xrep_abt			*ra = priv;
227 	int				error = 0;
228 
229 	if (xchk_should_terminate(ra->sc, &error))
230 		return error;
231 
232 	/* Record all the OWN_AG blocks... */
233 	if (rec->rm_owner == XFS_RMAP_OWN_AG) {
234 		error = xagb_bitmap_set(&ra->old_allocbt_blocks,
235 				rec->rm_startblock, rec->rm_blockcount);
236 		if (error)
237 			return error;
238 	}
239 
240 	/* ...and all the rmapbt blocks... */
241 	error = xagb_bitmap_set_btcur_path(&ra->not_allocbt_blocks, cur);
242 	if (error)
243 		return error;
244 
245 	/* ...and all the free space. */
246 	if (rec->rm_startblock > ra->next_agbno) {
247 		error = xrep_abt_stash(ra, rec->rm_startblock);
248 		if (error)
249 			return error;
250 	}
251 
252 	/*
253 	 * rmap records can overlap on reflink filesystems, so project
254 	 * next_agbno as far out into the AG space as we currently know about.
255 	 */
256 	ra->next_agbno = max_t(xfs_agblock_t, ra->next_agbno,
257 			rec->rm_startblock + rec->rm_blockcount);
258 	return 0;
259 }
260 
261 /* Collect an AGFL block for the not-to-release list. */
262 static int
263 xrep_abt_walk_agfl(
264 	struct xfs_mount	*mp,
265 	xfs_agblock_t		agbno,
266 	void			*priv)
267 {
268 	struct xrep_abt		*ra = priv;
269 
270 	return xagb_bitmap_set(&ra->not_allocbt_blocks, agbno, 1);
271 }
272 
273 /*
274  * Compare two free space extents by block number.  We want to sort in order of
275  * increasing block number.
276  */
277 static int
278 xrep_bnobt_extent_cmp(
279 	const void		*a,
280 	const void		*b)
281 {
282 	const struct xfs_alloc_rec_incore *ap = a;
283 	const struct xfs_alloc_rec_incore *bp = b;
284 
285 	if (ap->ar_startblock > bp->ar_startblock)
286 		return 1;
287 	else if (ap->ar_startblock < bp->ar_startblock)
288 		return -1;
289 	return 0;
290 }
291 
292 /*
293  * Re-sort the free extents by block number so that we can put the records into
294  * the bnobt in the correct order.  Make sure the records do not overlap in
295  * physical space.
296  */
297 STATIC int
298 xrep_bnobt_sort_records(
299 	struct xrep_abt			*ra)
300 {
301 	struct xfs_alloc_rec_incore	arec;
302 	xfarray_idx_t			cur = XFARRAY_CURSOR_INIT;
303 	xfs_agblock_t			next_agbno = 0;
304 	int				error;
305 
306 	error = xfarray_sort(ra->free_records, xrep_bnobt_extent_cmp, 0);
307 	if (error)
308 		return error;
309 
310 	while ((error = xfarray_iter(ra->free_records, &cur, &arec)) == 1) {
311 		if (arec.ar_startblock < next_agbno)
312 			return -EFSCORRUPTED;
313 
314 		next_agbno = arec.ar_startblock + arec.ar_blockcount;
315 	}
316 
317 	return error;
318 }
319 
320 /*
321  * Compare two free space extents by length and then block number.  We want
322  * to sort first in order of increasing length and then in order of increasing
323  * block number.
324  */
325 static int
326 xrep_cntbt_extent_cmp(
327 	const void			*a,
328 	const void			*b)
329 {
330 	const struct xfs_alloc_rec_incore *ap = a;
331 	const struct xfs_alloc_rec_incore *bp = b;
332 
333 	if (ap->ar_blockcount > bp->ar_blockcount)
334 		return 1;
335 	else if (ap->ar_blockcount < bp->ar_blockcount)
336 		return -1;
337 	return xrep_bnobt_extent_cmp(a, b);
338 }
339 
340 /*
341  * Sort the free extents by length so that we can put the records into the
342  * cntbt in the correct order.  Don't let userspace kill us if we're resorting
343  * after allocating btree blocks.
344  */
345 STATIC int
346 xrep_cntbt_sort_records(
347 	struct xrep_abt			*ra,
348 	bool				is_resort)
349 {
350 	return xfarray_sort(ra->free_records, xrep_cntbt_extent_cmp,
351 			is_resort ? 0 : XFARRAY_SORT_KILLABLE);
352 }
353 
354 /*
355  * Iterate all reverse mappings to find (1) the gaps between rmap records (all
356  * unowned space), (2) the OWN_AG extents (which encompass the free space
357  * btrees, the rmapbt, and the agfl), (3) the rmapbt blocks, and (4) the AGFL
358  * blocks.  The free space is (1) + (2) - (3) - (4).
359  */
360 STATIC int
361 xrep_abt_find_freespace(
362 	struct xrep_abt		*ra)
363 {
364 	struct xfs_scrub	*sc = ra->sc;
365 	struct xfs_mount	*mp = sc->mp;
366 	struct xfs_agf		*agf = sc->sa.agf_bp->b_addr;
367 	struct xfs_buf		*agfl_bp;
368 	xfs_agblock_t		agend;
369 	int			error;
370 
371 	xagb_bitmap_init(&ra->not_allocbt_blocks);
372 
373 	xrep_ag_btcur_init(sc);
374 
375 	/*
376 	 * Iterate all the reverse mappings to find gaps in the physical
377 	 * mappings, all the OWN_AG blocks, and all the rmapbt extents.
378 	 */
379 	error = xfs_rmap_query_all(sc->sa.rmap_cur, xrep_abt_walk_rmap, ra);
380 	if (error)
381 		goto err;
382 
383 	/* Insert a record for space between the last rmap and EOAG. */
384 	agend = be32_to_cpu(agf->agf_length);
385 	if (ra->next_agbno < agend) {
386 		error = xrep_abt_stash(ra, agend);
387 		if (error)
388 			goto err;
389 	}
390 
391 	/* Collect all the AGFL blocks. */
392 	error = xfs_alloc_read_agfl(sc->sa.pag, sc->tp, &agfl_bp);
393 	if (error)
394 		goto err;
395 
396 	error = xfs_agfl_walk(mp, agf, agfl_bp, xrep_abt_walk_agfl, ra);
397 	if (error)
398 		goto err_agfl;
399 
400 	/* Compute the old bnobt/cntbt blocks. */
401 	error = xagb_bitmap_disunion(&ra->old_allocbt_blocks,
402 			&ra->not_allocbt_blocks);
403 	if (error)
404 		goto err_agfl;
405 
406 err_agfl:
407 	xfs_trans_brelse(sc->tp, agfl_bp);
408 err:
409 	xchk_ag_btcur_free(sc);
410 	xagb_bitmap_destroy(&ra->not_allocbt_blocks);
411 	return error;
412 }
413 
414 /*
415  * We're going to use the observed free space records to reserve blocks for the
416  * new free space btrees, so we play an iterative game where we try to converge
417  * on the number of blocks we need:
418  *
419  * 1. Estimate how many blocks we'll need to store the records.
420  * 2. If the first free record has more blocks than we need, we're done.
421  *    We will have to re-sort the records prior to building the cntbt.
422  * 3. If that record has exactly the number of blocks we need, null out the
423  *    record.  We're done.
424  * 4. Otherwise, we still need more blocks.  Null out the record, subtract its
425  *    length from the number of blocks we need, and go back to step 1.
426  *
427  * Fortunately, we don't have to do any transaction work to play this game, so
428  * we don't have to tear down the staging cursors.
429  */
430 STATIC int
431 xrep_abt_reserve_space(
432 	struct xrep_abt		*ra,
433 	struct xfs_btree_cur	*bno_cur,
434 	struct xfs_btree_cur	*cnt_cur,
435 	bool			*needs_resort)
436 {
437 	struct xfs_scrub	*sc = ra->sc;
438 	xfarray_idx_t		record_nr;
439 	unsigned int		allocated = 0;
440 	int			error = 0;
441 
442 	record_nr = xfarray_length(ra->free_records) - 1;
443 	do {
444 		struct xfs_alloc_rec_incore arec;
445 		uint64_t		required;
446 		unsigned int		desired;
447 		unsigned int		len;
448 		const uint64_t		nr_records =
449 			xfarray_length(ra->free_records);
450 
451 		/* Compute how many blocks we'll need. */
452 		error = xfs_btree_bload_compute_geometry(cnt_cur,
453 				&ra->new_cntbt.bload, nr_records);
454 		if (error)
455 			break;
456 
457 		error = xfs_btree_bload_compute_geometry(bno_cur,
458 				&ra->new_bnobt.bload, nr_records);
459 		if (error)
460 			break;
461 
462 		/* How many btree blocks do we need to store all records? */
463 		required = ra->new_bnobt.bload.nr_blocks +
464 			   ra->new_cntbt.bload.nr_blocks;
465 		ASSERT(required < INT_MAX);
466 
467 		/* If we've reserved enough blocks, we're done. */
468 		if (allocated >= required)
469 			break;
470 
471 		desired = required - allocated;
472 
473 		/* We need space but there's none left; bye! */
474 		if (nr_records == 0) {
475 			error = -ENOSPC;
476 			break;
477 		}
478 
479 		/* Grab the first record from the list. */
480 		error = xfarray_load(ra->free_records, record_nr, &arec);
481 		if (error)
482 			break;
483 
484 		ASSERT(arec.ar_blockcount <= UINT_MAX);
485 		len = min_t(unsigned int, arec.ar_blockcount, desired);
486 
487 		trace_xrep_newbt_alloc_ag_blocks(sc->sa.pag, arec.ar_startblock,
488 				len, XFS_RMAP_OWN_AG);
489 
490 		error = xrep_newbt_add_extent(&ra->new_bnobt, sc->sa.pag,
491 				arec.ar_startblock, len);
492 		if (error)
493 			break;
494 		allocated += len;
495 		ra->nr_blocks -= len;
496 
497 		if (arec.ar_blockcount > desired) {
498 			/*
499 			 * Record has more space than we need.  The number of
500 			 * free records doesn't change, so shrink the free
501 			 * record, inform the caller that the records are no
502 			 * longer sorted by length, and exit.
503 			 */
504 			arec.ar_startblock += desired;
505 			arec.ar_blockcount -= desired;
506 			error = xfarray_store(ra->free_records, record_nr,
507 					&arec);
508 			if (error)
509 				break;
510 
511 			*needs_resort = true;
512 			return 0;
513 		}
514 
515 		/*
516 		 * We're going to use up the entire record, so unset it and
517 		 * move on to the next one.  This changes the number of free
518 		 * records (but doesn't break the sorting order), so we must
519 		 * go around the loop once more to re-run _bload_init.
520 		 */
521 		error = xfarray_trim(ra->free_records, 1);
522 		if (error)
523 			break;
524 		record_nr--;
525 	} while (1);
526 
527 	return error;
528 }
529 
530 STATIC int
531 xrep_abt_dispose_one(
532 	struct xrep_abt		*ra,
533 	struct xrep_newbt_resv	*resv)
534 {
535 	struct xfs_scrub	*sc = ra->sc;
536 	struct xfs_perag	*pag = sc->sa.pag;
537 	xfs_agblock_t		free_agbno = resv->agbno + resv->used;
538 	xfs_extlen_t		free_aglen = resv->len - resv->used;
539 	int			error;
540 
541 	ASSERT(pag == resv->pag);
542 
543 	/* Add a deferred rmap for each extent we used. */
544 	if (resv->used > 0)
545 		xfs_rmap_alloc_extent(sc->tp, false,
546 				xfs_agbno_to_fsb(pag, resv->agbno), resv->used,
547 				XFS_RMAP_OWN_AG);
548 
549 	/*
550 	 * For each reserved btree block we didn't use, add it to the free
551 	 * space btree.  We didn't touch fdblocks when we reserved them, so
552 	 * we don't touch it now.
553 	 */
554 	if (free_aglen == 0)
555 		return 0;
556 
557 	trace_xrep_newbt_free_blocks(resv->pag, free_agbno, free_aglen,
558 			ra->new_bnobt.oinfo.oi_owner);
559 
560 	error = __xfs_free_extent(sc->tp, resv->pag, free_agbno, free_aglen,
561 			&ra->new_bnobt.oinfo, XFS_AG_RESV_IGNORE, true);
562 	if (error)
563 		return error;
564 
565 	return xrep_defer_finish(sc);
566 }
567 
568 /*
569  * Deal with all the space we reserved.  Blocks that were allocated for the
570  * free space btrees need to have a (deferred) rmap added for the OWN_AG
571  * allocation, and blocks that didn't get used can be freed via the usual
572  * (deferred) means.
573  */
574 STATIC int
575 xrep_abt_dispose_reservations(
576 	struct xrep_abt		*ra,
577 	int			error)
578 {
579 	struct xrep_newbt_resv	*resv, *n;
580 
581 	if (error)
582 		goto junkit;
583 
584 	list_for_each_entry_safe(resv, n, &ra->new_bnobt.resv_list, list) {
585 		int		error2 = xrep_abt_dispose_one(ra, resv);
586 
587 		if (error2) {
588 			if (!error)
589 				error = error2;
590 			goto junkit;
591 		}
592 	}
593 
594 junkit:
595 	list_for_each_entry_safe(resv, n, &ra->new_bnobt.resv_list, list) {
596 		xfs_perag_put(resv->pag);
597 		list_del(&resv->list);
598 		kfree(resv);
599 	}
600 
601 	xrep_newbt_cancel(&ra->new_bnobt);
602 	xrep_newbt_cancel(&ra->new_cntbt);
603 	return error;
604 }
605 
606 /* Retrieve free space data for bulk load. */
607 STATIC int
608 xrep_abt_get_records(
609 	struct xfs_btree_cur		*cur,
610 	unsigned int			idx,
611 	struct xfs_btree_block		*block,
612 	unsigned int			nr_wanted,
613 	void				*priv)
614 {
615 	struct xfs_alloc_rec_incore	*arec = &cur->bc_rec.a;
616 	struct xrep_abt			*ra = priv;
617 	union xfs_btree_rec		*block_rec;
618 	unsigned int			loaded;
619 	int				error;
620 
621 	for (loaded = 0; loaded < nr_wanted; loaded++, idx++) {
622 		error = xfarray_load_next(ra->free_records, &ra->array_cur,
623 				arec);
624 		if (error)
625 			return error;
626 
627 		ra->longest = max(ra->longest, arec->ar_blockcount);
628 
629 		block_rec = xfs_btree_rec_addr(cur, idx, block);
630 		cur->bc_ops->init_rec_from_cur(cur, block_rec);
631 	}
632 
633 	return loaded;
634 }
635 
636 /* Feed one of the new btree blocks to the bulk loader. */
637 STATIC int
638 xrep_abt_claim_block(
639 	struct xfs_btree_cur	*cur,
640 	union xfs_btree_ptr	*ptr,
641 	void			*priv)
642 {
643 	struct xrep_abt		*ra = priv;
644 
645 	return xrep_newbt_claim_block(cur, &ra->new_bnobt, ptr);
646 }
647 
648 /*
649  * Reset the AGF counters to reflect the free space btrees that we just
650  * rebuilt, then reinitialize the per-AG data.
651  */
652 STATIC int
653 xrep_abt_reset_counters(
654 	struct xrep_abt		*ra)
655 {
656 	struct xfs_scrub	*sc = ra->sc;
657 	struct xfs_perag	*pag = sc->sa.pag;
658 	struct xfs_agf		*agf = sc->sa.agf_bp->b_addr;
659 	unsigned int		freesp_btreeblks = 0;
660 
661 	/*
662 	 * Compute the contribution to agf_btreeblks for the new free space
663 	 * btrees.  This is the computed btree size minus the root block.
664 	 */
665 	freesp_btreeblks += ra->new_bnobt.bload.nr_blocks - 1;
666 	freesp_btreeblks += ra->new_cntbt.bload.nr_blocks - 1;
667 
668 	/*
669 	 * The AGF header contains extra information related to the free space
670 	 * btrees, so we must update those fields here.
671 	 */
672 	agf->agf_btreeblks = cpu_to_be32(freesp_btreeblks +
673 				(be32_to_cpu(agf->agf_rmap_blocks) - 1));
674 	agf->agf_freeblks = cpu_to_be32(ra->nr_blocks);
675 	agf->agf_longest = cpu_to_be32(ra->longest);
676 	xfs_alloc_log_agf(sc->tp, sc->sa.agf_bp, XFS_AGF_BTREEBLKS |
677 						 XFS_AGF_LONGEST |
678 						 XFS_AGF_FREEBLKS);
679 
680 	/*
681 	 * After we commit the new btree to disk, it is possible that the
682 	 * process to reap the old btree blocks will race with the AIL trying
683 	 * to checkpoint the old btree blocks into the filesystem.  If the new
684 	 * tree is shorter than the old one, the allocbt write verifier will
685 	 * fail and the AIL will shut down the filesystem.
686 	 *
687 	 * To avoid this, save the old incore btree height values as the alt
688 	 * height values before re-initializing the perag info from the updated
689 	 * AGF to capture all the new values.
690 	 */
691 	pag->pagf_repair_bno_level = pag->pagf_bno_level;
692 	pag->pagf_repair_cnt_level = pag->pagf_cnt_level;
693 
694 	/* Reinitialize with the values we just logged. */
695 	return xrep_reinit_pagf(sc);
696 }
697 
698 /*
699  * Use the collected free space information to stage new free space btrees.
700  * If this is successful we'll return with the new btree root
701  * information logged to the repair transaction but not yet committed.
702  */
703 STATIC int
704 xrep_abt_build_new_trees(
705 	struct xrep_abt		*ra)
706 {
707 	struct xfs_scrub	*sc = ra->sc;
708 	struct xfs_btree_cur	*bno_cur;
709 	struct xfs_btree_cur	*cnt_cur;
710 	struct xfs_perag	*pag = sc->sa.pag;
711 	bool			needs_resort = false;
712 	int			error;
713 
714 	/*
715 	 * Sort the free extents by length so that we can set up the free space
716 	 * btrees in as few extents as possible.  This reduces the amount of
717 	 * deferred rmap / free work we have to do at the end.
718 	 */
719 	error = xrep_cntbt_sort_records(ra, false);
720 	if (error)
721 		return error;
722 
723 	/*
724 	 * Prepare to construct the new btree by reserving disk space for the
725 	 * new btree and setting up all the accounting information we'll need
726 	 * to root the new btree while it's under construction and before we
727 	 * attach it to the AG header.
728 	 */
729 	xrep_newbt_init_bare(&ra->new_bnobt, sc);
730 	xrep_newbt_init_bare(&ra->new_cntbt, sc);
731 
732 	ra->new_bnobt.bload.get_records = xrep_abt_get_records;
733 	ra->new_cntbt.bload.get_records = xrep_abt_get_records;
734 
735 	ra->new_bnobt.bload.claim_block = xrep_abt_claim_block;
736 	ra->new_cntbt.bload.claim_block = xrep_abt_claim_block;
737 
738 	/* Allocate cursors for the staged btrees. */
739 	bno_cur = xfs_bnobt_init_cursor(sc->mp, NULL, NULL, pag);
740 	xfs_btree_stage_afakeroot(bno_cur, &ra->new_bnobt.afake);
741 
742 	cnt_cur = xfs_cntbt_init_cursor(sc->mp, NULL, NULL, pag);
743 	xfs_btree_stage_afakeroot(cnt_cur, &ra->new_cntbt.afake);
744 
745 	/* Last chance to abort before we start committing fixes. */
746 	if (xchk_should_terminate(sc, &error))
747 		goto err_cur;
748 
749 	/* Reserve the space we'll need for the new btrees. */
750 	error = xrep_abt_reserve_space(ra, bno_cur, cnt_cur, &needs_resort);
751 	if (error)
752 		goto err_cur;
753 
754 	/*
755 	 * If we need to re-sort the free extents by length, do so so that we
756 	 * can put the records into the cntbt in the correct order.
757 	 */
758 	if (needs_resort) {
759 		error = xrep_cntbt_sort_records(ra, needs_resort);
760 		if (error)
761 			goto err_cur;
762 	}
763 
764 	/*
765 	 * Due to btree slack factors, it's possible for a new btree to be one
766 	 * level taller than the old btree.  Update the alternate incore btree
767 	 * height so that we don't trip the verifiers when writing the new
768 	 * btree blocks to disk.
769 	 */
770 	pag->pagf_repair_bno_level = ra->new_bnobt.bload.btree_height;
771 	pag->pagf_repair_cnt_level = ra->new_cntbt.bload.btree_height;
772 
773 	/* Load the free space by length tree. */
774 	ra->array_cur = XFARRAY_CURSOR_INIT;
775 	ra->longest = 0;
776 	error = xfs_btree_bload(cnt_cur, &ra->new_cntbt.bload, ra);
777 	if (error)
778 		goto err_levels;
779 
780 	error = xrep_bnobt_sort_records(ra);
781 	if (error)
782 		goto err_levels;
783 
784 	/* Load the free space by block number tree. */
785 	ra->array_cur = XFARRAY_CURSOR_INIT;
786 	error = xfs_btree_bload(bno_cur, &ra->new_bnobt.bload, ra);
787 	if (error)
788 		goto err_levels;
789 
790 	/*
791 	 * Install the new btrees in the AG header.  After this point the old
792 	 * btrees are no longer accessible and the new trees are live.
793 	 */
794 	xfs_allocbt_commit_staged_btree(bno_cur, sc->tp, sc->sa.agf_bp);
795 	xfs_btree_del_cursor(bno_cur, 0);
796 	xfs_allocbt_commit_staged_btree(cnt_cur, sc->tp, sc->sa.agf_bp);
797 	xfs_btree_del_cursor(cnt_cur, 0);
798 
799 	/* Reset the AGF counters now that we've changed the btree shape. */
800 	error = xrep_abt_reset_counters(ra);
801 	if (error)
802 		goto err_newbt;
803 
804 	/* Dispose of any unused blocks and the accounting information. */
805 	error = xrep_abt_dispose_reservations(ra, error);
806 	if (error)
807 		return error;
808 
809 	return xrep_roll_ag_trans(sc);
810 
811 err_levels:
812 	pag->pagf_repair_bno_level = 0;
813 	pag->pagf_repair_cnt_level = 0;
814 err_cur:
815 	xfs_btree_del_cursor(cnt_cur, error);
816 	xfs_btree_del_cursor(bno_cur, error);
817 err_newbt:
818 	return xrep_abt_dispose_reservations(ra, error);
819 }
820 
821 /*
822  * Now that we've logged the roots of the new btrees, invalidate all of the
823  * old blocks and free them.
824  */
825 STATIC int
826 xrep_abt_remove_old_trees(
827 	struct xrep_abt		*ra)
828 {
829 	struct xfs_perag	*pag = ra->sc->sa.pag;
830 	int			error;
831 
832 	/* Free the old btree blocks if they're not in use. */
833 	error = xrep_reap_agblocks(ra->sc, &ra->old_allocbt_blocks,
834 			&XFS_RMAP_OINFO_AG, XFS_AG_RESV_IGNORE);
835 	if (error)
836 		return error;
837 
838 	/*
839 	 * Now that we've zapped all the old allocbt blocks we can turn off
840 	 * the alternate height mechanism.
841 	 */
842 	pag->pagf_repair_bno_level = 0;
843 	pag->pagf_repair_cnt_level = 0;
844 	return 0;
845 }
846 
847 /* Repair the freespace btrees for some AG. */
848 int
849 xrep_allocbt(
850 	struct xfs_scrub	*sc)
851 {
852 	struct xrep_abt		*ra;
853 	struct xfs_mount	*mp = sc->mp;
854 	unsigned int		busy_gen;
855 	int			error;
856 
857 	/* We require the rmapbt to rebuild anything. */
858 	if (!xfs_has_rmapbt(mp))
859 		return -EOPNOTSUPP;
860 
861 	ra = kzalloc_obj(struct xrep_abt, XCHK_GFP_FLAGS);
862 	if (!ra)
863 		return -ENOMEM;
864 	ra->sc = sc;
865 
866 	/* We rebuild both data structures. */
867 	sc->sick_mask = XFS_SICK_AG_BNOBT | XFS_SICK_AG_CNTBT;
868 
869 	/*
870 	 * Make sure the busy extent list is clear because we can't put extents
871 	 * on there twice.  In theory we cleared this before we started, but
872 	 * let's not risk the filesystem.
873 	 */
874 	if (!xfs_extent_busy_list_empty(pag_group(sc->sa.pag), &busy_gen)) {
875 		error = -EDEADLOCK;
876 		goto out_ra;
877 	}
878 
879 	/* Set up enough storage to handle maximally fragmented free space. */
880 	error = xfarray_create("free space records", mp->m_sb.sb_agblocks / 2,
881 			sizeof(struct xfs_alloc_rec_incore),
882 			&ra->free_records);
883 	if (error)
884 		goto out_ra;
885 
886 	/* Collect the free space data and find the old btree blocks. */
887 	xagb_bitmap_init(&ra->old_allocbt_blocks);
888 	error = xrep_abt_find_freespace(ra);
889 	if (error)
890 		goto out_bitmap;
891 
892 	/* Rebuild the free space information. */
893 	error = xrep_abt_build_new_trees(ra);
894 	if (error)
895 		goto out_bitmap;
896 
897 	/* Kill the old trees. */
898 	error = xrep_abt_remove_old_trees(ra);
899 	if (error)
900 		goto out_bitmap;
901 
902 out_bitmap:
903 	xagb_bitmap_destroy(&ra->old_allocbt_blocks);
904 	xfarray_destroy(ra->free_records);
905 out_ra:
906 	kfree(ra);
907 	return error;
908 }
909 
910 /* Make sure both btrees are ok after we've rebuilt them. */
911 int
912 xrep_revalidate_allocbt(
913 	struct xfs_scrub	*sc)
914 {
915 	__u32			old_type = sc->sm->sm_type;
916 	int			error;
917 
918 	/*
919 	 * We must update sm_type temporarily so that the tree-to-tree cross
920 	 * reference checks will work in the correct direction, and also so
921 	 * that tracing will report correctly if there are more errors.
922 	 */
923 	sc->sm->sm_type = XFS_SCRUB_TYPE_BNOBT;
924 	error = xchk_allocbt(sc);
925 	if (error)
926 		goto out;
927 
928 	/*
929 	 * If the bnobt is still corrupt, we've failed to repair the filesystem
930 	 * and should just bail out.
931 	 *
932 	 * If the bnobt fails cross-examination with the cntbt, the scan will
933 	 * free the cntbt cursor, so we need to mark the repair incomplete
934 	 * and avoid walking off the end of the NULL cntbt cursor.
935 	 */
936 	if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
937 		goto out;
938 
939 	sc->sm->sm_type = XFS_SCRUB_TYPE_CNTBT;
940 	if (!sc->sa.cnt_cur) {
941 		xchk_set_incomplete(sc);
942 		goto out;
943 	}
944 	error = xchk_allocbt(sc);
945 out:
946 	sc->sm->sm_type = old_type;
947 	return error;
948 }
949