• Brian Foster's avatar
    xfs: terminate perag iteration reliably on agcount · 8ed004eb
    Brian Foster authored
    The for_each_perag_from() iteration macro relies on sb_agcount to
    process every perag currently within EOFS from a given starting
    point. It's perfectly valid to have perag structures beyond
    sb_agcount, however, such as if a growfs is in progress. If a perag
    loop happens to race with growfs in this manner, it will actually
    attempt to process the post-EOFS perag where ->pag_agno ==
    sb_agcount. This is reproduced by xfs/104 and manifests as the
    following assert failure in superblock write verifier context:
    
     XFS: Assertion failed: agno < mp->m_sb.sb_agcount, file: fs/xfs/libxfs/xfs_types.c, line: 22
    
    Update the corresponding macro to only process perags that are
    within the current sb_agcount.
    
    Fixes: 58d43a7e ("xfs: pass perags around in fsmap data dev functions")
    Signed-off-by: default avatarBrian Foster <bfoster@redhat.com>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    Reviewed-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    8ed004eb
xfs_ag.h 5.9 KB