ialloc.c 13.3 KB
Newer Older
D
Dave Chinner 已提交
1
// SPDX-License-Identifier: GPL-2.0+
D
Darrick J. Wong 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
/*
 * Copyright (C) 2017 Oracle.  All Rights Reserved.
 * Author: Darrick J. Wong <darrick.wong@oracle.com>
 */
#include "xfs.h"
#include "xfs_fs.h"
#include "xfs_shared.h"
#include "xfs_format.h"
#include "xfs_trans_resv.h"
#include "xfs_mount.h"
#include "xfs_defer.h"
#include "xfs_btree.h"
#include "xfs_bit.h"
#include "xfs_log_format.h"
#include "xfs_trans.h"
#include "xfs_sb.h"
#include "xfs_inode.h"
#include "xfs_alloc.h"
#include "xfs_ialloc.h"
#include "xfs_ialloc_btree.h"
#include "xfs_icache.h"
#include "xfs_rmap.h"
#include "xfs_log.h"
#include "xfs_trans_priv.h"
#include "scrub/xfs_scrub.h"
#include "scrub/scrub.h"
#include "scrub/common.h"
#include "scrub/btree.h"
#include "scrub/trace.h"

/*
 * Set us up to scrub inode btrees.
 * If we detect a discrepancy between the inobt and the inode,
 * try again after forcing logged inode cores out to disk.
 */
int
D
Darrick J. Wong 已提交
38
xchk_setup_ag_iallocbt(
39
	struct xfs_scrub	*sc,
40
	struct xfs_inode	*ip)
D
Darrick J. Wong 已提交
41
{
D
Darrick J. Wong 已提交
42
	return xchk_setup_ag_btree(sc, ip, sc->try_harder);
D
Darrick J. Wong 已提交
43 44 45 46
}

/* Inode btree scrubber. */

47 48 49 50 51
struct xchk_iallocbt {
	/* Number of inodes we see while scanning inobt. */
	unsigned long long	inodes;
};

52 53 54 55 56 57
/*
 * If we're checking the finobt, cross-reference with the inobt.
 * Otherwise we're checking the inobt; if there is an finobt, make sure
 * we have a record or not depending on freecount.
 */
static inline void
D
Darrick J. Wong 已提交
58
xchk_iallocbt_chunk_xref_other(
59
	struct xfs_scrub		*sc,
60 61 62 63 64 65 66 67 68 69 70 71 72 73
	struct xfs_inobt_rec_incore	*irec,
	xfs_agino_t			agino)
{
	struct xfs_btree_cur		**pcur;
	bool				has_irec;
	int				error;

	if (sc->sm->sm_type == XFS_SCRUB_TYPE_FINOBT)
		pcur = &sc->sa.ino_cur;
	else
		pcur = &sc->sa.fino_cur;
	if (!(*pcur))
		return;
	error = xfs_ialloc_has_inode_record(*pcur, agino, agino, &has_irec);
D
Darrick J. Wong 已提交
74
	if (!xchk_should_check_xref(sc, &error, pcur))
75 76 77
		return;
	if (((irec->ir_freecount > 0 && !has_irec) ||
	     (irec->ir_freecount == 0 && has_irec)))
D
Darrick J. Wong 已提交
78
		xchk_btree_xref_set_corrupt(sc, *pcur, 0);
79 80
}

81 82
/* Cross-reference with the other btrees. */
STATIC void
D
Darrick J. Wong 已提交
83
xchk_iallocbt_chunk_xref(
84
	struct xfs_scrub		*sc,
85 86 87 88 89 90 91
	struct xfs_inobt_rec_incore	*irec,
	xfs_agino_t			agino,
	xfs_agblock_t			agbno,
	xfs_extlen_t			len)
{
	if (sc->sm->sm_flags & XFS_SCRUB_OFLAG_CORRUPT)
		return;
92

D
Darrick J. Wong 已提交
93 94
	xchk_xref_is_used_space(sc, agbno, len);
	xchk_iallocbt_chunk_xref_other(sc, irec, agino);
95
	xchk_xref_is_owned_by(sc, agbno, len, &XFS_RMAP_OINFO_INODES);
D
Darrick J. Wong 已提交
96
	xchk_xref_is_not_shared(sc, agbno, len);
97 98
}

