• Zheng Bin's avatar
    xfs: add agf freeblocks verify in xfs_agf_verify · d0c7feaf
    Zheng Bin authored
    We recently used fuzz(hydra) to test XFS and automatically generate
    tmp.img(XFS v5 format, but some metadata is wrong)
    
    xfs_repair information(just one AG):
    agf_freeblks 0, counted 3224 in ag 0
    agf_longest 536874136, counted 3224 in ag 0
    sb_fdblocks 613, counted 3228
    
    Test as follows:
    mount tmp.img tmpdir
    cp file1M tmpdir
    sync
    
    In 4.19-stable, sync will stuck, the reason is:
    xfs_mountfs
      xfs_check_summary_counts
        if ((!xfs_sb_version_haslazysbcount(&mp->m_sb) ||
           XFS_LAST_UNMOUNT_WAS_CLEAN(mp)) &&
           !xfs_fs_has_sickness(mp, XFS_SICK_FS_COUNTERS))
    	return 0;  -->just return, incore sb_fdblocks still be 613
        xfs_initialize_perag_data
    
    cp file1M tmpdir -->ok(write file to pagecache)
    sync -->stuck(write pagecache to disk)
    xfs_map_blocks
      xfs_iomap_write_allocate
        while (count_fsb != 0) {
          nimaps = 0;
          while (nimaps == 0) { --> endless loop
             nimaps = 1;
             xfs_bmapi_write(..., &nimaps) --> nimaps becomes 0 again
    xfs_bmapi_write
      xfs_bmap_alloc
        xfs_bmap_btalloc
          xfs_alloc_vextent
            xfs_alloc_fix_freelist
              xfs_alloc_space_available -->fail(agf_freeblks is 0)
    
    In linux-next, sync not stuck, cause commit c2b31643 ("xfs:
    use the latest extent at writeback delalloc conversion time") remove
    the above while, dmesg is as follows:
    [   55.250114] XFS (loop0): page discard on page ffffea0008bc7380, inode 0x1b0c, offset 0.
    
    Users do not know why this page is discard, the better soultion is:
    1. Like xfs_repair, make sure sb_fdblocks is equal to counted
    (xfs_initialize_perag_data did this, who is not called at this mount)
    2. Add agf verify, if fail, will tell users to repair
    
    This patch use the second soultion.
    Signed-off-by: default avatarZheng Bin <zhengbin13@huawei.com>
    Signed-off-by: default avatarRen Xudong <renxudong1@huawei.com>
    Reviewed-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    Signed-off-by: default avatarDarrick J. Wong <darrick.wong@oracle.com>
    d0c7feaf
xfs_alloc.c 91.7 KB