From: Darrick J. Wong Date: Thu, 28 Apr 2022 19:39:03 +0000 (-0400) Subject: xfs: compute maximum AG btree height for critical reservation calculation X-Git-Tag: v5.16.0-rc0~18 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6afce48f5d4cb60462c99d32306f4afae8681f26;p=thirdparty%2Fxfsprogs-dev.git xfs: compute maximum AG btree height for critical reservation calculation Source kernel commit: b74e15d720d0764345934ebb599a99a077c52533 Compute the actual maximum AG btree height for deciding if a per-AG block reservation is critically low. This only affects the sanity check condition, since we /generally/ will trigger on the 10% threshold. This is a long-winded way of saying that we're removing one more usage of XFS_BTREE_MAXLEVELS. Signed-off-by: Darrick J. Wong Reviewed-by: Dave Chinner Signed-off-by: Eric Sandeen --- diff --git a/include/xfs_mount.h b/include/xfs_mount.h index 4d77e6093..2bd133216 100644 --- a/include/xfs_mount.h +++ b/include/xfs_mount.h @@ -75,6 +75,7 @@ typedef struct xfs_mount { uint m_bm_maxlevels[2]; /* max bmap btree levels */ uint m_rmap_maxlevels; /* max rmap btree levels */ uint m_refc_maxlevels; /* max refc btree levels */ + unsigned int m_agbtree_maxlevels; /* max level of all AG btrees */ xfs_extlen_t m_ag_prealloc_blocks; /* reserved ag blocks */ uint m_alloc_set_aside; /* space we can't use */ uint m_ag_max_usable; /* max space per AG */ diff --git a/libxfs/init.c b/libxfs/init.c index 2d29a78ad..d7df76326 100644 --- a/libxfs/init.c +++ b/libxfs/init.c @@ -706,6 +706,18 @@ libxfs_buftarg_init( mp->m_rtdev_targp = libxfs_buftarg_alloc(mp, rtdev, rfail); } +/* Compute maximum possible height for per-AG btree types for this fs. */ +static inline void +xfs_agbtree_compute_maxlevels( + struct xfs_mount *mp) +{ + unsigned int levels; + + levels = max(mp->m_alloc_maxlevels, M_IGEO(mp)->inobt_maxlevels); + levels = max(levels, mp->m_rmap_maxlevels); + mp->m_agbtree_maxlevels = max(levels, mp->m_refc_maxlevels); +} + /* * Mount structure initialization, provides a filled-in xfs_mount_t * such that the numerous XFS_* macros can be used. If dev is zero, @@ -757,6 +769,8 @@ libxfs_mount( xfs_rmapbt_compute_maxlevels(mp); xfs_refcountbt_compute_maxlevels(mp); + xfs_agbtree_compute_maxlevels(mp); + /* * Check that the data (and log if separate) are an ok size. */ diff --git a/libxfs/xfs_ag_resv.c b/libxfs/xfs_ag_resv.c index b1392cda1..546f34e8b 100644 --- a/libxfs/xfs_ag_resv.c +++ b/libxfs/xfs_ag_resv.c @@ -90,7 +90,8 @@ xfs_ag_resv_critical( trace_xfs_ag_resv_critical(pag, type, avail); /* Critically low if less than 10% or max btree height remains. */ - return XFS_TEST_ERROR(avail < orig / 10 || avail < XFS_BTREE_MAXLEVELS, + return XFS_TEST_ERROR(avail < orig / 10 || + avail < pag->pag_mount->m_agbtree_maxlevels, pag->pag_mount, XFS_ERRTAG_AG_RESV_CRITICAL); }