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

Inode-rooted btrees don't need to initialize the root pointer in the
->init_ptr_from_cur method as the root is found by the
xfs_btree_get_iroot method later.  Make ->init_ptr_from_cur option
for inode rooted btrees by providing a helper that does the right
thing for the given btree type and also documents the semantics.

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/xfs_bmap_btree.c
libxfs/xfs_btree.c
libxfs/xfs_btree.h
libxfs/xfs_btree_staging.c

index 9f66eee9a598deee143042c1a38b41e6d21f6803..7fc325fd344cd1986cfb378b0a7f1d3b196b64d6 100644 (file)
@@ -368,14 +368,6 @@ xfs_bmbt_init_rec_from_cur(
        xfs_bmbt_disk_set_all(&rec->bmbt, &cur->bc_rec.b);
 }
 
-STATIC void
-xfs_bmbt_init_ptr_from_cur(
-       struct xfs_btree_cur    *cur,
-       union xfs_btree_ptr     *ptr)
-{
-       ptr->l = 0;
-}
-
 STATIC int64_t
 xfs_bmbt_key_diff(
        struct xfs_btree_cur            *cur,
@@ -543,7 +535,6 @@ const struct xfs_btree_ops xfs_bmbt_ops = {
        .init_key_from_rec      = xfs_bmbt_init_key_from_rec,
        .init_high_key_from_rec = xfs_bmbt_init_high_key_from_rec,
        .init_rec_from_cur      = xfs_bmbt_init_rec_from_cur,
-       .init_ptr_from_cur      = xfs_bmbt_init_ptr_from_cur,
        .key_diff               = xfs_bmbt_key_diff,
        .diff_two_keys          = xfs_bmbt_diff_two_keys,
        .buf_ops                = &xfs_bmbt_buf_ops,
index 2511462e3c8f72e6dd0cd3b536b639e7f5bade8a..f59fa54e3ea61878ea668662de604cdc624a24cb 100644 (file)
@@ -1878,6 +1878,25 @@ xfs_lookup_get_search_key(
        return xfs_btree_key_addr(cur, keyno, block);
 }
 
+/*
+ * Initialize a pointer to the root block.
+ */
+void
+xfs_btree_init_ptr_from_cur(
+       struct xfs_btree_cur    *cur,
+       union xfs_btree_ptr     *ptr)
+{
+       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE) {
+               /*
+                * Inode-rooted btrees call xfs_btree_get_iroot to find the root
+                * in xfs_btree_lookup_get_block and don't need a pointer here.
+                */
+               ptr->l = 0;
+       } else {
+               cur->bc_ops->init_ptr_from_cur(cur, ptr);
+       }
+}
+
 /*
  * Lookup the record.  The cursor is made to point to it, based on dir.
  * stat is set to 0 if can't find any such record, 1 for success.
@@ -1908,7 +1927,7 @@ xfs_btree_lookup(
        keyno = 0;
 
        /* initialise start pointer from cursor */
-       cur->bc_ops->init_ptr_from_cur(cur, &ptr);
+       xfs_btree_init_ptr_from_cur(cur, &ptr);
        pp = &ptr;
 
        /*
@@ -3118,7 +3137,7 @@ xfs_btree_new_root(
        XFS_BTREE_STATS_INC(cur, newroot);
 
        /* initialise our start point from the cursor */
-       cur->bc_ops->init_ptr_from_cur(cur, &rptr);
+       xfs_btree_init_ptr_from_cur(cur, &rptr);
 
        /* Allocate the new block. If we can't do it, we're toast. Give up. */
        error = xfs_btree_alloc_block(cur, &rptr, &lptr, stat);
@@ -4427,7 +4446,7 @@ xfs_btree_visit_blocks(
        struct xfs_btree_block          *block = NULL;
        int                             error = 0;
 
-       cur->bc_ops->init_ptr_from_cur(cur, &lptr);
+       xfs_btree_init_ptr_from_cur(cur, &lptr);
 
        /* for each level */
        for (level = cur->bc_nlevels - 1; level >= 0; level--) {
@@ -4849,7 +4868,7 @@ xfs_btree_overlapped_query_range(
 
        /* Load the root of the btree. */
        level = cur->bc_nlevels - 1;
-       cur->bc_ops->init_ptr_from_cur(cur, &ptr);
+       xfs_btree_init_ptr_from_cur(cur, &ptr);
        error = xfs_btree_lookup_get_block(cur, level, &ptr, &block);
        if (error)
                return error;
index 07abc56e03954a76c4a1855b375da8050ec502a8..99194ae946948b26e6149e686741b2bba9aa7b3d 100644 (file)
@@ -714,6 +714,8 @@ void xfs_btree_copy_ptrs(struct xfs_btree_cur *cur,
 void xfs_btree_copy_keys(struct xfs_btree_cur *cur,
                union xfs_btree_key *dst_key,
                const union xfs_btree_key *src_key, int numkeys);
+void xfs_btree_init_ptr_from_cur(struct xfs_btree_cur *cur,
+               union xfs_btree_ptr *ptr);
 
 static inline struct xfs_btree_cur *
 xfs_btree_alloc_cursor(
index 07b43da787526c70417f5f53c1f557c219080be8..656bad6cdb7789be91022af26536613793e3010c 100644 (file)
@@ -225,7 +225,6 @@ xfs_btree_stage_ifakeroot(
        memcpy(nops, cur->bc_ops, sizeof(struct xfs_btree_ops));
        nops->alloc_block = xfs_btree_fakeroot_alloc_block;
        nops->free_block = xfs_btree_fakeroot_free_block;
-       nops->init_ptr_from_cur = xfs_btree_fakeroot_init_ptr_from_cur;
        nops->dup_cursor = xfs_btree_fakeroot_dup_cursor;
 
        cur->bc_ino.ifake = ifake;