@@ -447,10 +447,19 @@ xfs_btree_del_cursor(
447447 */
448448 ASSERT (cur -> bc_btnum != XFS_BTNUM_BMAP || cur -> bc_ino .allocated == 0 ||
449449 xfs_is_shutdown (cur -> bc_mp ) || error != 0 );
450+
451+ switch (cur -> bc_ops -> type ) {
452+ case XFS_BTREE_TYPE_AG :
453+ if (cur -> bc_ag .pag )
454+ xfs_perag_put (cur -> bc_ag .pag );
455+ break ;
456+ case XFS_BTREE_TYPE_INODE :
457+ /* nothing to do */
458+ break ;
459+ }
460+
450461 if (unlikely (cur -> bc_flags & XFS_BTREE_STAGING ))
451462 kfree (cur -> bc_ops );
452- if (!(cur -> bc_ops -> ptr_len == XFS_BTREE_LONG_PTR_LEN ) && cur -> bc_ag .pag )
453- xfs_perag_put (cur -> bc_ag .pag );
454463 kmem_cache_free (cur -> bc_cache , cur );
455464}
456465
@@ -708,7 +717,7 @@ struct xfs_ifork *
708717xfs_btree_ifork_ptr (
709718 struct xfs_btree_cur * cur )
710719{
711- ASSERT (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE );
720+ ASSERT (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE );
712721
713722 if (cur -> bc_flags & XFS_BTREE_STAGING )
714723 return cur -> bc_ino .ifake -> if_fork ;
@@ -740,8 +749,8 @@ xfs_btree_get_block(
740749 int level , /* level in btree */
741750 struct xfs_buf * * bpp ) /* buffer containing the block */
742751{
743- if (( cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) &&
744- ( level == cur -> bc_nlevels - 1 ) ) {
752+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE &&
753+ level == cur -> bc_nlevels - 1 ) {
745754 * bpp = NULL ;
746755 return xfs_btree_get_iroot (cur );
747756 }
@@ -983,8 +992,8 @@ xfs_btree_readahead(
983992 * No readahead needed if we are at the root level and the
984993 * btree root is stored in the inode.
985994 */
986- if (( cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) &&
987- ( lev == cur -> bc_nlevels - 1 ) )
995+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE &&
996+ lev == cur -> bc_nlevels - 1 )
988997 return 0 ;
989998
990999 if ((cur -> bc_levels [lev ].ra | lr ) == cur -> bc_levels [lev ].ra )
@@ -1172,14 +1181,12 @@ __xfs_btree_init_block(
11721181 buf -> bb_u .l .bb_lsn = 0 ;
11731182 }
11741183 } else {
1175- /* owner is a 32 bit value on short blocks */
1176- __u32 __owner = (__u32 )owner ;
1177-
11781184 buf -> bb_u .s .bb_leftsib = cpu_to_be32 (NULLAGBLOCK );
11791185 buf -> bb_u .s .bb_rightsib = cpu_to_be32 (NULLAGBLOCK );
11801186 if (crc ) {
11811187 buf -> bb_u .s .bb_blkno = cpu_to_be64 (blkno );
1182- buf -> bb_u .s .bb_owner = cpu_to_be32 (__owner );
1188+ /* owner is a 32 bit value on short blocks */
1189+ buf -> bb_u .s .bb_owner = cpu_to_be32 ((__u32 )owner );
11831190 uuid_copy (& buf -> bb_u .s .bb_uuid , & mp -> m_sb .sb_meta_uuid );
11841191 buf -> bb_u .s .bb_lsn = 0 ;
11851192 }
@@ -1217,7 +1224,7 @@ static inline __u64
12171224xfs_btree_owner (
12181225 struct xfs_btree_cur * cur )
12191226{
1220- if (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE )
1227+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE )
12211228 return cur -> bc_ino .ip -> i_ino ;
12221229 return cur -> bc_ag .pag -> pag_agno ;
12231230}
@@ -1638,7 +1645,7 @@ xfs_btree_increment(
16381645 * confused or have the tree root in an inode.
16391646 */
16401647 if (lev == cur -> bc_nlevels ) {
1641- if (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE )
1648+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE )
16421649 goto out0 ;
16431650 ASSERT (0 );
16441651 xfs_btree_mark_sick (cur );
@@ -1732,7 +1739,7 @@ xfs_btree_decrement(
17321739 * or the root of the tree is in an inode.
17331740 */
17341741 if (lev == cur -> bc_nlevels ) {
1735- if (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE )
1742+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE )
17361743 goto out0 ;
17371744 ASSERT (0 );
17381745 xfs_btree_mark_sick (cur );
@@ -1807,8 +1814,8 @@ xfs_btree_lookup_get_block(
18071814 int error = 0 ;
18081815
18091816 /* special case the root block if in an inode */
1810- if (( cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) &&
1811- ( level == cur -> bc_nlevels - 1 ) ) {
1817+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE &&
1818+ level == cur -> bc_nlevels - 1 ) {
18121819 * blkp = xfs_btree_get_iroot (cur );
18131820 return 0 ;
18141821 }
@@ -2343,7 +2350,7 @@ xfs_btree_lshift(
23432350 int error ; /* error return value */
23442351 int i ;
23452352
2346- if ((cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) &&
2353+ if ((cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE ) &&
23472354 level == cur -> bc_nlevels - 1 )
23482355 goto out0 ;
23492356
@@ -2539,8 +2546,8 @@ xfs_btree_rshift(
25392546 int error ; /* error return value */
25402547 int i ; /* loop counter */
25412548
2542- if (( cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) &&
2543- ( level == cur -> bc_nlevels - 1 ) )
2549+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE &&
2550+ level == cur -> bc_nlevels - 1 )
25442551 goto out0 ;
25452552
25462553 /* Set up variables for this block as "left". */
@@ -2990,7 +2997,6 @@ xfs_btree_split(
29902997#define xfs_btree_split __xfs_btree_split
29912998#endif /* __KERNEL__ */
29922999
2993-
29943000/*
29953001 * Copy the old inode root contents into a real block and make the
29963002 * broot point to it.
@@ -3015,7 +3021,7 @@ xfs_btree_new_iroot(
30153021
30163022 XFS_BTREE_STATS_INC (cur , newroot );
30173023
3018- ASSERT (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE );
3024+ ASSERT (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE );
30193025
30203026 level = cur -> bc_nlevels - 1 ;
30213027
@@ -3240,7 +3246,7 @@ xfs_btree_make_block_unfull(
32403246{
32413247 int error = 0 ;
32423248
3243- if (( cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) &&
3249+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE &&
32443250 level == cur -> bc_nlevels - 1 ) {
32453251 struct xfs_inode * ip = cur -> bc_ino .ip ;
32463252
@@ -3326,8 +3332,8 @@ xfs_btree_insrec(
33263332 * If we have an external root pointer, and we've made it to the
33273333 * root level, allocate a new root block and we're done.
33283334 */
3329- if (!( cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) &&
3330- ( level >= cur -> bc_nlevels ) ) {
3335+ if (cur -> bc_ops -> type != XFS_BTREE_TYPE_INODE &&
3336+ level >= cur -> bc_nlevels ) {
33313337 error = xfs_btree_new_root (cur , stat );
33323338 xfs_btree_set_ptr_null (cur , ptrp );
33333339
@@ -3614,7 +3620,7 @@ xfs_btree_kill_iroot(
36143620#endif
36153621 int i ;
36163622
3617- ASSERT (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE );
3623+ ASSERT (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE );
36183624 ASSERT (cur -> bc_nlevels > 1 );
36193625
36203626 /*
@@ -3851,7 +3857,7 @@ xfs_btree_delrec(
38513857 * nothing left to do.
38523858 */
38533859 if (level == cur -> bc_nlevels - 1 ) {
3854- if (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) {
3860+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE ) {
38553861 xfs_iroot_realloc (cur -> bc_ino .ip , -1 ,
38563862 cur -> bc_ino .whichfork );
38573863
@@ -3919,7 +3925,7 @@ xfs_btree_delrec(
39193925 xfs_btree_get_sibling (cur , block , & rptr , XFS_BB_RIGHTSIB );
39203926 xfs_btree_get_sibling (cur , block , & lptr , XFS_BB_LEFTSIB );
39213927
3922- if (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) {
3928+ if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE ) {
39233929 /*
39243930 * One child of root, need to get a chance to copy its contents
39253931 * into the root and delete it. Can't go up to next level,
@@ -4236,8 +4242,8 @@ xfs_btree_delrec(
42364242 * If we joined with the right neighbor and there's a level above
42374243 * us, increment the cursor at that level.
42384244 */
4239- else if (( cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE ) ||
4240- ( level + 1 < cur -> bc_nlevels ) ) {
4245+ else if (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE ||
4246+ level + 1 < cur -> bc_nlevels ) {
42414247 error = xfs_btree_increment (cur , level + 1 , & i );
42424248 if (error )
42434249 goto error0 ;
@@ -4528,7 +4534,7 @@ xfs_btree_block_change_owner(
45284534 * though, so everything is consistent in memory.
45294535 */
45304536 if (!bp ) {
4531- ASSERT (cur -> bc_ops -> geom_flags & XFS_BTGEO_ROOT_IN_INODE );
4537+ ASSERT (cur -> bc_ops -> type == XFS_BTREE_TYPE_INODE );
45324538 ASSERT (level == cur -> bc_nlevels - 1 );
45334539 return 0 ;
45344540 }
0 commit comments