@@ -3220,7 +3220,7 @@ xfs_alloc_vextent(
args->maxlen = agsize;
if (args->alignment == 0)
args->alignment = 1;
- ASSERT(XFS_FSB_TO_AGNO(mp, args->fsbno) < mp->m_sb.sb_agcount);
+ ASSERT(XFS_FSB_TO_AGNO(mp, args->fsbno) < mp->m_maxagcount);
ASSERT(XFS_FSB_TO_AGBNO(mp, args->fsbno) < agsize);
ASSERT(args->minlen <= args->maxlen);
ASSERT(args->minlen <= agsize);
@@ -350,7 +350,7 @@ xfs_bmap_check_leaf_extents(
bno = be64_to_cpu(*pp);
ASSERT(bno != NULLFSBLOCK);
- ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_sb.sb_agcount);
+ ASSERT(XFS_FSB_TO_AGNO(mp, bno) < mp->m_maxagcount);
ASSERT(XFS_FSB_TO_AGBNO(mp, bno) < mp->m_sb.sb_agblocks);
/*
@@ -546,7 +546,7 @@ __xfs_bmap_add_free(
ASSERT(!isnullstartblock(bno));
agno = XFS_FSB_TO_AGNO(mp, bno);
agbno = XFS_FSB_TO_AGBNO(mp, bno);
- ASSERT(agno < mp->m_sb.sb_agcount);
+ ASSERT(agno < mp->m_maxagcount);
ASSERT(agbno < mp->m_sb.sb_agblocks);
ASSERT(len < mp->m_sb.sb_agblocks);
ASSERT(agbno + len <= mp->m_sb.sb_agblocks);
@@ -3129,7 +3129,7 @@ xfs_bmap_adjacent(
(rt ? \
(x) < mp->m_sb.sb_rblocks : \
XFS_FSB_TO_AGNO(mp, x) == XFS_FSB_TO_AGNO(mp, y) && \
- XFS_FSB_TO_AGNO(mp, x) < mp->m_sb.sb_agcount && \
+ XFS_FSB_TO_AGNO(mp, x) < mp->m_maxagcount && \
XFS_FSB_TO_AGBNO(mp, x) < mp->m_sb.sb_agblocks)
mp = ap->ip->i_mount;
@@ -3353,7 +3353,7 @@ xfs_bmap_btalloc_nullfb(
if (error)
return error;
- if (++ag == mp->m_sb.sb_agcount)
+ if (++ag == mp->m_maxagcount)
ag = 0;
if (ag == startag)
break;
@@ -1852,7 +1852,7 @@ xfs_dialloc_select_ag(
nextag:
up_read(&pag->pag_inactive_rwsem);
xfs_perag_put(pag);
- if (++agno == mp->m_sb.sb_agcount)
+ if (++agno == mp->m_maxagcount)
agno = 0;
if (agno == start_agno)
return noroom ? -ENOSPC : 0;
@@ -807,6 +807,7 @@ xfs_sb_mount_common(
struct xfs_sb *sbp)
{
mp->m_agfrotor = mp->m_agirotor = 0;
+ mp->m_maxagcount = mp->m_sb.sb_agcount;
mp->m_maxagi = mp->m_sb.sb_agcount;
mp->m_blkbit_log = sbp->sb_blocklog + XFS_NBBYLOG;
mp->m_blkbb_log = sbp->sb_blocklog - BBSHIFT;
@@ -608,7 +608,7 @@ xfs_extent_busy_wait_all(
DEFINE_WAIT (wait);
xfs_agnumber_t agno;
- for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
+ for (agno = 0; agno < mp->m_maxagcount; agno++) {
struct xfs_perag *pag = xfs_perag_get(mp, agno);
do {
@@ -141,7 +141,7 @@ xfs_free_perag(
xfs_agnumber_t agno;
struct xfs_perag *pag;
- for (agno = 0; agno < mp->m_sb.sb_agcount; agno++) {
+ for (agno = 0; agno < mp->m_maxagcount; agno++) {
spin_lock(&mp->m_perag_lock);
pag = radix_tree_delete(&mp->m_perag_tree, agno);
spin_unlock(&mp->m_perag_lock);
@@ -633,7 +633,7 @@ xfs_check_summary_counts(
!xfs_fs_has_sickness(mp, XFS_SICK_FS_COUNTERS))
return 0;
- return xfs_initialize_perag_data(mp, mp->m_sb.sb_agcount);
+ return xfs_initialize_perag_data(mp, mp->m_maxagcount);
}
/*
@@ -192,6 +192,7 @@ typedef struct xfs_mount {
*/
struct work_struct m_flush_inodes_work;
+ xfs_agnumber_t m_maxagcount;
/*
* Generation of the filesysyem layout. This is incremented by each
* growfs, and used by the pNFS server to ensure the client updates
@@ -632,6 +632,8 @@ xfs_trans_unreserve_and_mod_sb(
mp->m_sb.sb_frextents += rtxdelta;
mp->m_sb.sb_dblocks += tp->t_dblocks_delta;
mp->m_sb.sb_agcount += tp->t_agcount_delta;
+ if (mp->m_sb.sb_agcount > mp->m_maxagcount)
+ mp->m_maxagcount = mp->m_sb.sb_agcount;
mp->m_sb.sb_imax_pct += tp->t_imaxpct_delta;
mp->m_sb.sb_rextsize += tp->t_rextsize_delta;
mp->m_sb.sb_rbmblocks += tp->t_rbmblocks_delta;
After shrinking, some inactive AGs won't be valid anymore except that these perags are still here. Introduce a new m_maxagcount mainly used for freeing all perags. Signed-off-by: Gao Xiang <hsiangkao@redhat.com> --- fs/xfs/libxfs/xfs_alloc.c | 2 +- fs/xfs/libxfs/xfs_bmap.c | 8 ++++---- fs/xfs/libxfs/xfs_ialloc.c | 2 +- fs/xfs/libxfs/xfs_sb.c | 1 + fs/xfs/xfs_extent_busy.c | 2 +- fs/xfs/xfs_mount.c | 4 ++-- fs/xfs/xfs_mount.h | 1 + fs/xfs/xfs_trans.c | 2 ++ 8 files changed, 13 insertions(+), 9 deletions(-)