D
Darrick J. Wong 已提交
99 100
/* Is this chunk worth checking? */
STATIC bool
D
Darrick J. Wong 已提交
101 102
xchk_iallocbt_chunk(
	struct xchk_btree		*bs,
D
Darrick J. Wong 已提交
103 104 105 106 107 108 109 110 111 112 113 114
	struct xfs_inobt_rec_incore	*irec,
	xfs_agino_t			agino,
	xfs_extlen_t			len)
{
	struct xfs_mount		*mp = bs->cur->bc_mp;
	xfs_agnumber_t			agno = bs->cur->bc_private.a.agno;
	xfs_agblock_t			bno;

	bno = XFS_AGINO_TO_AGBNO(mp, agino);
	if (bno + len <= bno ||
	    !xfs_verify_agbno(mp, agno, bno) ||
	    !xfs_verify_agbno(mp, agno, bno + len - 1))
D
Darrick J. Wong 已提交
115
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
116

D
Darrick J. Wong 已提交
117
	xchk_iallocbt_chunk_xref(bs->sc, irec, agino, bno, len);
118

D
Darrick J. Wong 已提交
119 120 121 122 123
	return true;
}

/* Count the number of free inodes. */
static unsigned int
D
Darrick J. Wong 已提交
124
xchk_iallocbt_freecount(
D
Darrick J. Wong 已提交
125 126 127 128 129 130 131 132
	xfs_inofree_t			freemask)
{
	BUILD_BUG_ON(sizeof(freemask) != sizeof(__u64));
	return hweight64(freemask);
}

/* Check a particular inode with ir_free. */
STATIC int
D
Darrick J. Wong 已提交
133 134
xchk_iallocbt_check_cluster_freemask(
	struct xchk_btree		*bs,
D
Darrick J. Wong 已提交
135 136 137 138 139 140 141 142 143 144 145 146 147
	xfs_ino_t			fsino,
	xfs_agino_t			chunkino,
	xfs_agino_t			clusterino,
	struct xfs_inobt_rec_incore	*irec,
	struct xfs_buf			*bp)
{
	struct xfs_dinode		*dip;
	struct xfs_mount		*mp = bs->cur->bc_mp;
	bool				inode_is_free = false;
	bool				freemask_ok;
	bool				inuse;
	int				error = 0;

D
Darrick J. Wong 已提交
148
	if (xchk_should_terminate(bs->sc, &error))
D
Darrick J. Wong 已提交
149 150 151 152 153 154
		return error;

	dip = xfs_buf_offset(bp, clusterino * mp->m_sb.sb_inodesize);
	if (be16_to_cpu(dip->di_magic) != XFS_DINODE_MAGIC ||
	    (dip->di_version >= 3 &&
	     be64_to_cpu(dip->di_ino) != fsino + clusterino)) {
D
Darrick J. Wong 已提交
155
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
		goto out;
	}

	if (irec->ir_free & XFS_INOBT_MASK(chunkino + clusterino))
		inode_is_free = true;
	error = xfs_icache_inode_is_allocated(mp, bs->cur->bc_tp,
			fsino + clusterino, &inuse);
	if (error == -ENODATA) {
		/* Not cached, just read the disk buffer */
		freemask_ok = inode_is_free ^ !!(dip->di_mode);
		if (!bs->sc->try_harder && !freemask_ok)
			return -EDEADLOCK;
	} else if (error < 0) {
		/*
		 * Inode is only half assembled, or there was an IO error,
		 * or the verifier failed, so don't bother trying to check.
		 * The inode scrubber can deal with this.
		 */
		goto out;
	} else {
		/* Inode is all there. */
		freemask_ok = inode_is_free ^ inuse;
	}
	if (!freemask_ok)
D
Darrick J. Wong 已提交
180
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
181 182 183 184 185 186
out:
	return 0;
}

