xfs: move btree bulkload record initialization to ->get_record implementations
authorDarrick J. Wong <djwong@kernel.org>
Fri, 15 Dec 2023 18:03:29 +0000 (10:03 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Fri, 15 Dec 2023 18:03:29 +0000 (10:03 -0800)
When we're performing a bulk load of a btree, move the code that
actually stores the btree record in the new btree block out of the
generic code and into the individual ->get_record implementations.
This is preparation for being able to store multiple records with a
single indirect call.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_btree_staging.c
fs/xfs/libxfs/xfs_btree_staging.h

index c8b46ac3923f800370b02960a693a5703edc7db5..cd409a2ee87b45c6034764981f70b42b9779caad 100644 (file)
@@ -440,22 +440,19 @@ STATIC int
 xfs_btree_bload_leaf(
        struct xfs_btree_cur            *cur,
        unsigned int                    recs_this_block,
-       xfs_btree_bload_get_record_fn   get_record,
+       xfs_btree_bload_get_records_fn  get_records,
        struct xfs_btree_block          *block,
        void                            *priv)
 {
-       unsigned int                    j;
+       unsigned int                    j = 1;
        int                             ret;
 
        /* Fill the leaf block with records. */
-       for (j = 1; j <= recs_this_block; j++) {
-               union xfs_btree_rec     *block_rec;
-
-               ret = get_record(cur, priv);
-               if (ret)
+       while (j <= recs_this_block) {
+               ret = get_records(cur, j, block, recs_this_block - j + 1, priv);
+               if (ret < 0)
                        return ret;
-               block_rec = xfs_btree_rec_addr(cur, j, block);
-               cur->bc_ops->init_rec_from_cur(cur, block_rec);
+               j += ret;
        }
 
        return 0;
@@ -798,7 +795,7 @@ xfs_btree_bload(
                trace_xfs_btree_bload_block(cur, level, i, blocks, &ptr,
                                nr_this_block);
 
-               ret = xfs_btree_bload_leaf(cur, nr_this_block, bbl->get_record,
+               ret = xfs_btree_bload_leaf(cur, nr_this_block, bbl->get_records,
                                block, priv);
                if (ret)
                        goto out;
index 5f638f711246eef155b83d42828196e6cf33ffb3..bd5b3f004823a2e2cee7090d7ca38c42c0ca1df4 100644 (file)
@@ -47,7 +47,9 @@ void xfs_btree_commit_ifakeroot(struct xfs_btree_cur *cur, struct xfs_trans *tp,
                int whichfork, const struct xfs_btree_ops *ops);
 
 /* Bulk loading of staged btrees. */
-typedef int (*xfs_btree_bload_get_record_fn)(struct xfs_btree_cur *cur, void *priv);
+typedef int (*xfs_btree_bload_get_records_fn)(struct xfs_btree_cur *cur,
+               unsigned int idx, struct xfs_btree_block *block,
+               unsigned int nr_wanted, void *priv);
 typedef int (*xfs_btree_bload_claim_block_fn)(struct xfs_btree_cur *cur,
                union xfs_btree_ptr *ptr, void *priv);
 typedef size_t (*xfs_btree_bload_iroot_size_fn)(struct xfs_btree_cur *cur,
@@ -55,11 +57,14 @@ typedef size_t (*xfs_btree_bload_iroot_size_fn)(struct xfs_btree_cur *cur,
 
 struct xfs_btree_bload {
        /*
-        * This function will be called nr_records times to load records into
-        * the btree.  The function does this by setting the cursor's bc_rec
-        * field in in-core format.  Records must be returned in sort order.
+        * This function will be called to load @nr_wanted records into the
+        * btree.  The implementation does this by setting the cursor's bc_rec
+        * field in in-core format and using init_rec_from_cur to set the
+        * records in the btree block.  Records must be returned in sort order.
+        * The function must return the number of records loaded or the usual
+        * negative errno.
         */
-       xfs_btree_bload_get_record_fn   get_record;
+       xfs_btree_bload_get_records_fn  get_records;
 
        /*
         * This function will be called nr_blocks times to obtain a pointer