]> www.infradead.org Git - users/hch/xfs.git/commitdiff
xfs: tidy up xfs_bmap_broot_realloc a bit
authorDarrick J. Wong <djwong@kernel.org>
Mon, 23 Sep 2024 20:41:47 +0000 (13:41 -0700)
committerChristoph Hellwig <hch@lst.de>
Wed, 9 Oct 2024 13:55:44 +0000 (15:55 +0200)
Hoist out the code that migrates broot pointers during a resize
operation to avoid code duplication and streamline the caller.  Also
use the correct bmbt pointer type for the sizeof operation.

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

index 5b063ba0cb9ea1ab16c529bee1cdec92fd1afcc0..fc9a7225d35be1d1e7711c2a60dbfabaf416fd77 100644 (file)
@@ -516,6 +516,22 @@ xfs_bmbt_keys_contiguous(
                                 be64_to_cpu(key2->bmbt.br_startoff));
 }
 
+static inline void
+xfs_bmbt_move_ptrs(
+       struct xfs_mount        *mp,
+       struct xfs_btree_block  *broot,
+       short                   old_size,
+       size_t                  new_size,
+       unsigned int            numrecs)
+{
+       void                    *dptr;
+       void                    *sptr;
+
+       sptr = xfs_bmap_broot_ptr_addr(mp, broot, 1, old_size);
+       dptr = xfs_bmap_broot_ptr_addr(mp, broot, 1, new_size);
+       memmove(dptr, sptr, numrecs * sizeof(xfs_bmbt_ptr_t));
+}
+
 /*
  * Reallocate the space for if_broot based on the number of records.  Move the
  * records and pointers in if_broot to fit the new size.  When shrinking this
@@ -540,8 +556,7 @@ xfs_bmap_broot_realloc(
        unsigned int            new_numrecs)
 {
        struct xfs_mount        *mp = ip->i_mount;
-       char                    *np;
-       char                    *op;
+       struct xfs_btree_block  *broot;
        unsigned int            new_size;
        unsigned int            old_size = ifp->if_broot_bytes;
 
@@ -578,15 +593,9 @@ xfs_bmap_broot_realloc(
                 * they are kept butted up against the btree block header.
                 */
                old_numrecs = xfs_bmbt_maxrecs(mp, old_size, false);
-               xfs_broot_realloc(ifp, new_size);
-               op = (char *)xfs_bmap_broot_ptr_addr(mp, ifp->if_broot, 1,
-                                                    old_size);
-               np = (char *)xfs_bmap_broot_ptr_addr(mp, ifp->if_broot, 1,
-                                                    (int)new_size);
-               ASSERT(xfs_bmap_bmdr_space(ifp->if_broot) <=
-                       xfs_inode_fork_size(ip, xfs_ifork_which(ip, ifp)));
-               memmove(np, op, old_numrecs * (uint)sizeof(xfs_fsblock_t));
-               return ifp->if_broot;
+               broot = xfs_broot_realloc(ifp, new_size);
+               xfs_bmbt_move_ptrs(mp, broot, old_size, new_size, old_numrecs);
+               goto out_broot;
        }
 
        /*
@@ -600,15 +609,13 @@ xfs_bmap_broot_realloc(
         * not butted up against the btree block header, then reallocating
         * broot.
         */
-       op = (char *)xfs_bmap_broot_ptr_addr(mp, ifp->if_broot, 1, old_size);
-       np = (char *)xfs_bmap_broot_ptr_addr(mp, ifp->if_broot, 1,
-                                            (int)new_size);
-       memmove(np, op, new_numrecs * (uint)sizeof(xfs_fsblock_t));
+       xfs_bmbt_move_ptrs(mp, ifp->if_broot, old_size, new_size, new_numrecs);
+       broot = xfs_broot_realloc(ifp, new_size);
 
-       xfs_broot_realloc(ifp, new_size);
-       ASSERT(xfs_bmap_bmdr_space(ifp->if_broot) <=
+out_broot:
+       ASSERT(xfs_bmap_bmdr_space(broot) <=
               xfs_inode_fork_size(ip, xfs_ifork_which(ip, ifp)));
-       return ifp->if_broot;
+       return broot;
 }
 
 static struct xfs_btree_block *