/* Make sure the free mask is consistent with what the inodes think. */
STATIC int
D
Darrick J. Wong 已提交
187 188
xchk_iallocbt_check_freemask(
	struct xchk_btree		*bs,
D
Darrick J. Wong 已提交
189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
	struct xfs_inobt_rec_incore	*irec)
{
	struct xfs_imap			imap;
	struct xfs_mount		*mp = bs->cur->bc_mp;
	struct xfs_dinode		*dip;
	struct xfs_buf			*bp;
	xfs_ino_t			fsino;
	xfs_agino_t			nr_inodes;
	xfs_agino_t			agino;
	xfs_agino_t			chunkino;
	xfs_agino_t			clusterino;
	xfs_agblock_t			agbno;
	uint16_t			holemask;
	uint16_t			ir_holemask;
	int				error = 0;

	/* Make sure the freemask matches the inode records. */
206 207
	nr_inodes = min_t(unsigned int, XFS_INODES_PER_CHUNK,
			mp->m_inodes_per_cluster);
D
Darrick J. Wong 已提交
208 209 210

	for (agino = irec->ir_startino;
	     agino < irec->ir_startino + XFS_INODES_PER_CHUNK;
211
	     agino += mp->m_inodes_per_cluster) {
D
Darrick J. Wong 已提交
212 213 214 215 216 217 218 219 220 221 222 223 224
		fsino = XFS_AGINO_TO_INO(mp, bs->cur->bc_private.a.agno, agino);
		chunkino = agino - irec->ir_startino;
		agbno = XFS_AGINO_TO_AGBNO(mp, agino);

		/* Compute the holemask mask for this cluster. */
		for (clusterino = 0, holemask = 0; clusterino < nr_inodes;
		     clusterino += XFS_INODES_PER_HOLEMASK_BIT)
			holemask |= XFS_INOBT_MASK((chunkino + clusterino) /
					XFS_INODES_PER_HOLEMASK_BIT);

		/* The whole cluster must be a hole or not a hole. */
		ir_holemask = (irec->ir_holemask & holemask);
		if (ir_holemask != holemask && ir_holemask != 0) {
D
Darrick J. Wong 已提交
225
			xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
226 227 228 229
			continue;
		}

		/* If any part of this is a hole, skip it. */
230
		if (ir_holemask) {
D
Darrick J. Wong 已提交
231
			xchk_xref_is_not_owned_by(bs->sc, agbno,
232
					mp->m_blocks_per_cluster,
233
					&XFS_RMAP_OINFO_INODES);
D
Darrick J. Wong 已提交
234
			continue;
235 236
		}

237
		xchk_xref_is_owned_by(bs->sc, agbno, mp->m_blocks_per_cluster,
238
				&XFS_RMAP_OINFO_INODES);
D
Darrick J. Wong 已提交
239 240 241 242

		/* Grab the inode cluster buffer. */
		imap.im_blkno = XFS_AGB_TO_DADDR(mp, bs->cur->bc_private.a.agno,
				agbno);
243
		imap.im_len = XFS_FSB_TO_BB(mp, mp->m_blocks_per_cluster);
D
Darrick J. Wong 已提交
244 245 246 247
		imap.im_boffset = 0;

		error = xfs_imap_to_bp(mp, bs->cur->bc_tp, &imap,
				&dip, &bp, 0, 0);
D
Darrick J. Wong 已提交
248
		if (!xchk_btree_xref_process_error(bs->sc, bs->cur, 0,
249
				&error))
D
Darrick J. Wong 已提交
250 251 252 253
			continue;

		/* Which inodes are free? */
		for (clusterino = 0; clusterino < nr_inodes; clusterino++) {
D
Darrick J. Wong 已提交
254
			error = xchk_iallocbt_check_cluster_freemask(bs,
D
Darrick J. Wong 已提交
255 256 257 258 259 260 261 262 263 264 265 266 267 268 269
					fsino, chunkino, clusterino, irec, bp);
			if (error) {
				xfs_trans_brelse(bs->cur->bc_tp, bp);
				return error;
			}
		}

		xfs_trans_brelse(bs->cur->bc_tp, bp);
	}

