Commit bab8b795 authored by Dave Chinner's avatar Dave Chinner
Browse files

xfs: inobt can use perags in many more places than it does



Lots of code in the inobt infrastructure is passed both xfs_mount
and perags. We only need perags for the per-ag inode allocation
code, so reduce the duplication by passing only the perags as the
primary object.

This ends up reducing the code size by a bit:

	   text    data     bss     dec     hex filename
orig	1138878  323979     548 1463405  16546d (TOTALS)
patched	1138709  323979     548 1463236  1653c4 (TOTALS)

Signed-off-by: default avatarDave Chinner <dchinner@redhat.com>
Reviewed-by: default avatarAllison Henderson <allison.henderson@oracle.com>
Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
parent dedab3e4
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -264,7 +264,7 @@ xfs_ag_resv_init(
		if (error)
			goto out;

		error = xfs_finobt_calc_reserves(mp, tp, pag, &ask, &used);
		error = xfs_finobt_calc_reserves(pag, tp, &ask, &used);
		if (error)
			goto out;

+12 −13
Original line number Diff line number Diff line
@@ -176,13 +176,12 @@ xfs_inobt_insert(
	xfs_agino_t		newlen,
	xfs_btnum_t		btnum)
{
	struct xfs_mount	*mp = pag->pag_mount;
	struct xfs_btree_cur	*cur;
	xfs_agino_t		thisino;
	int			i;
	int			error;

	cur = xfs_inobt_init_cursor(mp, tp, agbp, pag, btnum);
	cur = xfs_inobt_init_cursor(pag, tp, agbp, btnum);

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

	cur = xfs_inobt_init_cursor(mp, tp, agbp, pag, btnum);
	cur = xfs_inobt_init_cursor(pag, tp, agbp, btnum);

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

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

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

	error = xfs_check_agi_freecount(cur);
	if (error)
@@ -1500,7 +1499,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(mp, tp, agbp, pag, XFS_BTNUM_INO);
	icur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_INO);

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

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

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

	error = xfs_inobt_lookup(cur, ibtrec->ir_startino, XFS_LOOKUP_EQ, &i);
	if (error)
@@ -2248,7 +2247,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(mp, tp, agbp, pag, XFS_BTNUM_INO);
	cur = xfs_inobt_init_cursor(pag, tp, agbp, XFS_BTNUM_INO);
	error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i);
	if (!error) {
		if (i)
@@ -2937,17 +2936,17 @@ xfs_ialloc_check_shrink(
{
	struct xfs_inobt_rec_incore rec;
	struct xfs_btree_cur	*cur;
	struct xfs_mount	*mp = tp->t_mountp;
	xfs_agino_t		agino = XFS_AGB_TO_AGINO(mp, new_length);
	xfs_agino_t		agino;
	int			has;
	int			error;

	if (!xfs_has_sparseinodes(mp))
	if (!xfs_has_sparseinodes(pag->pag_mount))
		return 0;

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

	/* Look up the inobt record that would correspond to the new EOFS. */
	agino = XFS_AGB_TO_AGINO(pag->pag_mount, new_length);
	error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &has);
	if (error || !has)
		goto out;
+16 −21
Original line number Diff line number Diff line
@@ -36,8 +36,8 @@ STATIC struct xfs_btree_cur *
xfs_inobt_dup_cursor(
	struct xfs_btree_cur	*cur)
{
	return xfs_inobt_init_cursor(cur->bc_mp, cur->bc_tp,
			cur->bc_ag.agbp, cur->bc_ag.pag, cur->bc_btnum);
	return xfs_inobt_init_cursor(cur->bc_ag.pag, cur->bc_tp,
			cur->bc_ag.agbp, cur->bc_btnum);
}

STATIC void
@@ -427,11 +427,11 @@ static const struct xfs_btree_ops xfs_finobt_ops = {
 */
static struct xfs_btree_cur *
xfs_inobt_init_common(
	struct xfs_mount	*mp,		/* file system mount point */
	struct xfs_trans	*tp,		/* transaction pointer */
	struct xfs_perag	*pag,
	struct xfs_trans	*tp,		/* transaction pointer */
	xfs_btnum_t		btnum)		/* ialloc or free ino btree */
{
	struct xfs_mount	*mp = pag->pag_mount;
	struct xfs_btree_cur	*cur;

	cur = xfs_btree_alloc_cursor(mp, tp, btnum,
@@ -456,16 +456,15 @@ xfs_inobt_init_common(
/* Create an inode btree cursor. */
struct xfs_btree_cur *
xfs_inobt_init_cursor(
	struct xfs_mount	*mp,
	struct xfs_perag	*pag,
	struct xfs_trans	*tp,
	struct xfs_buf		*agbp,
	struct xfs_perag	*pag,
	xfs_btnum_t		btnum)
{
	struct xfs_btree_cur	*cur;
	struct xfs_agi		*agi = agbp->b_addr;

	cur = xfs_inobt_init_common(mp, tp, pag, btnum);
	cur = xfs_inobt_init_common(pag, tp, btnum);
	if (btnum == XFS_BTNUM_INO)
		cur->bc_nlevels = be32_to_cpu(agi->agi_level);
	else
@@ -477,14 +476,13 @@ xfs_inobt_init_cursor(
/* Create an inode btree cursor with a fake root for staging. */
struct xfs_btree_cur *
xfs_inobt_stage_cursor(
	struct xfs_mount	*mp,
	struct xbtree_afakeroot	*afake,
	struct xfs_perag	*pag,
	struct xbtree_afakeroot	*afake,
	xfs_btnum_t		btnum)
{
	struct xfs_btree_cur	*cur;

	cur = xfs_inobt_init_common(mp, NULL, pag, btnum);
	cur = xfs_inobt_init_common(pag, NULL, btnum);
	xfs_btree_stage_afakeroot(cur, afake);
	return cur;
}
@@ -708,9 +706,8 @@ xfs_inobt_max_size(
/* Read AGI and create inobt cursor. */
int
xfs_inobt_cur(
	struct xfs_mount	*mp,
	struct xfs_trans	*tp,
	struct xfs_perag	*pag,
	struct xfs_trans	*tp,
	xfs_btnum_t		which,
	struct xfs_btree_cur	**curpp,
	struct xfs_buf		**agi_bpp)
@@ -725,16 +722,15 @@ xfs_inobt_cur(
	if (error)
		return error;

	cur = xfs_inobt_init_cursor(mp, tp, *agi_bpp, pag, which);
	cur = xfs_inobt_init_cursor(pag, tp, *agi_bpp, which);
	*curpp = cur;
	return 0;
}

static int
xfs_inobt_count_blocks(
	struct xfs_mount	*mp,
	struct xfs_trans	*tp,
	struct xfs_perag	*pag,
	struct xfs_trans	*tp,
	xfs_btnum_t		btnum,
	xfs_extlen_t		*tree_blocks)
{
@@ -742,7 +738,7 @@ xfs_inobt_count_blocks(
	struct xfs_btree_cur	*cur = NULL;
	int			error;

	error = xfs_inobt_cur(mp, tp, pag, btnum, &cur, &agbp);
	error = xfs_inobt_cur(pag, tp, btnum, &cur, &agbp);
	if (error)
		return error;

@@ -779,22 +775,21 @@ xfs_finobt_read_blocks(
 */
int
xfs_finobt_calc_reserves(
	struct xfs_mount	*mp,
	struct xfs_trans	*tp,
	struct xfs_perag	*pag,
	struct xfs_trans	*tp,
	xfs_extlen_t		*ask,
	xfs_extlen_t		*used)
{
	xfs_extlen_t		tree_len = 0;
	int			error;

	if (!xfs_has_finobt(mp))
	if (!xfs_has_finobt(pag->pag_mount))
		return 0;

	if (xfs_has_inobtcounts(mp))
	if (xfs_has_inobtcounts(pag->pag_mount))
		error = xfs_finobt_read_blocks(pag, tp, &tree_len);
	else
		error = xfs_inobt_count_blocks(mp, tp, pag, XFS_BTNUM_FINO,
		error = xfs_inobt_count_blocks(pag, tp, XFS_BTNUM_FINO,
				&tree_len);
	if (error)
		return error;
+9 −11
Original line number Diff line number Diff line
@@ -46,12 +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_mount *mp,
		struct xfs_trans *tp, struct xfs_buf *agbp,
		struct xfs_perag *pag, xfs_btnum_t btnum);
struct xfs_btree_cur *xfs_inobt_stage_cursor(struct xfs_mount *mp,
		struct xbtree_afakeroot *afake, struct xfs_perag *pag,
		xfs_btnum_t btnum);
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_stage_cursor(struct xfs_perag *pag,
		struct xbtree_afakeroot *afake, xfs_btnum_t btnum);
extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int);

/* ir_holemask to inode allocation bitmap conversion */
@@ -64,13 +62,13 @@ int xfs_inobt_rec_check_count(struct xfs_mount *,
#define xfs_inobt_rec_check_count(mp, rec)	0
#endif	/* DEBUG */

int xfs_finobt_calc_reserves(struct xfs_mount *mp, struct xfs_trans *tp,
		struct xfs_perag *pag, xfs_extlen_t *ask, xfs_extlen_t *used);
int xfs_finobt_calc_reserves(struct xfs_perag *perag, struct xfs_trans *tp,
		xfs_extlen_t *ask, xfs_extlen_t *used);
extern xfs_extlen_t xfs_iallocbt_calc_size(struct xfs_mount *mp,
		unsigned long long len);
int xfs_inobt_cur(struct xfs_mount *mp, struct xfs_trans *tp,
		struct xfs_perag *pag, xfs_btnum_t btnum,
		struct xfs_btree_cur **curpp, struct xfs_buf **agi_bpp);
int xfs_inobt_cur(struct xfs_perag *pag, struct xfs_trans *tp,
		xfs_btnum_t btnum, struct xfs_btree_cur **curpp,
		struct xfs_buf **agi_bpp);

void xfs_inobt_commit_staged_btree(struct xfs_btree_cur *cur,
		struct xfs_trans *tp, struct xfs_buf *agbp);
+3 −4
Original line number Diff line number Diff line
@@ -873,8 +873,7 @@ xrep_agi_calc_from_btrees(
	xfs_agino_t		freecount;
	int			error;

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

		cur = xfs_inobt_init_cursor(mp, sc->tp, agi_bp,
				sc->sa.pag, XFS_BTNUM_FINO);
		cur = xfs_inobt_init_cursor(sc->sa.pag, sc->tp, agi_bp,
				XFS_BTNUM_FINO);
		error = xfs_btree_count_blocks(cur, &blocks);
		if (error)
			goto err;
Loading