xfs: create predicate to determine if cursor is at inode root level
authorDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:37:24 +0000 (12:37 -0800)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 22 Feb 2024 20:37:24 +0000 (12:37 -0800)
Create a predicate to decide if the given cursor and level point to the
root block in the inode immediate area instead of a disk block, and get
rid of the open-coded logic everywhere.

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

index 6de646e..5d0b108 100644 (file)
@@ -749,8 +749,7 @@ xfs_btree_get_block(
        int                     level,  /* level in btree */
        struct xfs_buf          **bpp)  /* buffer containing the block */
 {
-       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
-           level == cur->bc_nlevels - 1) {
+       if (xfs_btree_at_iroot(cur, level)) {
                *bpp = NULL;
                return xfs_btree_get_iroot(cur);
        }
@@ -992,8 +991,7 @@ xfs_btree_readahead(
         * No readahead needed if we are at the root level and the
         * btree root is stored in the inode.
         */
-       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
-           lev == cur->bc_nlevels - 1)
+       if (xfs_btree_at_iroot(cur, lev))
                return 0;
 
        if ((cur->bc_levels[lev].ra | lr) == cur->bc_levels[lev].ra)
@@ -1814,8 +1812,7 @@ xfs_btree_lookup_get_block(
        int                     error = 0;
 
        /* special case the root block if in an inode */
-       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
-           level == cur->bc_nlevels - 1) {
+       if (xfs_btree_at_iroot(cur, level)) {
                *blkp = xfs_btree_get_iroot(cur);
                return 0;
        }
@@ -2350,8 +2347,7 @@ xfs_btree_lshift(
        int                     error;          /* error return value */
        int                     i;
 
-       if ((cur->bc_ops->type == XFS_BTREE_TYPE_INODE) &&
-           level == cur->bc_nlevels - 1)
+       if (xfs_btree_at_iroot(cur, level))
                goto out0;
 
        /* Set up variables for this block as "right". */
@@ -2546,8 +2542,7 @@ xfs_btree_rshift(
        int                     error;          /* error return value */
        int                     i;              /* loop counter */
 
-       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
-           level == cur->bc_nlevels - 1)
+       if (xfs_btree_at_iroot(cur, level))
                goto out0;
 
        /* Set up variables for this block as "left". */
@@ -3246,8 +3241,7 @@ xfs_btree_make_block_unfull(
 {
        int                     error = 0;
 
-       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
-           level == cur->bc_nlevels - 1) {
+       if (xfs_btree_at_iroot(cur, level)) {
                struct xfs_inode *ip = cur->bc_ino.ip;
 
                if (numrecs < cur->bc_ops->get_dmaxrecs(cur, level)) {
@@ -3856,27 +3850,25 @@ xfs_btree_delrec(
         * Try to get rid of the next level down.  If we can't then there's
         * nothing left to do.
         */
-       if (level == cur->bc_nlevels - 1) {
-               if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE) {
-                       xfs_iroot_realloc(cur->bc_ino.ip, -1,
-                                         cur->bc_ino.whichfork);
+       if (xfs_btree_at_iroot(cur, level)) {
+               xfs_iroot_realloc(cur->bc_ino.ip, -1, cur->bc_ino.whichfork);
 
-                       error = xfs_btree_kill_iroot(cur);
-                       if (error)
-                               goto error0;
+               error = xfs_btree_kill_iroot(cur);
+               if (error)
+                       goto error0;
 
-                       error = xfs_btree_dec_cursor(cur, level, stat);
-                       if (error)
-                               goto error0;
-                       *stat = 1;
-                       return 0;
-               }
+               error = xfs_btree_dec_cursor(cur, level, stat);
+               if (error)
+                       goto error0;
+               *stat = 1;
+               return 0;
+       }
 
-               /*
-                * If this is the root level, and there's only one entry left,
-                * and it's NOT the leaf level, then we can get rid of this
-                * level.
-                */
+       /*
+        * If this is the root level, and there's only one entry left, and it's
+        * NOT the leaf level, then we can get rid of this level.
+        */
+       if (level == cur->bc_nlevels - 1) {
                if (numrecs == 1 && level > 0) {
                        union xfs_btree_ptr     *pp;
                        /*
index 153d867..07abc56 100644 (file)
@@ -747,4 +747,14 @@ void xfs_btree_destroy_cur_caches(void);
 
 int xfs_btree_goto_left_edge(struct xfs_btree_cur *cur);
 
+/* Does this level of the cursor point to the inode root (and not a block)? */
+static inline bool
+xfs_btree_at_iroot(
+       const struct xfs_btree_cur      *cur,
+       int                             level)
+{
+       return cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
+              level == cur->bc_nlevels - 1;
+}
+
 #endif /* __XFS_BTREE_H__ */
index 0d2d7f2..a0dbe9b 100644 (file)
@@ -398,8 +398,7 @@ xfs_btree_bload_prep_block(
        struct xfs_btree_block          *new_block;
        int                             ret;
 
-       if (cur->bc_ops->type == XFS_BTREE_TYPE_INODE &&
-           level == cur->bc_nlevels - 1) {
+       if (xfs_btree_at_iroot(cur, level)) {
                struct xfs_ifork        *ifp = xfs_btree_ifork_ptr(cur);
                size_t                  new_size;