• Darrick J. Wong's avatar
    xfs: fix agf_fllast when repairing an empty AGFL · a634c0a6
    Darrick J. Wong authored
    xfs/139 with parent pointers enabled occasionally pops up a corruption
    message when online fsck force-rebuild repairs an AGFL:
    
     XFS (sde): Metadata corruption detected at xfs_agf_verify+0x11e/0x220 [xfs], xfs_agf block 0x9e0001
     XFS (sde): Unmount and run xfs_repair
     XFS (sde): First 128 bytes of corrupted metadata buffer:
     00000000: 58 41 47 46 00 00 00 01 00 00 00 4f 00 00 40 00  XAGF.......O..@.
     00000010: 00 00 00 01 00 00 00 02 00 00 00 05 00 00 00 01  ................
     00000020: 00 00 00 01 00 00 00 01 00 00 00 00 ff ff ff ff  ................
     00000030: 00 00 00 00 00 00 00 05 00 00 00 05 00 00 00 00  ................
     00000040: 91 2e 6f b1 ed 61 4b 4d 8c 9b 6e 87 08 bb f6 36  ..o..aKM..n....6
     00000050: 00 00 00 01 00 00 00 01 00 00 00 06 00 00 00 01  ................
     00000060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
     00000070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  ................
    
    The root cause of this failure is that prior to the repair, there were
    zero blocks in the AGFL.  This scenario is set up by the test case, since
    it formats with 64MB AGs and tries to ENOSPC the whole filesystem.  In
    this case of flcount==0, we reset fllast to -1U, which then trips the
    write verifier's check that fllast is less than xfs_agfl_size().
    
    Correct this code to set fllast to the last possible slot in the AGFL
    when flcount is zero, which mirrors the behavior of xfs_repair phase5
    when it has to create a totally empty AGFL.
    
    Fixes: 0e93d3f4 ("xfs: repair the AGFL")
    Signed-off-by: default avatarDarrick J. Wong <djwong@kernel.org>
    Reviewed-by: default avatarDave Chinner <dchinner@redhat.com>
    a634c0a6
agheader_repair.c 26.8 KB