]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
xfs: clean up XFS_MIN_FREELIST macros
authorDave Chinner <dchinner@redhat.com>
Mon, 22 Jun 2015 00:13:30 +0000 (10:13 +1000)
committerDave Chinner <david@fromorbit.com>
Mon, 22 Jun 2015 00:13:30 +0000 (10:13 +1000)
We no longer calculate the minimum freelist size from the on-disk
AGF, so we don't need the macros used for this. That means the
nested macros can be cleaned up, and turn this into an actual
function so the logic is clear and concise. This will make it much
easier to add support for the rmap btree when the time comes.

This also gets rid of the XFS_AG_MAXLEVELS macro used by these
freelist macros as it is simply a wrapper around a single variable.

Signed-off-by: Dave Chinner <dchinner@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_alloc.c
fs/xfs/libxfs/xfs_alloc.h
fs/xfs/libxfs/xfs_bmap.c
fs/xfs/libxfs/xfs_format.h
fs/xfs/libxfs/xfs_trans_resv.h
fs/xfs/libxfs/xfs_trans_space.h
fs/xfs/xfs_filestream.c

index 2afa6bc80e24cf239400ce7c3e0378644eefe719..029078167b64e0d028db0a6a92bc92f14dc67020 100644 (file)
@@ -1838,6 +1838,23 @@ xfs_alloc_longest_free_extent(
        return pag->pagf_flcount > 0 || pag->pagf_longest > 0;
 }
 
+unsigned int
+xfs_alloc_min_freelist(
+       struct xfs_mount        *mp,
+       struct xfs_perag        *pag)
+{
+       unsigned int            min_free;
+
+       /* space needed by-bno freespace btree */
+       min_free = min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_BNOi] + 1,
+                                      mp->m_ag_maxlevels);
+       /* space needed by-size freespace btree */
+       min_free += min_t(unsigned int, pag->pagf_levels[XFS_BTNUM_CNTi] + 1,
+                                      mp->m_ag_maxlevels);
+
+       return min_free;
+}
+
 /*
  * Check if the operation we are fixing up the freelist for should go ahead or
  * not. If we are freeing blocks, we always allow it, otherwise the allocation
@@ -1912,7 +1929,7 @@ xfs_alloc_fix_freelist(
                goto out_agbp_relse;
        }
 
-       need = XFS_MIN_FREELIST_PAG(pag, mp);
+       need = xfs_alloc_min_freelist(mp, pag);
        if (!xfs_alloc_space_available(args, need, flags))
                goto out_agbp_relse;
 
@@ -1931,9 +1948,8 @@ xfs_alloc_fix_freelist(
                }
        }
 
-
        /* If there isn't enough total space or single-extent, reject it. */
-       need = XFS_MIN_FREELIST_PAG(pag, mp);
+       need = xfs_alloc_min_freelist(mp, pag);
        if (!xfs_alloc_space_available(args, need, flags))
                goto out_agbp_relse;
 
index 8815fc30f83d0f258b70a11a8770ce0075bb9f02..7d59b8f4bf9e5696463d61c046c1dcdfc0f726b1 100644 (file)
@@ -130,6 +130,8 @@ typedef struct xfs_alloc_arg {
 
 xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_mount *mp,
                struct xfs_perag *pag, xfs_extlen_t need);