	return error;
}

/* Scrub an inobt/finobt record. */
STATIC int
D
Darrick J. Wong 已提交
270 271
xchk_iallocbt_rec(
	struct xchk_btree		*bs,
D
Darrick J. Wong 已提交
272 273 274
	union xfs_btree_rec		*rec)
{
	struct xfs_mount		*mp = bs->cur->bc_mp;
275
	struct xchk_iallocbt		*iabt = bs->private;
D
Darrick J. Wong 已提交
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291
	struct xfs_inobt_rec_incore	irec;
	uint64_t			holes;
	xfs_agnumber_t			agno = bs->cur->bc_private.a.agno;
	xfs_agino_t			agino;
	xfs_agblock_t			agbno;
	xfs_extlen_t			len;
	int				holecount;
	int				i;
	int				error = 0;
	unsigned int			real_freecount;
	uint16_t			holemask;

	xfs_inobt_btrec_to_irec(mp, rec, &irec);

	if (irec.ir_count > XFS_INODES_PER_CHUNK ||
	    irec.ir_freecount > XFS_INODES_PER_CHUNK)
D
Darrick J. Wong 已提交
292
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
293 294 295

	real_freecount = irec.ir_freecount +
			(XFS_INODES_PER_CHUNK - irec.ir_count);
D
Darrick J. Wong 已提交
296 297
	if (real_freecount != xchk_iallocbt_freecount(irec.ir_free))
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
298 299 300 301 302

	agino = irec.ir_startino;
	/* Record has to be properly aligned within the AG. */
	if (!xfs_verify_agino(mp, agno, agino) ||
	    !xfs_verify_agino(mp, agno, agino + XFS_INODES_PER_CHUNK - 1)) {
D
Darrick J. Wong 已提交
303
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
304 305 306 307 308
		goto out;
	}

	/* Make sure this record is aligned to cluster and inoalignmnt size. */
	agbno = XFS_AGINO_TO_AGBNO(mp, irec.ir_startino);
309
	if ((agbno & (mp->m_cluster_align - 1)) ||
310
	    (agbno & (mp->m_blocks_per_cluster - 1)))
D
Darrick J. Wong 已提交
311
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
312

313
	iabt->inodes += irec.ir_count;
314

D
Darrick J. Wong 已提交
315 316 317 318 319
	/* Handle non-sparse inodes */
	if (!xfs_inobt_issparse(irec.ir_holemask)) {
		len = XFS_B_TO_FSB(mp,
				XFS_INODES_PER_CHUNK * mp->m_sb.sb_inodesize);
		if (irec.ir_count != XFS_INODES_PER_CHUNK)
D
Darrick J. Wong 已提交
320
			xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
321

D
Darrick J. Wong 已提交
322
		if (!xchk_iallocbt_chunk(bs, &irec, agino, len))
D
Darrick J. Wong 已提交
323 324 325 326 327 328 329 330 331 332 333 334
			goto out;
		goto check_freemask;
	}

	/* Check each chunk of a sparse inode cluster. */
	holemask = irec.ir_holemask;
	holecount = 0;
	len = XFS_B_TO_FSB(mp,
			XFS_INODES_PER_HOLEMASK_BIT * mp->m_sb.sb_inodesize);
	holes = ~xfs_inobt_irec_to_allocmask(&irec);
	if ((holes & irec.ir_free) != holes ||
	    irec.ir_freecount > irec.ir_count)
D
Darrick J. Wong 已提交
335
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
336 337 338 339

	for (i = 0; i < XFS_INOBT_HOLEMASK_BITS; i++) {
		if (holemask & 1)
			holecount += XFS_INODES_PER_HOLEMASK_BIT;
D
Darrick J. Wong 已提交
340
		else if (!xchk_iallocbt_chunk(bs, &irec, agino, len))
D
Darrick J. Wong 已提交
341 342 343 344 345 346 347
			break;
		holemask >>= 1;
		agino += XFS_INODES_PER_HOLEMASK_BIT;
	}

