Commit 14dd46cf authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Darrick J. Wong
Browse files

xfs: split xfs_inobt_init_cursor



Split xfs_inobt_init_cursor into separate routines for the inobt and
finobt to prepare for the removal of the xfs_btnum global enumeration
of btree types.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent 8541a7d9
Loading
Loading
Loading
Loading
+13 −10
Original line number Diff line number Diff line
@@ -213,7 +213,10 @@ xfs_inobt_insert(
	int			i;
	int			error;

	cur = xfs_inobt_init_cursor(pag, tp, agbp, btnum);
	if (btnum == XFS_BTNUM_FINO)
		cur = xfs_finobt_init_cursor(pag, tp, agbp);
	else
		cur = xfs_inobt_init_cursor(pag, tp, agbp);

	for (thisino = newino;
	     thisino < newino + newlen;
@@ -554,7 +557,7 @@ xfs_inobt_insert_sprec(
	int				i;
	struct xfs_inobt_rec_incore	rec;

	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_INO);
	cur = xfs_inobt_init_cursor(pag, tp, agbp);

	/* the new record is pre-aligned so we know where to look */
	error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i);
@@ -650,7 +653,7 @@ xfs_finobt_insert_sprec(
	int				error;
	int				i;

	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_FINO);
	cur = xfs_finobt_init_cursor(pag, tp, agbp);

	/* the new record is pre-aligned so we know where to look */
	error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i);
@@ -1083,7 +1086,7 @@ xfs_dialloc_ag_inobt(
	ASSERT(pag->pagi_freecount > 0);

 restart_pagno:
	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_INO);
	cur = xfs_inobt_init_cursor(pag, tp, agbp);
	/*
	 * If pagino is 0 (this is the root inode allocation) use newino.
	 * This must work because we've just allocated some.
@@ -1557,7 +1560,7 @@ xfs_dialloc_ag(
	if (!pagino)
		pagino = be32_to_cpu(agi->agi_newino);

	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_FINO);
	cur = xfs_finobt_init_cursor(pag, tp, agbp);

	error = xfs_check_agi_freecount(cur);
	if (error)
@@ -1600,7 +1603,7 @@ xfs_dialloc_ag(
	 * the original freecount. If all is well, make the equivalent update to
	 * the inobt using the finobt record and offset information.
	 */
	icur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_INO);
	icur = xfs_inobt_init_cursor(pag, tp, agbp);

	error = xfs_check_agi_freecount(icur);
	if (error)
@@ -2017,7 +2020,7 @@ xfs_difree_inobt(
	/*
	 * Initialize the cursor.
	 */
	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_INO);
	cur = xfs_inobt_init_cursor(pag, tp, agbp);

	error = xfs_check_agi_freecount(cur);
	if (error)
@@ -2144,7 +2147,7 @@ xfs_difree_finobt(
	int				error;
	int				i;

	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_FINO);
	cur = xfs_finobt_init_cursor(pag, tp, agbp);

	error = xfs_inobt_lookup(cur, ibtrec->ir_startino, XFS_LOOKUP_EQ, &i);
	if (error)
