• Darrick J. Wong's avatar
    xfs: clear incore AGFL_RESET state if it's not needed · e2e63b07
    Darrick J. Wong authored
    Prior to commit 7ac2ff8b, when we loaded the incore perag structure
    with information from the AGF header, we would set or clear the
    pagf_agfl_reset field based on whether or not the AGFL list was
    misaligned within the block.  IOWs, it's an incore state bit that's
    supposed to cache something in the ondisk metadata.  Therefore, the code
    still needs to support clearing the incore bit if (somehow) the AGFL
    were to correct itself.
    
    It turns out that xfs_repair does exactly this -- phase 4 loads the AGF
    to scan the rmapbt for corrupt records, which can set NEEDS_AGFL_RESET.
    The scan unsets AGF_INIT but doesn't unset NEEDS_AGFL_RESET.  Phase 5
    totally rewrites the AGFL and fixes the alignment problem, didn't clear
    NEEDS_AGFL_RESET historically, and reloads the perag state to fix the
    freelist.  This results in the AGFL being reset based on stale data,
    which then causes the new AGFL blocks to be leaked.  A subsequent
    xfs_repair -n then complains about the leaks.
    
    One could argue that phase 5 ought to clear this bit directly when it
    reloads the perag AGF data after rewriting the AGFL, but libxfs used to
    handle this for us, so it should go back to doing that.
    
    Found by fuzzing flfirst = ones in xfs/352.
    
    Fixes: 7ac2ff8b ("xfs: perags need atomic operational state")
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    e2e63b07
xfs_alloc.c 99.7 KB