@@ -303,10 +303,13 @@ xfs_ag_resv_init(
}
#ifdef DEBUG
- /* need to read in the AGF for the ASSERT below to work */
- error = xfs_alloc_pagf_init(pag->pag_mount, tp, pag->pag_agno, 0);
- if (error)
- return error;
+ if (!pag->pagf_init) {
+ /* need to read in the AGF for the ASSERT below to work */
+ error = xfs_alloc_pagf_init(pag->pag_mount, tp,
+ pag->pag_agno, 0);
+ if (error)
+ return error;
+ }
ASSERT(xfs_perag_resv(pag, XFS_AG_RESV_METADATA)->ar_reserved +
xfs_perag_resv(pag, XFS_AG_RESV_RMAPBT)->ar_reserved <=
@@ -594,39 +594,6 @@ xfs_check_summary_counts(
return -EFSCORRUPTED;
}
- /*
- * Now the log is mounted, we know if it was an unclean shutdown or
- * not. If it was, with the first phase of recovery has completed, we
- * have consistent AG blocks on disk. We have not recovered EFIs yet,
- * but they are recovered transactionally in the second recovery phase
- * later.
- *
- * If the log was clean when we mounted, we can check the summary
- * counters. If any of them are obviously incorrect, we can recompute
- * them from the AGF headers in the next step.
- */
- if (XFS_LAST_UNMOUNT_WAS_CLEAN(mp) &&
- (mp->m_sb.sb_fdblocks > mp->m_sb.sb_dblocks ||
- !xfs_verify_icount(mp, mp->m_sb.sb_icount) ||
- mp->m_sb.sb_ifree > mp->m_sb.sb_icount))
- xfs_fs_mark_sick(mp, XFS_SICK_FS_COUNTERS);
-
- /*
- * We can safely re-initialise incore superblock counters from the
- * per-ag data. These may not be correct if the filesystem was not
- * cleanly unmounted, so we waited for recovery to finish before doing
- * this.
- *
- * If the filesystem was cleanly unmounted or the previous check did
- * not flag anything weird, then we can trust the values in the
- * superblock to be correct and we don't need to do anything here.
- * Otherwise, recalculate the summary counters.
- */
- 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;
-
return xfs_initialize_perag_data(mp, mp->m_sb.sb_agcount);
}
Use 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 0, counted 3224 in ag 0 sb_fdblocks 3228, counted 3224 Test as follows: mount tmp.img tmpdir cp file1M tmpdir sync In 4.19-stable, sync will stuck, while in linux-next, sync not stuck. The reason is same to commit d0c7feaf8767 ("xfs: add agf freeblocks verify in xfs_agf_verify"), cause agf_longest is 0, we can not block this in xfs_agf_verify. Make sure fdblocks is always inited in mount(also init ifree, icount). xfs_mountfs xfs_check_summary_counts xfs_initialize_perag_data Signed-off-by: Zheng Bin <zhengbin13@huawei.com> --- fs/xfs/libxfs/xfs_ag_resv.c | 11 +++++++---- fs/xfs/xfs_mount.c | 33 --------------------------------- 2 files changed, 7 insertions(+), 37 deletions(-) -- 2.7.4