@@ -2344,7 +2347,7 @@ xfs_imap_lookup(
	 * we have a record, we need to ensure it contains the inode number
	 * we are looking up.
	 */
	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_INO);
	cur = xfs_inobt_init_cursor(pag, tp, agbp);
	error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i);
	if (!error) {
		if (i)
@@ -3063,7 +3066,7 @@ xfs_ialloc_check_shrink(
	if (!xfs_has_sparseinodes(pag->pag_mount))
		return 0;

	cur = xfs_inobt_init_cursor(pag, tp, agibp, XFS_BTNUM_INO);
	cur = xfs_inobt_init_cursor(pag, tp, agibp);

	/* Look up the inobt record that would correspond to the new EOFS. */
	agino = XFS_AGB_TO_AGINO(pag->pag_mount, new_length);
+38 −13
Original line number Diff line number Diff line
@@ -38,7 +38,15 @@ xfs_inobt_dup_cursor(
	struct xfs_btree_cur	*cur)
{
	return xfs_inobt_init_cursor(cur->bc_ag.pag, cur->bc_tp,
			cur->bc_ag.agbp, cur->bc_btnum);
			cur->bc_ag.agbp);
}

STATIC struct xfs_btree_cur *
xfs_finobt_dup_cursor(
	struct xfs_btree_cur	*cur)
{
	return xfs_finobt_init_cursor(cur->bc_ag.pag, cur->bc_tp,
			cur->bc_ag.agbp);
}

STATIC void
@@ -441,7 +449,7 @@ const struct xfs_btree_ops xfs_finobt_ops = {
	.statoff		= XFS_STATS_CALC_INDEX(xs_fibt_2),
	.sick_mask		= XFS_SICK_AG_FINOBT,

	.dup_cursor		= xfs_inobt_dup_cursor,
	.dup_cursor		= xfs_finobt_dup_cursor,
	.set_root		= xfs_finobt_set_root,
	.alloc_block		= xfs_finobt_alloc_block,
	.free_block		= xfs_finobt_free_block,
@@ -468,28 +476,45 @@ struct xfs_btree_cur *
xfs_inobt_init_cursor(
	struct xfs_perag	*pag,
	struct xfs_trans	*tp,
	struct xfs_buf		*agbp,
	xfs_btnum_t		btnum)		/* ialloc or free ino btree */
	struct xfs_buf		*agbp)
{
	struct xfs_mount	*mp = pag->pag_mount;
	const struct xfs_btree_ops *ops = &xfs_inobt_ops;
	struct xfs_btree_cur	*cur;

	ASSERT(btnum == XFS_BTNUM_INO || btnum == XFS_BTNUM_FINO);
	cur = xfs_btree_alloc_cursor(mp, tp, XFS_BTNUM_INO, &xfs_inobt_ops,
			M_IGEO(mp)->inobt_maxlevels, xfs_inobt_cur_cache);
	cur->bc_ag.pag = xfs_perag_hold(pag);
	cur->bc_ag.agbp = agbp;
	if (agbp) {
		struct xfs_agi		*agi = agbp->b_addr;

	if (btnum == XFS_BTNUM_FINO)
		ops = &xfs_finobt_ops;
		cur->bc_nlevels = be32_to_cpu(agi->agi_level);
	}
	return cur;
}

/*
 * Create a free inode btree cursor.
 *
 * For staging cursors tp and agbp are NULL.
 */
struct xfs_btree_cur *
xfs_finobt_init_cursor(
	struct xfs_perag	*pag,
	struct xfs_trans	*tp,
	struct xfs_buf		*agbp)
{
	struct xfs_mount	*mp = pag->pag_mount;
	struct xfs_btree_cur	*cur;

	cur = xfs_btree_alloc_cursor(mp, tp, btnum, ops,
	cur = xfs_btree_alloc_cursor(mp, tp, XFS_BTNUM_FINO, &xfs_finobt_ops,
			M_IGEO(mp)->inobt_maxlevels, xfs_inobt_cur_cache);
	cur->bc_ag.pag = xfs_perag_hold(pag);
	cur->bc_ag.agbp = agbp;
	if (agbp) {
		struct xfs_agi		*agi = agbp->b_addr;

		cur->bc_nlevels = (btnum == XFS_BTNUM_INO) ?
			be32_to_cpu(agi->agi_level) :
			be32_to_cpu(agi->agi_free_level);
		cur->bc_nlevels = be32_to_cpu(agi->agi_free_level);
	}
	return cur;
}
@@ -724,7 +749,7 @@ xfs_finobt_count_blocks(
	if (error)
		return error;

	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_FINO);
	cur = xfs_inobt_init_cursor(pag, tp, agbp);
	error = xfs_btree_count_blocks(cur, tree_blocks);
	xfs_btree_del_cursor(cur, error);
	xfs_trans_brelse(tp, agbp);
+4 −2
Original line number Diff line number Diff line
@@ -46,8 +46,10 @@ struct xfs_perag;
		 (maxrecs) * sizeof(xfs_inobt_key_t) + \
		 ((index) - 1) * sizeof(xfs_inobt_ptr_t)))

extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_perag *pag,
		struct xfs_trans *tp, struct xfs_buf *agbp, xfs_btnum_t btnum);
struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_perag *pag,
		struct xfs_trans *tp, struct xfs_buf *agbp);
struct xfs_btree_cur *xfs_finobt_init_cursor(struct xfs_perag *pag,
		struct xfs_trans *tp, struct xfs_buf *agbp);
extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int);

/* ir_holemask to inode allocation bitmap conversion */
+2 −3
Original line number Diff line number Diff line
@@ -894,7 +894,7 @@ xrep_agi_calc_from_btrees(
	xfs_agino_t		freecount;
	int			error;

	cur = xfs_inobt_init_cursor(sc->sa.pag, sc->tp, agi_bp, XFS_BTNUM_INO);
	cur = xfs_inobt_init_cursor(sc->sa.pag, sc->tp, agi_bp);
	error = xfs_ialloc_count_inodes(cur, &count, &freecount);
	if (error)
		goto err;
@@ -914,8 +914,7 @@ xrep_agi_calc_from_btrees(
	if (xfs_has_finobt(mp) && xfs_has_inobtcounts(mp)) {
		xfs_agblock_t	blocks;

		cur = xfs_inobt_init_cursor(sc->sa.pag, sc->tp, agi_bp,
				XFS_BTNUM_FINO);
		cur = xfs_finobt_init_cursor(sc->sa.pag, sc->tp, agi_bp);
		error = xfs_btree_count_blocks(cur, &blocks);
		if (error)
			goto err;
+4 −4
Original line number Diff line number Diff line
@@ -620,15 +620,15 @@ xchk_ag_btcur_init(

	if (sa->agi_bp) {
		/* Set up a inobt cursor for cross-referencing. */
		sa->ino_cur = xfs_inobt_init_cursor(sa->pag, sc->tp, sa->agi_bp,
				XFS_BTNUM_INO);
		sa->ino_cur = xfs_inobt_init_cursor(sa->pag, sc->tp,
				sa->agi_bp);
		xchk_ag_btree_del_cursor_if_sick(sc, &sa->ino_cur,
				XFS_SCRUB_TYPE_INOBT);

		/* Set up a finobt cursor for cross-referencing. */
		if (xfs_has_finobt(mp)) {
			sa->fino_cur = xfs_inobt_init_cursor(sa->pag, sc->tp,
					sa->agi_bp, XFS_BTNUM_FINO);
			sa->fino_cur = xfs_finobt_init_cursor(sa->pag, sc->tp,
					sa->agi_bp);
			xchk_ag_btree_del_cursor_if_sick(sc, &sa->fino_cur,
					XFS_SCRUB_TYPE_FINOBT);
		}
Loading