	if (holecount > XFS_INODES_PER_CHUNK ||
	    holecount + irec.ir_count != XFS_INODES_PER_CHUNK)
D
Darrick J. Wong 已提交
348
		xchk_btree_set_corrupt(bs->sc, bs->cur, 0);
D
Darrick J. Wong 已提交
349 350

check_freemask:
D
Darrick J. Wong 已提交
351
	error = xchk_iallocbt_check_freemask(bs, &irec);
D
Darrick J. Wong 已提交
352 353 354 355 356 357 358
	if (error)
		goto out;

out:
	return error;
}

359 360 361 362 363
/*
 * Make sure the inode btrees are as large as the rmap thinks they are.
 * Don't bother if we're missing btree cursors, as we're already corrupt.
 */
STATIC void
D
Darrick J. Wong 已提交
364
xchk_iallocbt_xref_rmap_btreeblks(
365
	struct xfs_scrub	*sc,
366
	int			which)
367
{
368 369 370 371
	xfs_filblks_t		blocks;
	xfs_extlen_t		inobt_blocks = 0;
	xfs_extlen_t		finobt_blocks = 0;
	int			error;
372 373

	if (!sc->sa.ino_cur || !sc->sa.rmap_cur ||
374
	    (xfs_sb_version_hasfinobt(&sc->mp->m_sb) && !sc->sa.fino_cur) ||
D
Darrick J. Wong 已提交
375
	    xchk_skip_xref(sc->sm))
376 377 378 379
		return;

	/* Check that we saw as many inobt blocks as the rmap says. */
	error = xfs_btree_count_blocks(sc->sa.ino_cur, &inobt_blocks);
D
Darrick J. Wong 已提交
380
	if (!xchk_process_error(sc, 0, 0, &error))
381 382 383 384
		return;

	if (sc->sa.fino_cur) {
		error = xfs_btree_count_blocks(sc->sa.fino_cur, &finobt_blocks);
D
Darrick J. Wong 已提交
385
		if (!xchk_process_error(sc, 0, 0, &error))
386 387 388
			return;
	}

389 390
	error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur,
			&XFS_RMAP_OINFO_INOBT, &blocks);
D
Darrick J. Wong 已提交
391
	if (!xchk_should_check_xref(sc, &error, &sc->sa.rmap_cur))
392 393
		return;
	if (blocks != inobt_blocks + finobt_blocks)
D
Darrick J. Wong 已提交
394
		xchk_btree_set_corrupt(sc, sc->sa.ino_cur, 0);
395 396 397 398 399 400 401
}

/*
 * Make sure that the inobt records point to the same number of blocks as
 * the rmap says are owned by inodes.
 */
STATIC void
D
Darrick J. Wong 已提交
402
xchk_iallocbt_xref_rmap_inodes(
403
	struct xfs_scrub	*sc,
404
	int			which,
405
	unsigned long long	inodes)
406
{
407
	xfs_filblks_t		blocks;
408
	xfs_filblks_t		inode_blocks;
409
	int			error;
410

D
Darrick J. Wong 已提交
411
	if (!sc->sa.rmap_cur || xchk_skip_xref(sc->sm))
412 413 414
		return;

	/* Check that we saw as many inode blocks as the rmap knows about. */
415 416
	error = xchk_count_rmap_ownedby_ag(sc, sc->sa.rmap_cur,
			&XFS_RMAP_OINFO_INODES, &blocks);
D
Darrick J. Wong 已提交
417
	if (!xchk_should_check_xref(sc, &error, &sc->sa.rmap_cur))
418
		return;
419
	inode_blocks = XFS_B_TO_FSB(sc->mp, inodes * sc->mp->m_sb.sb_inodesize);
420
	if (blocks != inode_blocks)
D
Darrick J. Wong 已提交
421
		xchk_btree_xref_set_corrupt(sc, sc->sa.rmap_cur, 0);
422 423
}

D
Darrick J. Wong 已提交
424 425
/* Scrub the inode btrees for some AG. */
STATIC int
D
Darrick J. Wong 已提交
426
xchk_iallocbt(
427
	struct xfs_scrub	*sc,
428
	xfs_btnum_t		which)
