]> www.infradead.org Git - users/hch/xfsprogs.git/commitdiff
xfs: refactor creation of bmap btree roots
authorDarrick J. Wong <djwong@kernel.org>
Tue, 7 Mar 2023 03:55:32 +0000 (19:55 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Wed, 22 Nov 2023 23:03:35 +0000 (15:03 -0800)
Now that we've created inode fork helpers to allocate and free btree
roots, create a new bmap btree helper to create a new bmbt root, and
refactor the extents <-> btree conversion functions to use our new
helpers.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
libxfs/xfs_bmap.c
libxfs/xfs_bmap_btree.c
libxfs/xfs_bmap_btree.h

index 2a9dc55b02ef368dbb5318dae3bd69165bbfaead..69400eff99ebbff29284396bcdbf3c8f1f540981 100644 (file)
@@ -591,7 +591,7 @@ xfs_bmap_btree_to_extents(
        xfs_trans_binval(tp, cbp);
        if (cur->bc_levels[0].bp == cbp)
                cur->bc_levels[0].bp = NULL;
-       xfs_iroot_realloc(ip, -1, whichfork);
+       xfs_iroot_free(ip, whichfork);
        ASSERT(ifp->if_broot == NULL);
        ifp->if_format = XFS_DINODE_FMT_EXTENTS;
        *logflagsp |= XFS_ILOG_CORE | xfs_ilog_fext(whichfork);
@@ -631,20 +631,10 @@ xfs_bmap_extents_to_btree(
        ifp = xfs_ifork_ptr(ip, whichfork);
        ASSERT(ifp->if_format == XFS_DINODE_FMT_EXTENTS);
 
-       /*
-        * Make space in the inode incore. This needs to be undone if we fail
-        * to expand the root.
-        */
-       xfs_iroot_realloc(ip, 1, whichfork);
-
-       /*
-        * Fill in the root.
-        */
-       block = ifp->if_broot;
-       xfs_btree_init_block(mp, block, &xfs_bmbt_ops, 1, 1, ip->i_ino);
        /*
         * Need a cursor.  Can't allocate until bb_level is filled in.
         */
+       xfs_bmbt_iroot_alloc(ip, whichfork);
        cur = xfs_bmbt_init_cursor(mp, tp, ip, whichfork);
        cur->bc_ino.flags = wasdel ? XFS_BTCUR_BMBT_WASDEL : 0;
        /*
@@ -700,6 +690,7 @@ xfs_bmap_extents_to_btree(
        /*
         * Fill in the root key and pointer.
         */
+       block = ifp->if_broot;
        kp = xfs_bmbt_key_addr(mp, block, 1);
        arp = xfs_bmbt_rec_addr(mp, ablock, 1);
        kp->br_startoff = cpu_to_be64(xfs_bmbt_disk_get_startoff(arp));
@@ -721,7 +712,7 @@ xfs_bmap_extents_to_btree(
 out_unreserve_dquot:
        xfs_trans_mod_dquot_byino(tp, ip, XFS_TRANS_DQ_BCOUNT, -1L);
 out_root_realloc:
-       xfs_iroot_realloc(ip, -1, whichfork);
+       xfs_iroot_free(ip, whichfork);
        ifp->if_format = XFS_DINODE_FMT_EXTENTS;
        ASSERT(ifp->if_broot == NULL);
        xfs_btree_del_cursor(cur, XFS_BTREE_ERROR);
index 03ea8471e1f28c0ab46dc2c72e3da31dd3dfd158..1b5cddb7edaa7a0cce514bccd241011147a41dce 100644 (file)
@@ -776,3 +776,19 @@ xfs_bmbt_destroy_cur_cache(void)
        kmem_cache_destroy(xfs_bmbt_cur_cache);
        xfs_bmbt_cur_cache = NULL;
 }
+
+/* Create an incore bmbt btree root block. */
+void
+xfs_bmbt_iroot_alloc(
+       struct xfs_inode        *ip,
+       int                     whichfork)
+{
+       struct xfs_ifork        *ifp = xfs_ifork_ptr(ip, whichfork);
+
+       xfs_iroot_alloc(ip, whichfork,
+                       xfs_bmap_broot_space_calc(ip->i_mount, 1));
+
+       /* Fill in the root. */
+       xfs_btree_init_block(ip->i_mount, ifp->if_broot, &xfs_bmbt_ops, 1, 1,
+                       ip->i_ino);
+}
index 62fbc4f7c2c40695a9ba8da00d343664d82f7949..3fe9c4f7f1a0be1b6cede9bc00fd095ba57c4632 100644 (file)
@@ -196,4 +196,6 @@ xfs_bmap_bmdr_space(struct xfs_btree_block *bb)
        return xfs_bmdr_space_calc(be16_to_cpu(bb->bb_numrecs));
 }
 
+void xfs_bmbt_iroot_alloc(struct xfs_inode *ip, int whichfork);
+
 #endif /* __XFS_BMAP_BTREE_H__ */