Commit bab8b795 authored by Dave Chinner's avatar Dave Chinner

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
...@@ -264,7 +264,7 @@ xfs_ag_resv_init( ...@@ -264,7 +264,7 @@ xfs_ag_resv_init(
if (error) if (error)
goto out; goto out;
error = xfs_finobt_calc_reserves(mp, tp, pag, &ask, &used); error = xfs_finobt_calc_reserves(pag, tp, &ask, &used);
if (error) if (error)
goto out; goto out;
......
...@@ -176,13 +176,12 @@ xfs_inobt_insert( ...@@ -176,13 +176,12 @@ xfs_inobt_insert(
xfs_agino_t newlen, xfs_agino_t newlen,
xfs_btnum_t btnum) xfs_btnum_t btnum)
{ {
struct xfs_mount *mp = pag->pag_mount;
struct xfs_btree_cur *cur; struct xfs_btree_cur *cur;
xfs_agino_t thisino; xfs_agino_t thisino;
int i; int i;
int error; int error;
cur = xfs_inobt_init_cursor(mp, tp, agbp, pag, btnum); cur = xfs_inobt_init_cursor(pag, tp, agbp, btnum);
for (thisino = newino; for (thisino = newino;
thisino < newino + newlen; thisino < newino + newlen;
...@@ -527,7 +526,7 @@ xfs_inobt_insert_sprec( ...@@ -527,7 +526,7 @@ xfs_inobt_insert_sprec(
int i; int i;
struct xfs_inobt_rec_incore rec; 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 */ /* the new record is pre-aligned so we know where to look */
error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i); error = xfs_inobt_lookup(cur, nrec->ir_startino, XFS_LOOKUP_EQ, &i);
...@@ -1004,7 +1003,7 @@ xfs_dialloc_ag_inobt( ...@@ -1004,7 +1003,7 @@ xfs_dialloc_ag_inobt(
ASSERT(pag->pagi_freecount > 0); ASSERT(pag->pagi_freecount > 0);
restart_pagno: 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. * If pagino is 0 (this is the root inode allocation) use newino.
* This must work because we've just allocated some. * This must work because we've just allocated some.
...@@ -1457,7 +1456,7 @@ xfs_dialloc_ag( ...@@ -1457,7 +1456,7 @@ xfs_dialloc_ag(
if (!pagino) if (!pagino)
pagino = be32_to_cpu(agi->agi_newino); 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); error = xfs_check_agi_freecount(cur);
if (error) if (error)
...@@ -1500,7 +1499,7 @@ xfs_dialloc_ag( ...@@ -1500,7 +1499,7 @@ xfs_dialloc_ag(
* the original freecount. If all is well, make the equivalent update to * the original freecount. If all is well, make the equivalent update to
* the inobt using the finobt record and offset information. * 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); error = xfs_check_agi_freecount(icur);
if (error) if (error)
...@@ -1926,7 +1925,7 @@ xfs_difree_inobt( ...@@ -1926,7 +1925,7 @@ xfs_difree_inobt(
/* /*
* Initialize the cursor. * 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); error = xfs_check_agi_freecount(cur);
if (error) if (error)
...@@ -2051,7 +2050,7 @@ xfs_difree_finobt( ...@@ -2051,7 +2050,7 @@ xfs_difree_finobt(
int error; int error;
int i; 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); error = xfs_inobt_lookup(cur, ibtrec->ir_startino, XFS_LOOKUP_EQ, &i);
if (error) if (error)
...@@ -2248,7 +2247,7 @@ xfs_imap_lookup( ...@@ -2248,7 +2247,7 @@ xfs_imap_lookup(
* we have a record, we need to ensure it contains the inode number * we have a record, we need to ensure it contains the inode number
* we are looking up. * 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); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &i);
if (!error) { if (!error) {
if (i) if (i)
...@@ -2937,17 +2936,17 @@ xfs_ialloc_check_shrink( ...@@ -2937,17 +2936,17 @@ xfs_ialloc_check_shrink(
{ {
struct xfs_inobt_rec_incore rec; struct xfs_inobt_rec_incore rec;
struct xfs_btree_cur *cur; struct xfs_btree_cur *cur;
struct xfs_mount *mp = tp->t_mountp; xfs_agino_t agino;
xfs_agino_t agino = XFS_AGB_TO_AGINO(mp, new_length);
int has; int has;
int error; int error;
if (!xfs_has_sparseinodes(mp)) if (!xfs_has_sparseinodes(pag->pag_mount))
return 0; 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. */ /* 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); error = xfs_inobt_lookup(cur, agino, XFS_LOOKUP_LE, &has);
if (error || !has) if (error || !has)
goto out; goto out;
......
...@@ -36,8 +36,8 @@ STATIC struct xfs_btree_cur * ...@@ -36,8 +36,8 @@ STATIC struct xfs_btree_cur *
xfs_inobt_dup_cursor( xfs_inobt_dup_cursor(
struct xfs_btree_cur *cur) struct xfs_btree_cur *cur)
{ {
return xfs_inobt_init_cursor(cur->bc_mp, cur->bc_tp, return xfs_inobt_init_cursor(cur->bc_ag.pag, cur->bc_tp,
cur->bc_ag.agbp, cur->bc_ag.pag, cur->bc_btnum); cur->bc_ag.agbp, cur->bc_btnum);
} }
STATIC void STATIC void
...@@ -427,11 +427,11 @@ static const struct xfs_btree_ops xfs_finobt_ops = { ...@@ -427,11 +427,11 @@ static const struct xfs_btree_ops xfs_finobt_ops = {
*/ */
static struct xfs_btree_cur * static struct xfs_btree_cur *
xfs_inobt_init_common( xfs_inobt_init_common(
struct xfs_mount *mp, /* file system mount point */
struct xfs_trans *tp, /* transaction pointer */
struct xfs_perag *pag, struct xfs_perag *pag,
struct xfs_trans *tp, /* transaction pointer */
xfs_btnum_t btnum) /* ialloc or free ino btree */ xfs_btnum_t btnum) /* ialloc or free ino btree */
{ {
struct xfs_mount *mp = pag->pag_mount;
struct xfs_btree_cur *cur; struct xfs_btree_cur *cur;
cur = xfs_btree_alloc_cursor(mp, tp, btnum, cur = xfs_btree_alloc_cursor(mp, tp, btnum,
...@@ -456,16 +456,15 @@ xfs_inobt_init_common( ...@@ -456,16 +456,15 @@ xfs_inobt_init_common(
/* Create an inode btree cursor. */ /* Create an inode btree cursor. */
struct xfs_btree_cur * struct xfs_btree_cur *
xfs_inobt_init_cursor( xfs_inobt_init_cursor(
struct xfs_mount *mp, struct xfs_perag *pag,
struct xfs_trans *tp, struct xfs_trans *tp,
struct xfs_buf *agbp, struct xfs_buf *agbp,
struct xfs_perag *pag,
xfs_btnum_t btnum) xfs_btnum_t btnum)
{ {
struct xfs_btree_cur *cur; struct xfs_btree_cur *cur;
struct xfs_agi *agi = agbp->b_addr; 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) if (btnum == XFS_BTNUM_INO)
cur->bc_nlevels = be32_to_cpu(agi->agi_level); cur->bc_nlevels = be32_to_cpu(agi->agi_level);
else else
...@@ -477,14 +476,13 @@ xfs_inobt_init_cursor( ...@@ -477,14 +476,13 @@ xfs_inobt_init_cursor(
/* Create an inode btree cursor with a fake root for staging. */ /* Create an inode btree cursor with a fake root for staging. */
struct xfs_btree_cur * struct xfs_btree_cur *
xfs_inobt_stage_cursor( xfs_inobt_stage_cursor(
struct xfs_mount *mp,
struct xbtree_afakeroot *afake,
struct xfs_perag *pag, struct xfs_perag *pag,
struct xbtree_afakeroot *afake,
xfs_btnum_t btnum) xfs_btnum_t btnum)
{ {
struct xfs_btree_cur *cur; 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); xfs_btree_stage_afakeroot(cur, afake);
return cur; return cur;
} }
...@@ -708,9 +706,8 @@ xfs_inobt_max_size( ...@@ -708,9 +706,8 @@ xfs_inobt_max_size(
/* Read AGI and create inobt cursor. */ /* Read AGI and create inobt cursor. */
int int
xfs_inobt_cur( xfs_inobt_cur(
struct xfs_mount *mp,
struct xfs_trans *tp,
struct xfs_perag *pag, struct xfs_perag *pag,
struct xfs_trans *tp,
xfs_btnum_t which, xfs_btnum_t which,
struct xfs_btree_cur **curpp, struct xfs_btree_cur **curpp,
struct xfs_buf **agi_bpp) struct xfs_buf **agi_bpp)
...@@ -725,16 +722,15 @@ xfs_inobt_cur( ...@@ -725,16 +722,15 @@ xfs_inobt_cur(
if (error) if (error)
return 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; *curpp = cur;
return 0; return 0;
} }
static int static int
xfs_inobt_count_blocks( xfs_inobt_count_blocks(
struct xfs_mount *mp,
struct xfs_trans *tp,
struct xfs_perag *pag, struct xfs_perag *pag,
struct xfs_trans *tp,
xfs_btnum_t btnum, xfs_btnum_t btnum,
xfs_extlen_t *tree_blocks) xfs_extlen_t *tree_blocks)
{ {
...@@ -742,7 +738,7 @@ xfs_inobt_count_blocks( ...@@ -742,7 +738,7 @@ xfs_inobt_count_blocks(
struct xfs_btree_cur *cur = NULL; struct xfs_btree_cur *cur = NULL;
int error; int error;
error = xfs_inobt_cur(mp, tp, pag, btnum, &cur, &agbp); error = xfs_inobt_cur(pag, tp, btnum, &cur, &agbp);
if (error) if (error)
return error; return error;
...@@ -779,22 +775,21 @@ xfs_finobt_read_blocks( ...@@ -779,22 +775,21 @@ xfs_finobt_read_blocks(
*/ */
int int
xfs_finobt_calc_reserves( xfs_finobt_calc_reserves(
struct xfs_mount *mp,
struct xfs_trans *tp,
struct xfs_perag *pag, struct xfs_perag *pag,
struct xfs_trans *tp,
xfs_extlen_t *ask, xfs_extlen_t *ask,
xfs_extlen_t *used) xfs_extlen_t *used)
{ {
xfs_extlen_t tree_len = 0; xfs_extlen_t tree_len = 0;
int error; int error;
if (!xfs_has_finobt(mp)) if (!xfs_has_finobt(pag->pag_mount))
return 0; return 0;
if (xfs_has_inobtcounts(mp)) if (xfs_has_inobtcounts(pag->pag_mount))
error = xfs_finobt_read_blocks(pag, tp, &tree_len); error = xfs_finobt_read_blocks(pag, tp, &tree_len);
else else
error = xfs_inobt_count_blocks(mp, tp, pag, XFS_BTNUM_FINO, error = xfs_inobt_count_blocks(pag, tp, XFS_BTNUM_FINO,
&tree_len); &tree_len);
if (error) if (error)
return error; return error;
......
...@@ -46,12 +46,10 @@ struct xfs_perag; ...@@ -46,12 +46,10 @@ struct xfs_perag;
(maxrecs) * sizeof(xfs_inobt_key_t) + \ (maxrecs) * sizeof(xfs_inobt_key_t) + \
((index) - 1) * sizeof(xfs_inobt_ptr_t))) ((index) - 1) * sizeof(xfs_inobt_ptr_t)))
extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_mount *mp, extern struct xfs_btree_cur *xfs_inobt_init_cursor(struct xfs_perag *pag,
struct xfs_trans *tp, struct xfs_buf *agbp, struct xfs_trans *tp, struct xfs_buf *agbp, xfs_btnum_t btnum);
struct xfs_perag *pag, xfs_btnum_t btnum); struct xfs_btree_cur *xfs_inobt_stage_cursor(struct xfs_perag *pag,
struct xfs_btree_cur *xfs_inobt_stage_cursor(struct xfs_mount *mp, struct xbtree_afakeroot *afake, xfs_btnum_t btnum);
struct xbtree_afakeroot *afake, struct xfs_perag *pag,
xfs_btnum_t btnum);
extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int); extern int xfs_inobt_maxrecs(struct xfs_mount *, int, int);
/* ir_holemask to inode allocation bitmap conversion */ /* ir_holemask to inode allocation bitmap conversion */
...@@ -64,13 +62,13 @@ int xfs_inobt_rec_check_count(struct xfs_mount *, ...@@ -64,13 +62,13 @@ int xfs_inobt_rec_check_count(struct xfs_mount *,
#define xfs_inobt_rec_check_count(mp, rec) 0 #define xfs_inobt_rec_check_count(mp, rec) 0
#endif /* DEBUG */ #endif /* DEBUG */
int xfs_finobt_calc_reserves(struct xfs_mount *mp, struct xfs_trans *tp, int xfs_finobt_calc_reserves(struct xfs_perag *perag, struct xfs_trans *tp,
struct xfs_perag *pag, xfs_extlen_t *ask, xfs_extlen_t *used); xfs_extlen_t *ask, xfs_extlen_t *used);
extern xfs_extlen_t xfs_iallocbt_calc_size(struct xfs_mount *mp, extern xfs_extlen_t xfs_iallocbt_calc_size(struct xfs_mount *mp,
unsigned long long len); unsigned long long len);
int xfs_inobt_cur(struct xfs_mount *mp, struct xfs_trans *tp, int xfs_inobt_cur(struct xfs_perag *pag, struct xfs_trans *tp,
struct xfs_perag *pag, xfs_btnum_t btnum, xfs_btnum_t btnum, struct xfs_btree_cur **curpp,
struct xfs_btree_cur **curpp, struct xfs_buf **agi_bpp); struct xfs_buf **agi_bpp);
void xfs_inobt_commit_staged_btree(struct xfs_btree_cur *cur, void xfs_inobt_commit_staged_btree(struct xfs_btree_cur *cur,
struct xfs_trans *tp, struct xfs_buf *agbp); struct xfs_trans *tp, struct xfs_buf *agbp);
......
...@@ -873,8 +873,7 @@ xrep_agi_calc_from_btrees( ...@@ -873,8 +873,7 @@ xrep_agi_calc_from_btrees(
xfs_agino_t freecount; xfs_agino_t freecount;
int error; int error;
cur = xfs_inobt_init_cursor(mp, sc->tp, agi_bp, cur = xfs_inobt_init_cursor(sc->sa.pag, sc->tp, agi_bp, XFS_BTNUM_INO);
sc->sa.pag, XFS_BTNUM_INO);
error = xfs_ialloc_count_inodes(cur, &count, &freecount); error = xfs_ialloc_count_inodes(cur, &count, &freecount);
if (error) if (error)
goto err; goto err;
...@@ -894,8 +893,8 @@ xrep_agi_calc_from_btrees( ...@@ -894,8 +893,8 @@ xrep_agi_calc_from_btrees(
if (xfs_has_finobt(mp) && xfs_has_inobtcounts(mp)) { if (xfs_has_finobt(mp) && xfs_has_inobtcounts(mp)) {
xfs_agblock_t blocks; xfs_agblock_t blocks;
cur = xfs_inobt_init_cursor(mp, sc->tp, agi_bp, cur = xfs_inobt_init_cursor(sc->sa.pag, sc->tp, agi_bp,
sc->sa.pag, XFS_BTNUM_FINO); XFS_BTNUM_FINO);
error = xfs_btree_count_blocks(cur, &blocks); error = xfs_btree_count_blocks(cur, &blocks);
if (error) if (error)
goto err; goto err;
......
...@@ -478,15 +478,15 @@ xchk_ag_btcur_init( ...@@ -478,15 +478,15 @@ xchk_ag_btcur_init(
/* Set up a inobt cursor for cross-referencing. */ /* Set up a inobt cursor for cross-referencing. */
if (sa->agi_bp && if (sa->agi_bp &&
xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_INO)) { xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_INO)) {
sa->ino_cur = xfs_inobt_init_cursor(mp, sc->tp, sa->agi_bp, sa->ino_cur = xfs_inobt_init_cursor(sa->pag, sc->tp, sa->agi_bp,
sa->pag, XFS_BTNUM_INO); XFS_BTNUM_INO);
} }
/* Set up a finobt cursor for cross-referencing. */ /* Set up a finobt cursor for cross-referencing. */
if (sa->agi_bp && xfs_has_finobt(mp) && if (sa->agi_bp && xfs_has_finobt(mp) &&
xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_FINO)) { xchk_ag_btree_healthy_enough(sc, sa->pag, XFS_BTNUM_FINO)) {
sa->fino_cur = xfs_inobt_init_cursor(mp, sc->tp, sa->agi_bp, sa->fino_cur = xfs_inobt_init_cursor(sa->pag, sc->tp, sa->agi_bp,
sa->pag, XFS_BTNUM_FINO); XFS_BTNUM_FINO);
} }
/* Set up a rmapbt cursor for cross-referencing. */ /* Set up a rmapbt cursor for cross-referencing. */
......
...@@ -275,7 +275,7 @@ xfs_iwalk_ag_start( ...@@ -275,7 +275,7 @@ xfs_iwalk_ag_start(
/* Set up a fresh cursor and empty the inobt cache. */ /* Set up a fresh cursor and empty the inobt cache. */
iwag->nr_recs = 0; iwag->nr_recs = 0;
error = xfs_inobt_cur(mp, tp, pag, XFS_BTNUM_INO, curpp, agi_bpp); error = xfs_inobt_cur(pag, tp, XFS_BTNUM_INO, curpp, agi_bpp);
if (error) if (error)
return error; return error;
...@@ -390,7 +390,7 @@ xfs_iwalk_run_callbacks( ...@@ -390,7 +390,7 @@ xfs_iwalk_run_callbacks(
} }
/* ...and recreate the cursor just past where we left off. */ /* ...and recreate the cursor just past where we left off. */
error = xfs_inobt_cur(mp, iwag->tp, iwag->pag, XFS_BTNUM_INO, curpp, error = xfs_inobt_cur(iwag->pag, iwag->tp, XFS_BTNUM_INO, curpp,
agi_bpp); agi_bpp);
if (error) if (error)
return error; return error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment