]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs: split xfs_inobt_init_cursor
authorChristoph Hellwig <hch@lst.de>
Mon, 22 Apr 2024 17:01:06 +0000 (10:01 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 3 Jun 2024 18:37:39 +0000 (11:37 -0700)
Source kernel commit: 14dd46cf31f4aaffcf26b00de9af39d01ec8d547

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: Christoph Hellwig <hch@lst.de>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
libxfs/libxfs_api_defs.h
libxfs/xfs_ialloc.c
libxfs/xfs_ialloc_btree.c
libxfs/xfs_ialloc_btree.h
repair/agbtree.c

index 8f4b980808738b09d0e7acd9b5a6b8f542f17025..0e72944bc9aa8c51196cdecce673c0aee6c81d2f 100644 (file)
 #define xfs_dquot_verify               libxfs_dquot_verify
 
 #define xfs_finobt_calc_reserves       libxfs_finobt_calc_reserves
+#define xfs_finobt_init_cursor         libxfs_finobt_init_cursor
 #define xfs_free_extent                        libxfs_free_extent
 #define xfs_free_extent_later          libxfs_free_extent_later
 #define xfs_free_perag                 libxfs_free_perag
index 4f3d7d4dcfef2cb1d59064b939ed67b7648b8c2b..37d014713db185dc59a6fcc5057f872b267cc812 100644 (file)
@@ -208,7 +208,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;
@@ -549,7 +552,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);
@@ -645,7 +648,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);
@@ -1078,7 +1081,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.
@@ -1552,7 +1555,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)
@@ -1595,7 +1598,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)
@@ -2012,7 +2015,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)
@@ -2139,7 +2142,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)
@@ -2339,7 +2342,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)
@@ -3058,7 +3061,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);
index 609f62c65cea7150ec834e418fd8fafb00365e57..2f095862e153d7bd2b5abfb6da7044dc17caac18 100644 (file)
@@ -37,7 +37,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
@@ -440,7 +448,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,
@@ -467,28 +475,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;
 }
@@ -723,7 +748,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);
index 2f1552d656559434d5d38bbd84659b9b1258334a..6472ec1ecbb45839d23993ca9d13c9089e33e541 100644 (file)
@@ -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 */
index bd7368be65238f396880fa94cb7fce1d38f668de..7d772715113e25035075ef2943db26a19dc47cbe 100644 (file)
@@ -522,8 +522,7 @@ init_ino_cursors(
                        fino_recs++;
        }
 
-       btr_ino->cur = libxfs_inobt_init_cursor(pag, NULL, NULL,
-                       XFS_BTNUM_INO);
+       btr_ino->cur = libxfs_inobt_init_cursor(pag, NULL, NULL);
        libxfs_btree_stage_afakeroot(btr_ino->cur, &btr_ino->newbt.afake);
 
        btr_ino->bload.get_records = get_inobt_records;
@@ -543,8 +542,7 @@ _("Unable to compute inode btree geometry, error %d.\n"), error);
                return;
 
        init_rebuild(sc, &XFS_RMAP_OINFO_INOBT, est_agfreeblocks, btr_fino);
-       btr_fino->cur = libxfs_inobt_init_cursor(pag, NULL, NULL,
-                       XFS_BTNUM_FINO);
+       btr_fino->cur = libxfs_finobt_init_cursor(pag, NULL, NULL);
        libxfs_btree_stage_afakeroot(btr_fino->cur, &btr_fino->newbt.afake);
 
        btr_fino->bload.get_records = get_inobt_records;