D
Darrick J. Wong 已提交
429
{
430
	struct xfs_btree_cur	*cur;
431 432 433
	struct xchk_iallocbt	iabt = {
		.inodes		= 0,
	};
434
	int			error;
D
Darrick J. Wong 已提交
435 436

	cur = which == XFS_BTNUM_INO ? sc->sa.ino_cur : sc->sa.fino_cur;
437
	error = xchk_btree(sc, cur, xchk_iallocbt_rec, &XFS_RMAP_OINFO_INOBT,
438
			&iabt);
439 440 441
	if (error)
		return error;

D
Darrick J. Wong 已提交
442
	xchk_iallocbt_xref_rmap_btreeblks(sc, which);
443 444 445 446 447 448 449 450 451

	/*
	 * If we're scrubbing the inode btree, inode_blocks is the number of
	 * blocks pointed to by all the inode chunk records.  Therefore, we
	 * should compare to the number of inode chunk blocks that the rmap
	 * knows about.  We can't do this for the finobt since it only points
	 * to inode chunks with free inodes.
	 */
	if (which == XFS_BTNUM_INO)
452
		xchk_iallocbt_xref_rmap_inodes(sc, which, iabt.inodes);
453 454

	return error;
D
Darrick J. Wong 已提交
455 456 457
}

int
D
Darrick J. Wong 已提交
458
xchk_inobt(
459
	struct xfs_scrub	*sc)
D
Darrick J. Wong 已提交
460
{
D
Darrick J. Wong 已提交
461
	return xchk_iallocbt(sc, XFS_BTNUM_INO);
D
Darrick J. Wong 已提交
462 463 464
}

int
D
Darrick J. Wong 已提交
465
xchk_finobt(
466
	struct xfs_scrub	*sc)
D
Darrick J. Wong 已提交
467
{
D
Darrick J. Wong 已提交
468
	return xchk_iallocbt(sc, XFS_BTNUM_FINO);
D
Darrick J. Wong 已提交
469
}
470 471 472

/* See if an inode btree has (or doesn't have) an inode chunk record. */
static inline void
D
Darrick J. Wong 已提交
473
xchk_xref_inode_check(
474
	struct xfs_scrub	*sc,
475 476 477 478
	xfs_agblock_t		agbno,
	xfs_extlen_t		len,
	struct xfs_btree_cur	**icur,
	bool			should_have_inodes)
479
{
480 481
	bool			has_inodes;
	int			error;
482

D
Darrick J. Wong 已提交
483
	if (!(*icur) || xchk_skip_xref(sc->sm))
484 485 486
		return;

	error = xfs_ialloc_has_inodes_at_extent(*icur, agbno, len, &has_inodes);
D
Darrick J. Wong 已提交
487
	if (!xchk_should_check_xref(sc, &error, icur))
488 489
		return;
	if (has_inodes != should_have_inodes)
D
Darrick J. Wong 已提交
490
		xchk_btree_xref_set_corrupt(sc, *icur, 0);
491 492 493 494
}

/* xref check that the extent is not covered by inodes */
void
D
Darrick J. Wong 已提交
495
xchk_xref_is_not_inode_chunk(
496
	struct xfs_scrub	*sc,
497 498
	xfs_agblock_t		agbno,
	xfs_extlen_t		len)
499
{
D
Darrick J. Wong 已提交
500 501
	xchk_xref_inode_check(sc, agbno, len, &sc->sa.ino_cur, false);
	xchk_xref_inode_check(sc, agbno, len, &sc->sa.fino_cur, false);
502 503 504 505
}

/* xref check that the extent is covered by inodes */
void
D
Darrick J. Wong 已提交
506
xchk_xref_is_inode_chunk(
507
	struct xfs_scrub	*sc,
508 509
	xfs_agblock_t		agbno,
	xfs_extlen_t		len)
510
{
D
Darrick J. Wong 已提交
511
	xchk_xref_inode_check(sc, agbno, len, &sc->sa.ino_cur, true);
512
}