+unsigned int xfs_alloc_min_freelist(struct xfs_mount *mp,
+               struct xfs_perag *pag);
 
 /*
  * Compute and fill in value of m_ag_maxlevels.
index 1ad4f1a62ce082678108b6618aeb6aca8348d392..d567159a3343fb5085e7503b983cc13cacff0df1 100644 (file)
@@ -3508,7 +3508,7 @@ xfs_bmap_longest_free_extent(
        }
 
        longest = xfs_alloc_longest_free_extent(mp, pag,
-                                               XFS_MIN_FREELIST_PAG(pag, mp));
+                                       xfs_alloc_min_freelist(mp, pag));
        if (*blen < longest)
                *blen = longest;
 
index 4daaa662337b516f0794ea0d4680a12512ab6262..487a6e0d0103174dc72155e3eeccb9e2d0eb51c0 100644 (file)
@@ -758,19 +758,6 @@ typedef struct xfs_agfl {
 
 #define XFS_AGFL_CRC_OFF       offsetof(struct xfs_agfl, agfl_crc)
 
-
-#define        XFS_AG_MAXLEVELS(mp)            ((mp)->m_ag_maxlevels)
-#define        XFS_MIN_FREELIST_RAW(bl,cl,mp)  \
-       (MIN(bl + 1, XFS_AG_MAXLEVELS(mp)) + MIN(cl + 1, XFS_AG_MAXLEVELS(mp)))
-#define        XFS_MIN_FREELIST(a,mp)          \
-       (XFS_MIN_FREELIST_RAW(          \
-               be32_to_cpu((a)->agf_levels[XFS_BTNUM_BNOi]), \
-               be32_to_cpu((a)->agf_levels[XFS_BTNUM_CNTi]), mp))
-#define        XFS_MIN_FREELIST_PAG(pag,mp)    \
-       (XFS_MIN_FREELIST_RAW(          \
-               (unsigned int)(pag)->pagf_levels[XFS_BTNUM_BNOi], \
-               (unsigned int)(pag)->pagf_levels[XFS_BTNUM_CNTi], mp))
-
 #define XFS_AGB_TO_FSB(mp,agno,agbno)  \
        (((xfs_fsblock_t)(agno) << (mp)->m_sb.sb_agblklog) | (agbno))
 #define        XFS_FSB_TO_AGNO(mp,fsbno)       \
index 2d5bdfce6d8fd2627fcc46603eb83faed12780e9..797815012c0e31fe711132b3c65aecd5591f7e38 100644 (file)
@@ -73,9 +73,9 @@ struct xfs_trans_resv {
  * 2 trees * (2 blocks/level * max depth - 1) * block size
  */
 #define        XFS_ALLOCFREE_LOG_RES(mp,nx) \
-       ((nx) * (2 * XFS_FSB_TO_B((mp), 2 * XFS_AG_MAXLEVELS(mp) - 1)))
+       ((nx) * (2 * XFS_FSB_TO_B((mp), 2 * (mp)->m_ag_maxlevels - 1)))
 #define        XFS_ALLOCFREE_LOG_COUNT(mp,nx) \
-       ((nx) * (2 * (2 * XFS_AG_MAXLEVELS(mp) - 1)))
+       ((nx) * (2 * (2 * (mp)->m_ag_maxlevels - 1)))
 
 /*
  * Per-directory log reservation for any directory change.
index bf9c4579334d500fea6c917d2a149ba05dead7fb..41e0428d8175a2ab7ea4be8d7f67ce932a7e3a3f 100644 (file)
@@ -67,7 +67,7 @@
 #define        XFS_DIOSTRAT_SPACE_RES(mp, v)   \
        (XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK) + (v))
 #define        XFS_GROWFS_SPACE_RES(mp)        \
-       (2 * XFS_AG_MAXLEVELS(mp))
+       (2 * (mp)->m_ag_maxlevels)
 #define        XFS_GROWFSRT_SPACE_RES(mp,b)    \
        ((b) + XFS_EXTENTADD_SPACE_RES(mp, XFS_DATA_FORK))
 #define        XFS_LINK_SPACE_RES(mp,nl)       \
index 9ac5eaad47bcb591034f04dfc6e105e4d7ae8a95..c4c130f9bfb64fec1d7d5dccb27963a236477ced 100644 (file)
@@ -197,7 +197,7 @@ xfs_filestream_pick_ag(
                }
 
                longest = xfs_alloc_longest_free_extent(mp, pag,
-                                               XFS_MIN_FREELIST_PAG(pag, mp));
+                                       xfs_alloc_min_freelist(mp, pag));
                if (((minlen && longest >= minlen) ||
                     (!minlen && pag->pagf_freeblks >= minfree)) &&
                    (!pag->pagf_metadata || !(flags & XFS_PICK_USERDATA) ||